From eaa044d1147e26b82942ce56d5965c83fdddf069 Mon Sep 17 00:00:00 2001 From: statinfo Date: Mon, 25 May 2020 11:38:47 +0200 Subject: [PATCH] =?utf8?q?premi=C3=A8re=20mise=20=C3=A0=20jour=20pour=20py?= =?utf8?q?thon=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit nombreuses modifications pour tenir compte des changements dans python 3 et dans les modules wx --- HTML.py | 987 +- INSTALL_WINDOWS | 28 - KeyFrame.py | 74 +- Liste.py | 185 +- OptionAlceste.py | 122 +- PrintRScript.py | 528 +- ProfList.py | 240 +- Rlib/textometrieR/DESCRIPTION | 14 - Rlib/textometrieR/NAMESPACE | 7 - Rlib/textometrieR/Read-and-delete-me | 9 - Rlib/textometrieR/cgt75.R | 4 - Rlib/textometrieR/cgt75.splitted.txt | 39240 ------------------- Rlib/textometrieR/cgt75.txt | 4412 --- Rlib/textometrieR/data/bfm.R | 4 - Rlib/textometrieR/data/corpus.tiny.cooccurrences.R | 1 - Rlib/textometrieR/data/robespierre.R | 17 - Rlib/textometrieR/inst/CITATION | 14 - Rlib/textometrieR/man/bfm.Rd | 28 - Rlib/textometrieR/man/cooccurrences.Rd | 30 - Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd | 35 - Rlib/textometrieR/man/pareto.Rd | 21 - Rlib/textometrieR/man/robespierre.Rd | 45 - Rlib/textometrieR/man/specificites.Rd | 58 - Rlib/textometrieR/man/specificites.lexicon.Rd | 29 - .../man/specificites.lexicon.probabilities.Rd | 28 - .../textometrieR/man/specificites.probabilities.Rd | 30 - Rlib/textometrieR/man/textometrieR-package.Rd | 53 - Rlib/textometrieR/tests/.RData | Bin 2221 -> 0 bytes Rlib/textometrieR/tests/author.xls | Bin 24576 -> 0 bytes Rlib/textometrieR/tests/authors | 14 - Rlib/textometrieR/tests/bfmrepartition.R | 29 - Rlib/textometrieR/tests/ca.R | 20 - Rlib/textometrieR/tests/specificites.R | 4 - Rlib/textometrieR/tests/specificites.Rout.save | 40 - Rlib/textometrieR/tests/specificites.lexicon.new.R | 8 - .../tests/specificites.probabilities.R | 4 - .../tests/specificites.probabilities.Rout.save | 41 - Rscripts/CHD.R | 2 +- Rscripts/CHD.R.old | 245 - Rscripts/CHDKmeans.R | 2 +- Rscripts/CHDPOND.R | 2 +- Rscripts/afc_graph.R | 2 +- Rscripts/afc_lex.R | 2 +- Rscripts/chd.R.notuse | 87 - Rscripts/chdquest.R | 2 +- Rscripts/chdtxt.R | 2 +- Rscripts/distance-labbe.R | 2 +- analyse_merge.py | 22 +- analysematrix.py | 28 +- analysetxt.py | 69 +- app.fil | 67 - aui/__init__.py | 290 - aui/aui_constants.py | 2588 -- aui/aui_switcherdialog.py | 1216 - aui/aui_utilities.py | 678 - aui/auibar.py | 3926 -- aui/auibook.py | 5737 --- aui/dockart.py | 1162 - aui/framemanager.py | 10385 ----- aui/tabart.py | 2777 -- aui/tabmdi.py | 666 - autres/CHD.R.old | 245 + autres/INSTALL_WINDOWS | 28 + autres/Rlib/textometrieR/DESCRIPTION | 14 + autres/Rlib/textometrieR/NAMESPACE | 7 + autres/Rlib/textometrieR/Read-and-delete-me | 9 + autres/Rlib/textometrieR/cgt75.R | 4 + autres/Rlib/textometrieR/cgt75.splitted.txt | 39240 +++++++++++++++++++ autres/Rlib/textometrieR/cgt75.txt | 4412 +++ autres/Rlib/textometrieR/data/bfm.R | 4 + .../textometrieR/data/corpus.tiny.cooccurrences.R | 1 + autres/Rlib/textometrieR/data/robespierre.R | 17 + autres/Rlib/textometrieR/inst/CITATION | 14 + autres/Rlib/textometrieR/man/bfm.Rd | 28 + autres/Rlib/textometrieR/man/cooccurrences.Rd | 30 + .../textometrieR/man/corpus.tiny.cooccurrences.Rd | 35 + autres/Rlib/textometrieR/man/pareto.Rd | 21 + autres/Rlib/textometrieR/man/robespierre.Rd | 45 + autres/Rlib/textometrieR/man/specificites.Rd | 58 + .../Rlib/textometrieR/man/specificites.lexicon.Rd | 29 + .../man/specificites.lexicon.probabilities.Rd | 28 + .../textometrieR/man/specificites.probabilities.Rd | 30 + .../Rlib/textometrieR/man/textometrieR-package.Rd | 53 + autres/Rlib/textometrieR/tests/.RData | Bin 0 -> 2221 bytes autres/Rlib/textometrieR/tests/author.xls | Bin 0 -> 24576 bytes autres/Rlib/textometrieR/tests/authors | 14 + autres/Rlib/textometrieR/tests/bfmrepartition.R | 29 + autres/Rlib/textometrieR/tests/ca.R | 20 + autres/Rlib/textometrieR/tests/specificites.R | 4 + .../Rlib/textometrieR/tests/specificites.Rout.save | 40 + .../textometrieR/tests/specificites.lexicon.new.R | 8 + .../tests/specificites.probabilities.R | 4 + .../tests/specificites.probabilities.Rout.save | 41 + autres/app.fil | 67 + autres/aui/__init__.py | 290 + autres/aui/aui_constants.py | 2588 ++ autres/aui/aui_switcherdialog.py | 1216 + autres/aui/aui_utilities.py | 678 + autres/aui/auibar.py | 3926 ++ autres/aui/auibook.py | 5737 +++ autres/aui/dockart.py | 1162 + autres/aui/framemanager.py | 10385 +++++ autres/aui/tabart.py | 2777 ++ autres/aui/tabmdi.py | 666 + autres/bestsvg.py | 33 + autres/build_dictionnaries.py | 193 + autres/cable.py | 68 + autres/chd.R.notuse | 87 + autres/debian/README | 6 + autres/debian/README.Debian | 6 + autres/debian/changelog | 5 + autres/debian/compat | 1 + autres/debian/control | 12 + autres/debian/copyright | 38 + autres/debian/dirs | 4 + autres/debian/docs | 3 + autres/debian/files | 1 + autres/debian/iramuteq.debhelper.log | 14 + autres/debian/rules | 121 + autres/extract.py | 73 + autres/formes.db | Bin 0 -> 3072 bytes autres/iracmd.py | 190 + autres/iramuteq | 2 + autres/iramuteq.desktop | 8 + autres/iramuteq_en.po | 1059 + autres/iramuteqsvn.desktop | 8 + autres/iraopen.py | 128 + autres/liste modules python.ods | Bin 0 -> 7506 bytes autres/liste modules python.xlsx | Bin 0 -> 15621 bytes autres/messages.pot | 1560 + autres/mki18n.py | 459 + autres/network_to_blender.py | 198 + autres/newsimi.py | 23 + autres/parse_factiva_html.py | 111 + autres/putcorpusindb.py | 80 + autres/setup.py.win | 50 + autres/tabstudent.py | 339 + autres/testdecoupe.txt | 8901 +++++ autres/textafcuci.py | 121 + autres/textdist.py | 223 + autres/ttparser.py | 251 + autres/uces.db | Bin 0 -> 2048 bytes autres/usecorpusNG.py | 28 + autres/word_stat.py | 26 + bestsvg.py | 26 - build_dictionnaries.py | 190 - cable.py | 62 - checkinstall.py | 48 +- checkversion.py | 35 +- chemins.py | 26 +- colors.py | 6 + configparser.py | 403 +- configparser_helpers.py | 52 +- configuration/global.cfg | 4 +- configuration/iramuteq.cfg | 2 +- configuration/simitxt.cfg | 1 - corpus.py | 279 +- debian/README | 6 - debian/README.Debian | 6 - debian/changelog | 5 - debian/compat | 1 - debian/control | 12 - debian/copyright | 38 - debian/dirs | 4 - debian/docs | 3 - debian/files | 1 - debian/iramuteq.debhelper.log | 14 - debian/rules | 121 - dialog.py | 1486 +- extract.py | 73 - formes.db | Bin 3072 -> 0 bytes functions.py | 310 +- graph_to_json.py | 17 +- guifunct.py | 179 +- guiparam3d.py | 53 +- import_txm.py | 24 +- iracmd.py | 190 - iramuteq | 2 - iramuteq.desktop | 8 - iramuteq.py | 929 +- iramuteq_en.po | 1059 - iramuteq_fr_FR.po | 1597 - iramuteqsvn.desktop | 8 - iraopen.py | 128 - langue.py | 104 + layout.py | 619 +- listlex.py | 159 +- locale/fr_FR/LC_MESSAGES/iramuteq.mo | Bin 23627 -> 23614 bytes locale/fr_FR/LC_MESSAGES/iramuteq.po | 1601 + mergeclustergraph.py | 60 +- messages.pot | 1560 - mki18n.py | 457 - network_to_blender.py | 219 - newsimi.py | 23 - ooolib.py | 3734 +- openanalyse.py | 23 +- parse_dmi.py | 82 +- parse_europress.py | 146 +- parse_factiva_html.py | 106 - parse_factiva_mail.py | 26 +- parse_factiva_txt.py | 101 +- parse_factiva_xml.py | 71 +- profile_segment.py | 48 +- putcorpusindb.py | 72 - search_list.py | 93 +- search_tools.py | 31 +- setup.py | 7 +- setup.py.win | 50 - sheet.py | 13 +- tabafcm.py | 38 +- tabchdalc.py | 80 +- tabchddist.py | 87 +- tabchi2.py | 118 +- tabchi2mcnemar.py | 111 +- tabfrequence.py | 58 +- tableau.py | 99 +- tabrsimple.py | 37 +- tabsimi.py | 58 +- tabsplitvar.py | 29 +- tabstudent.py | 340 - tabverges.py | 38 +- testdecoupe.txt | 8901 ----- textafcuci.py | 122 - textaslexico.py | 59 +- textcheckcorpus.py | 42 +- textclassechd.py | 14 +- textdist.py | 217 - textlabbe.py | 42 +- textreinert.py | 47 +- textsimi.py | 61 +- textstat.py | 62 +- textwordcloud.py | 62 +- tools.py | 66 +- tree.py | 383 +- ttparser.py | 251 - uces.db | Bin 2048 -> 0 bytes usecorpusNG.py | 28 - vitemspicker.py | 91 +- webexport.py | 15 +- word_stat.py | 29 - 240 files changed, 96517 insertions(+), 96677 deletions(-) delete mode 100644 INSTALL_WINDOWS delete mode 100644 Rlib/textometrieR/DESCRIPTION delete mode 100644 Rlib/textometrieR/NAMESPACE delete mode 100644 Rlib/textometrieR/Read-and-delete-me delete mode 100644 Rlib/textometrieR/cgt75.R delete mode 100644 Rlib/textometrieR/cgt75.splitted.txt delete mode 100644 Rlib/textometrieR/cgt75.txt delete mode 100644 Rlib/textometrieR/data/bfm.R delete mode 100644 Rlib/textometrieR/data/corpus.tiny.cooccurrences.R delete mode 100644 Rlib/textometrieR/data/robespierre.R delete mode 100644 Rlib/textometrieR/inst/CITATION delete mode 100644 Rlib/textometrieR/man/bfm.Rd delete mode 100644 Rlib/textometrieR/man/cooccurrences.Rd delete mode 100644 Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd delete mode 100644 Rlib/textometrieR/man/pareto.Rd delete mode 100644 Rlib/textometrieR/man/robespierre.Rd delete mode 100644 Rlib/textometrieR/man/specificites.Rd delete mode 100644 Rlib/textometrieR/man/specificites.lexicon.Rd delete mode 100644 Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd delete mode 100644 Rlib/textometrieR/man/specificites.probabilities.Rd delete mode 100644 Rlib/textometrieR/man/textometrieR-package.Rd delete mode 100644 Rlib/textometrieR/tests/.RData delete mode 100644 Rlib/textometrieR/tests/author.xls delete mode 100644 Rlib/textometrieR/tests/authors delete mode 100644 Rlib/textometrieR/tests/bfmrepartition.R delete mode 100644 Rlib/textometrieR/tests/ca.R delete mode 100644 Rlib/textometrieR/tests/specificites.R delete mode 100644 Rlib/textometrieR/tests/specificites.Rout.save delete mode 100644 Rlib/textometrieR/tests/specificites.lexicon.new.R delete mode 100644 Rlib/textometrieR/tests/specificites.probabilities.R delete mode 100644 Rlib/textometrieR/tests/specificites.probabilities.Rout.save delete mode 100644 Rscripts/CHD.R.old delete mode 100644 Rscripts/chd.R.notuse delete mode 100644 app.fil delete mode 100644 aui/__init__.py delete mode 100644 aui/aui_constants.py delete mode 100644 aui/aui_switcherdialog.py delete mode 100644 aui/aui_utilities.py delete mode 100644 aui/auibar.py delete mode 100644 aui/auibook.py delete mode 100644 aui/dockart.py delete mode 100644 aui/framemanager.py delete mode 100644 aui/tabart.py delete mode 100644 aui/tabmdi.py create mode 100644 autres/CHD.R.old create mode 100644 autres/INSTALL_WINDOWS create mode 100644 autres/Rlib/textometrieR/DESCRIPTION create mode 100644 autres/Rlib/textometrieR/NAMESPACE create mode 100644 autres/Rlib/textometrieR/Read-and-delete-me create mode 100644 autres/Rlib/textometrieR/cgt75.R create mode 100644 autres/Rlib/textometrieR/cgt75.splitted.txt create mode 100644 autres/Rlib/textometrieR/cgt75.txt create mode 100644 autres/Rlib/textometrieR/data/bfm.R create mode 100644 autres/Rlib/textometrieR/data/corpus.tiny.cooccurrences.R create mode 100644 autres/Rlib/textometrieR/data/robespierre.R create mode 100644 autres/Rlib/textometrieR/inst/CITATION create mode 100644 autres/Rlib/textometrieR/man/bfm.Rd create mode 100644 autres/Rlib/textometrieR/man/cooccurrences.Rd create mode 100644 autres/Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd create mode 100644 autres/Rlib/textometrieR/man/pareto.Rd create mode 100644 autres/Rlib/textometrieR/man/robespierre.Rd create mode 100644 autres/Rlib/textometrieR/man/specificites.Rd create mode 100644 autres/Rlib/textometrieR/man/specificites.lexicon.Rd create mode 100644 autres/Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd create mode 100644 autres/Rlib/textometrieR/man/specificites.probabilities.Rd create mode 100644 autres/Rlib/textometrieR/man/textometrieR-package.Rd create mode 100644 autres/Rlib/textometrieR/tests/.RData create mode 100644 autres/Rlib/textometrieR/tests/author.xls create mode 100644 autres/Rlib/textometrieR/tests/authors create mode 100644 autres/Rlib/textometrieR/tests/bfmrepartition.R create mode 100644 autres/Rlib/textometrieR/tests/ca.R create mode 100644 autres/Rlib/textometrieR/tests/specificites.R create mode 100644 autres/Rlib/textometrieR/tests/specificites.Rout.save create mode 100644 autres/Rlib/textometrieR/tests/specificites.lexicon.new.R create mode 100644 autres/Rlib/textometrieR/tests/specificites.probabilities.R create mode 100644 autres/Rlib/textometrieR/tests/specificites.probabilities.Rout.save create mode 100644 autres/app.fil create mode 100644 autres/aui/__init__.py create mode 100644 autres/aui/aui_constants.py create mode 100644 autres/aui/aui_switcherdialog.py create mode 100644 autres/aui/aui_utilities.py create mode 100644 autres/aui/auibar.py create mode 100644 autres/aui/auibook.py create mode 100644 autres/aui/dockart.py create mode 100644 autres/aui/framemanager.py create mode 100644 autres/aui/tabart.py create mode 100644 autres/aui/tabmdi.py create mode 100644 autres/bestsvg.py create mode 100644 autres/build_dictionnaries.py create mode 100644 autres/cable.py create mode 100644 autres/chd.R.notuse create mode 100644 autres/debian/README create mode 100644 autres/debian/README.Debian create mode 100644 autres/debian/changelog create mode 100644 autres/debian/compat create mode 100644 autres/debian/control create mode 100644 autres/debian/copyright create mode 100644 autres/debian/dirs create mode 100644 autres/debian/docs create mode 100644 autres/debian/files create mode 100644 autres/debian/iramuteq.debhelper.log create mode 100755 autres/debian/rules create mode 100644 autres/extract.py create mode 100644 autres/formes.db create mode 100644 autres/iracmd.py create mode 100755 autres/iramuteq create mode 100644 autres/iramuteq.desktop create mode 100644 autres/iramuteq_en.po create mode 100644 autres/iramuteqsvn.desktop create mode 100644 autres/iraopen.py create mode 100644 autres/liste modules python.ods create mode 100644 autres/liste modules python.xlsx create mode 100644 autres/messages.pot create mode 100644 autres/mki18n.py create mode 100644 autres/network_to_blender.py create mode 100644 autres/newsimi.py create mode 100644 autres/parse_factiva_html.py create mode 100644 autres/putcorpusindb.py create mode 100644 autres/setup.py.win create mode 100644 autres/tabstudent.py create mode 100644 autres/testdecoupe.txt create mode 100644 autres/textafcuci.py create mode 100644 autres/textdist.py create mode 100644 autres/ttparser.py create mode 100644 autres/uces.db create mode 100644 autres/usecorpusNG.py create mode 100644 autres/word_stat.py delete mode 100644 bestsvg.py delete mode 100644 build_dictionnaries.py delete mode 100644 cable.py mode change 100755 => 100644 corpus.py delete mode 100644 debian/README delete mode 100644 debian/README.Debian delete mode 100644 debian/changelog delete mode 100644 debian/compat delete mode 100644 debian/control delete mode 100644 debian/copyright delete mode 100644 debian/dirs delete mode 100644 debian/docs delete mode 100644 debian/files delete mode 100644 debian/iramuteq.debhelper.log delete mode 100755 debian/rules delete mode 100644 extract.py delete mode 100644 formes.db delete mode 100644 iracmd.py delete mode 100755 iramuteq delete mode 100644 iramuteq.desktop delete mode 100644 iramuteq_en.po delete mode 100644 iramuteq_fr_FR.po delete mode 100644 iramuteqsvn.desktop delete mode 100644 iraopen.py create mode 100644 langue.py create mode 100644 locale/fr_FR/LC_MESSAGES/iramuteq.po delete mode 100644 messages.pot delete mode 100644 mki18n.py delete mode 100644 network_to_blender.py delete mode 100644 newsimi.py delete mode 100644 parse_factiva_html.py delete mode 100644 putcorpusindb.py delete mode 100644 setup.py.win delete mode 100644 tabstudent.py delete mode 100644 testdecoupe.txt delete mode 100644 textafcuci.py delete mode 100644 textdist.py delete mode 100644 ttparser.py delete mode 100644 uces.db delete mode 100644 usecorpusNG.py delete mode 100644 word_stat.py diff --git a/HTML.py b/HTML.py index b03c0a2..012b064 100644 --- a/HTML.py +++ b/HTML.py @@ -1,493 +1,494 @@ -#!/usr/bin/python -# -*- coding: iso-8859-1 -*- -""" -HTML.py - v0.04 2009-07-28 Philippe Lagadec - -This module provides a few classes to easily generate HTML code such as tables -and lists. - -Project website: http://www.decalage.info/python/html - -License: CeCILL (open-source GPL compatible), see source code for details. - http://www.cecill.info -""" - -__version__ = '0.04' -__date__ = '2009-07-28' -__author__ = 'Philippe Lagadec' - -#--- LICENSE ------------------------------------------------------------------ - -# Copyright Philippe Lagadec - see http://www.decalage.info/contact for contact info -# -# This module provides a few classes to easily generate HTML tables and lists. -# -# This software is governed by the CeCILL license under French law and -# abiding by the rules of distribution of free software. You can use, -# modify and/or redistribute the software under the terms of the CeCILL -# license as circulated by CEA, CNRS and INRIA at the following URL -# "http://www.cecill.info". -# -# A copy of the CeCILL license is also provided in these attached files: -# Licence_CeCILL_V2-en.html and Licence_CeCILL_V2-fr.html -# -# As a counterpart to the access to the source code and rights to copy, -# modify and redistribute granted by the license, users are provided only -# with a limited warranty and the software's author, the holder of the -# economic rights, and the successive licensors have only limited -# liability. -# -# In this respect, the user's attention is drawn to the risks associated -# with loading, using, modifying and/or developing or reproducing the -# software by the user in light of its specific status of free software, -# that may mean that it is complicated to manipulate, and that also -# therefore means that it is reserved for developers and experienced -# professionals having in-depth computer knowledge. Users are therefore -# encouraged to load and test the software's suitability as regards their -# requirements in conditions enabling the security of their systems and/or -# data to be ensured and, more generally, to use and operate it in the -# same conditions as regards security. -# -# The fact that you are presently reading this means that you have had -# knowledge of the CeCILL license and that you accept its terms. - - -#--- CHANGES ------------------------------------------------------------------ - -# 2008-10-06 v0.01 PL: - First version -# 2008-10-13 v0.02 PL: - added cellspacing and cellpadding to table -# - added functions to ease one-step creation of tables -# and lists -# 2009-07-21 v0.03 PL: - added column attributes and styles (first attempt) -# (thanks to an idea submitted by Michal Cernoevic) -# 2009-07-28 v0.04 PL: - improved column styles, workaround for Mozilla - - -#------------------------------------------------------------------------------- -#TODO: -# - method to return a generator (yield each row) instead of a single string -# - unicode support (input and output) -# - escape text in cells (optional) -# - constants for standard colors -# - use lxml to generate well-formed HTML ? -# - add classes/functions to generate a HTML page, paragraphs, headings, etc... - - -#--- THANKS -------------------------------------------------------------------- - -# - Michal Cernoevic, for the idea of column styles. - -#--- REFERENCES ---------------------------------------------------------------- - -# HTML 4.01 specs: http://www.w3.org/TR/html4/struct/tables.html - -# Colors: http://www.w3.org/TR/html4/types.html#type-color - -# Columns alignement and style, one of the oldest and trickiest bugs in Mozilla: -# https://bugzilla.mozilla.org/show_bug.cgi?id=915 - - -#--- CONSTANTS ----------------------------------------------------------------- - -# Table style to get thin black lines in Mozilla/Firefox instead of 3D borders -TABLE_STYLE_THINBORDER = "border: 1px solid #000000; border-collapse: collapse;" -#TABLE_STYLE_THINBORDER = "border: 1px solid #000000;" - - -#=== CLASSES =================================================================== - -class TableCell (object): - """ - a TableCell object is used to create a cell in a HTML table. (TD or TH) - - Attributes: - - text: text in the cell (may contain HTML tags). May be any object which - can be converted to a string using str(). - - header: bool, false for a normal data cell (TD), true for a header cell (TH) - - bgcolor: str, background color - - width: str, width - - align: str, horizontal alignement (left, center, right, justify or char) - - char: str, alignment character, decimal point if not specified - - charoff: str, see HTML specs - - valign: str, vertical alignment (top|middle|bottom|baseline) - - style: str, CSS style - - attribs: dict, additional attributes for the TD/TH tag - - Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.6 - """ - - def __init__(self, text="", bgcolor=None, header=False, width=None, - align=None, char=None, charoff=None, valign=None, style=None, - attribs=None): - """TableCell constructor""" - self.text = text - self.bgcolor = bgcolor - self.header = header - self.width = width - self.align = align - self.char = char - self.charoff = charoff - self.valign = valign - self.style = style - self.attribs = attribs - if attribs==None: - self.attribs = {} - - def __str__(self): - """return the HTML code for the table cell as a string""" - attribs_str = "" - if self.bgcolor: self.attribs['bgcolor'] = self.bgcolor - if self.width: self.attribs['width'] = self.width - if self.align: self.attribs['align'] = self.align - if self.char: self.attribs['char'] = self.char - if self.charoff: self.attribs['charoff'] = self.charoff - if self.valign: self.attribs['valign'] = self.valign - if self.style: self.attribs['style'] = self.style - for attr in self.attribs: - attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) - if self.text: - text = str(self.text) - else: - # An empty cell should at least contain a non-breaking space - text = ' ' - if self.header: - return ' %s\n' % (attribs_str, text) - else: - return ' %s\n' % (attribs_str, text) - -#------------------------------------------------------------------------------- - -class TableRow (object): - """ - a TableRow object is used to create a row in a HTML table. (TR tag) - - Attributes: - - cells: list, tuple or any iterable, containing one string or TableCell - object for each cell - - header: bool, true for a header row (TH), false for a normal data row (TD) - - bgcolor: str, background color - - col_align, col_valign, col_char, col_charoff, col_styles: see Table class - - attribs: dict, additional attributes for the TR tag - - Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.5 - """ - - def __init__(self, cells=None, bgcolor=None, header=False, attribs=None, - col_align=None, col_valign=None, col_char=None, - col_charoff=None, col_styles=None): - """TableCell constructor""" - self.bgcolor = bgcolor - self.cells = cells - self.header = header - self.col_align = col_align - self.col_valign = col_valign - self.col_char = col_char - self.col_charoff = col_charoff - self.col_styles = col_styles - self.attribs = attribs - if attribs==None: - self.attribs = {} - - def __str__(self): - """return the HTML code for the table row as a string""" - attribs_str = "" - if self.bgcolor: self.attribs['bgcolor'] = self.bgcolor - for attr in self.attribs: - attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) - result = ' \n' % attribs_str - for cell in self.cells: - col = self.cells.index(cell) # cell column index - if not isinstance(cell, TableCell): - cell = TableCell(cell, header=self.header) - # apply column alignment if specified: - if self.col_align and cell.align==None: - cell.align = self.col_align[col] - if self.col_char and cell.char==None: - cell.char = self.col_char[col] - if self.col_charoff and cell.charoff==None: - cell.charoff = self.col_charoff[col] - if self.col_valign and cell.valign==None: - cell.valign = self.col_valign[col] - # apply column style if specified: - if self.col_styles and cell.style==None: - cell.style = self.col_styles[col] - result += str(cell) - result += ' \n' - return result - -#------------------------------------------------------------------------------- - -class Table (object): - """ - a Table object is used to create a HTML table. (TABLE tag) - - Attributes: - - rows: list, tuple or any iterable, containing one iterable or TableRow - object for each row - - header_row: list, tuple or any iterable, containing the header row (optional) - - border: str or int, border width - - style: str, table style in CSS syntax (thin black borders by default) - - width: str, width of the table on the page - - attribs: dict, additional attributes for the TABLE tag - - col_width: list or tuple defining width for each column - - col_align: list or tuple defining horizontal alignment for each column - - col_char: list or tuple defining alignment character for each column - - col_charoff: list or tuple defining charoff attribute for each column - - col_valign: list or tuple defining vertical alignment for each column - - col_styles: list or tuple of HTML styles for each column - - Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.1 - """ - - def __init__(self, rows=None, border='1', style=None, width=None, - cellspacing=None, cellpadding=4, attribs=None, header_row=None, - col_width=None, col_align=None, col_valign=None, - col_char=None, col_charoff=None, col_styles=None): - """TableCell constructor""" - self.border = border - self.style = style - # style for thin borders by default - if style == None: self.style = TABLE_STYLE_THINBORDER - self.width = width - self.cellspacing = cellspacing - self.cellpadding = cellpadding - self.header_row = header_row - self.rows = rows - if not rows: self.rows = [] - self.attribs = attribs - if not attribs: self.attribs = {} - self.col_width = col_width - self.col_align = col_align - self.col_char = col_char - self.col_charoff = col_charoff - self.col_valign = col_valign - self.col_styles = col_styles - - def __str__(self): - """return the HTML code for the table as a string""" - attribs_str = "" - if self.border: self.attribs['border'] = self.border - if self.style: self.attribs['style'] = self.style - if self.width: self.attribs['width'] = self.width - if self.cellspacing: self.attribs['cellspacing'] = self.cellspacing - if self.cellpadding: self.attribs['cellpadding'] = self.cellpadding - for attr in self.attribs: - attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) - result = '\n' % attribs_str - # insert column tags and attributes if specified: - if self.col_width: - for width in self.col_width: - result += ' \n' % width - # The following code would also generate column attributes for style - # and alignement according to HTML4 specs, - # BUT it is not supported completely (only width) on Mozilla Firefox: - # see https://bugzilla.mozilla.org/show_bug.cgi?id=915 -## n_cols = max(len(self.col_styles), len(self.col_width), -## len(self.col_align), len(self.col_valign)) -## for i in range(n_cols): -## col = '' -## try: -## if self.col_styles[i]: -## col += ' style="%s"' % self.col_styles[i] -## except: pass -## try: -## if self.col_width[i]: -## col += ' width="%s"' % self.col_width[i] -## except: pass -## try: -## if self.col_align[i]: -## col += ' align="%s"' % self.col_align[i] -## except: pass -## try: -## if self.col_valign[i]: -## col += ' valign="%s"' % self.col_valign[i] -## except: pass -## result += '\n' % col - # First insert a header row if specified: - if self.header_row: - if not isinstance(self.header_row, TableRow): - result += str(TableRow(self.header_row, header=True)) - else: - result += str(self.header_row) - # Then all data rows: - for row in self.rows: - if not isinstance(row, TableRow): - row = TableRow(row) - # apply column alignments and styles to each row if specified: - # (Mozilla bug workaround) - if self.col_align and not row.col_align: - row.col_align = self.col_align - if self.col_char and not row.col_char: - row.col_char = self.col_char - if self.col_charoff and not row.col_charoff: - row.col_charoff = self.col_charoff - if self.col_valign and not row.col_valign: - row.col_valign = self.col_valign - if self.col_styles and not row.col_styles: - row.col_styles = self.col_styles - result += str(row) - result += '' - return result - - -#------------------------------------------------------------------------------- - -class List (object): - """ - a List object is used to create an ordered or unordered list in HTML. - (UL/OL tag) - - Attributes: - - lines: list, tuple or any iterable, containing one string for each line - - ordered: bool, choice between an ordered (OL) or unordered list (UL) - - attribs: dict, additional attributes for the OL/UL tag - - Reference: http://www.w3.org/TR/html4/struct/lists.html - """ - - def __init__(self, lines=None, ordered=False, start=None, attribs=None): - """List constructor""" - if lines: - self.lines = lines - else: - self.lines = [] - self.ordered = ordered - self.start = start - if attribs: - self.attribs = attribs - else: - self.attribs = {} - - def __str__(self): - """return the HTML code for the list as a string""" - attribs_str = "" - if self.start: self.attribs['start'] = self.start - for attr in self.attribs: - attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) - if self.ordered: tag = 'OL' - else: tag = 'UL' - result = '<%s%s>\n' % (tag, attribs_str) - for line in self.lines: - result += '
  • %s\n' % str(line) - result += '\n' % tag - return result - - -##class Link (object): -## """ -## a Link object is used to create link in HTML. ( tag) -## -## Attributes: -## - text: str, text of the link -## - url: str, URL of the link -## - attribs: dict, additional attributes for the A tag -## -## Reference: http://www.w3.org/TR/html4 -## """ -## -## def __init__(self, text, url=None, attribs=None): -## """Link constructor""" -## self.text = text -## self.url = url -## if attribs: -## self.attribs = attribs -## else: -## self.attribs = {} -## -## def __str__(self): -## """return the HTML code for the link as a string""" -## attribs_str = "" -## if self.url: self.attribs['href'] = self.url -## for attr in self.attribs: -## attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) -## return '%s' % (attribs_str, text) - - -#=== FUNCTIONS ================================================================ - -# much simpler definition of a link as a function: -def Link(text, url): - return '%s' % (url, text) - -def link(text, url): - return '%s' % (url, text) - -def table(*args, **kwargs): - 'return HTML code for a table as a string. See Table class for parameters.' - return str(Table(*args, **kwargs)) - -def list(*args, **kwargs): - 'return HTML code for a list as a string. See List class for parameters.' - return str(List(*args, **kwargs)) - - -#=== MAIN ===================================================================== - -# Show sample usage when this file is launched as a script. - -if __name__ == '__main__': - - # open an HTML file to show output in a browser - f = open('test.html', 'w') - - t = Table() - t.rows.append(TableRow(['A', 'B', 'C'], header=True)) - t.rows.append(TableRow(['D', 'E', 'F'])) - t.rows.append(('i', 'j', 'k')) - f.write(str(t) + '

    \n') - print str(t) - print '-'*79 - - t2 = Table([ - ('1', '2'), - ['3', '4'] - ], width='100%', header_row=('col1', 'col2'), - col_width=('', '75%')) - f.write(str(t2) + '

    \n') - print t2 - print '-'*79 - - t2.rows.append(['5', '6']) - t2.rows[1][1] = TableCell('new', bgcolor='red') - t2.rows.append(TableRow(['7', '8'], attribs={'align': 'center'})) - f.write(str(t2) + '

    \n') - print t2 - print '-'*79 - - # sample table with column attributes and styles: - table_data = [ - ['Smith', 'John', 30, 4.5], - ['Carpenter', 'Jack', 47, 7], - ['Johnson', 'Paul', 62, 10.55], - ] - htmlcode = HTML.table(table_data, - header_row = ['Last name', 'First name', 'Age', 'Score'], - col_width=['', '20%', '10%', '10%'], - col_align=['left', 'center', 'right', 'char'], - col_styles=['font-size: large', '', 'font-size: small', 'background-color:yellow']) - f.write(htmlcode + '

    \n') - print htmlcode - print '-'*79 - - def gen_table_squares(n): - """ - Generator to create table rows for integers from 1 to n - """ -## # First, header row: -## yield TableRow(('x', 'square(x)'), header=True, bgcolor='blue') -## # Then all rows: - for x in range(1, n+1): - yield (x, x*x) - - t = Table(rows=gen_table_squares(10), header_row=('x', 'square(x)')) - f.write(str(t) + '

    \n') - - print '-'*79 - l = List(['aaa', 'bbb', 'ccc']) - f.write(str(l) + '

    \n') - l.ordered = True - f.write(str(l) + '

    \n') - l.start=10 - f.write(str(l) + '

    \n') - - f.close() +# -*- coding: utf-8 -*- +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 + +""" +HTML.py - v0.04 2009-07-28 Philippe Lagadec + +This module provides a few classes to easily generate HTML code such as tables +and lists. + +Project website: http://www.decalage.info/python/html + +License: CeCILL (open-source GPL compatible), see source code for details. + http://www.cecill.info +""" + +__version__ = '0.04' +__date__ = '2009-07-28' +__author__ = 'Philippe Lagadec' + +#--- LICENSE ------------------------------------------------------------------ + +# Copyright Philippe Lagadec - see http://www.decalage.info/contact for contact info +# +# This module provides a few classes to easily generate HTML tables and lists. +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# A copy of the CeCILL license is also provided in these attached files: +# Licence_CeCILL_V2-en.html and Licence_CeCILL_V2-fr.html +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. + + +#--- CHANGES ------------------------------------------------------------------ + +# 2008-10-06 v0.01 PL: - First version +# 2008-10-13 v0.02 PL: - added cellspacing and cellpadding to table +# - added functions to ease one-step creation of tables +# and lists +# 2009-07-21 v0.03 PL: - added column attributes and styles (first attempt) +# (thanks to an idea submitted by Michal Cernoevic) +# 2009-07-28 v0.04 PL: - improved column styles, workaround for Mozilla + + +#------------------------------------------------------------------------------- +#TODO: +# - method to return a generator (yield each row) instead of a single string +# - unicode support (input and output) +# - escape text in cells (optional) +# - constants for standard colors +# - use lxml to generate well-formed HTML ? +# - add classes/functions to generate a HTML page, paragraphs, headings, etc... + + +#--- THANKS -------------------------------------------------------------------- + +# - Michal Cernoevic, for the idea of column styles. + +#--- REFERENCES ---------------------------------------------------------------- + +# HTML 4.01 specs: http://www.w3.org/TR/html4/struct/tables.html + +# Colors: http://www.w3.org/TR/html4/types.html#type-color + +# Columns alignement and style, one of the oldest and trickiest bugs in Mozilla: +# https://bugzilla.mozilla.org/show_bug.cgi?id=915 + + +#--- CONSTANTS ----------------------------------------------------------------- + +# Table style to get thin black lines in Mozilla/Firefox instead of 3D borders +TABLE_STYLE_THINBORDER = "border: 1px solid #000000; border-collapse: collapse;" +#TABLE_STYLE_THINBORDER = "border: 1px solid #000000;" + + +#=== CLASSES =================================================================== + +class TableCell (object): + """ + a TableCell object is used to create a cell in a HTML table. (TD or TH) + + Attributes: + - text: text in the cell (may contain HTML tags). May be any object which + can be converted to a string using str(). + - header: bool, false for a normal data cell (TD), true for a header cell (TH) + - bgcolor: str, background color + - width: str, width + - align: str, horizontal alignement (left, center, right, justify or char) + - char: str, alignment character, decimal point if not specified + - charoff: str, see HTML specs + - valign: str, vertical alignment (top|middle|bottom|baseline) + - style: str, CSS style + - attribs: dict, additional attributes for the TD/TH tag + + Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.6 + """ + + def __init__(self, text="", bgcolor=None, header=False, width=None, + align=None, char=None, charoff=None, valign=None, style=None, + attribs=None): + """TableCell constructor""" + self.text = text + self.bgcolor = bgcolor + self.header = header + self.width = width + self.align = align + self.char = char + self.charoff = charoff + self.valign = valign + self.style = style + self.attribs = attribs + if attribs==None: + self.attribs = {} + + def __str__(self): + """return the HTML code for the table cell as a string""" + attribs_str = "" + if self.bgcolor: self.attribs['bgcolor'] = self.bgcolor + if self.width: self.attribs['width'] = self.width + if self.align: self.attribs['align'] = self.align + if self.char: self.attribs['char'] = self.char + if self.charoff: self.attribs['charoff'] = self.charoff + if self.valign: self.attribs['valign'] = self.valign + if self.style: self.attribs['style'] = self.style + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + if self.text: + text = str(self.text) + else: + # An empty cell should at least contain a non-breaking space + text = ' ' + if self.header: + return ' %s\n' % (attribs_str, text) + else: + return ' %s\n' % (attribs_str, text) + +#------------------------------------------------------------------------------- + +class TableRow (object): + """ + a TableRow object is used to create a row in a HTML table. (TR tag) + + Attributes: + - cells: list, tuple or any iterable, containing one string or TableCell + object for each cell + - header: bool, true for a header row (TH), false for a normal data row (TD) + - bgcolor: str, background color + - col_align, col_valign, col_char, col_charoff, col_styles: see Table class + - attribs: dict, additional attributes for the TR tag + + Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.5 + """ + + def __init__(self, cells=None, bgcolor=None, header=False, attribs=None, + col_align=None, col_valign=None, col_char=None, + col_charoff=None, col_styles=None): + """TableCell constructor""" + self.bgcolor = bgcolor + self.cells = cells + self.header = header + self.col_align = col_align + self.col_valign = col_valign + self.col_char = col_char + self.col_charoff = col_charoff + self.col_styles = col_styles + self.attribs = attribs + if attribs==None: + self.attribs = {} + + def __str__(self): + """return the HTML code for the table row as a string""" + attribs_str = "" + if self.bgcolor: self.attribs['bgcolor'] = self.bgcolor + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + result = ' \n' % attribs_str + for cell in self.cells: + col = self.cells.index(cell) # cell column index + if not isinstance(cell, TableCell): + cell = TableCell(cell, header=self.header) + # apply column alignment if specified: + if self.col_align and cell.align==None: + cell.align = self.col_align[col] + if self.col_char and cell.char==None: + cell.char = self.col_char[col] + if self.col_charoff and cell.charoff==None: + cell.charoff = self.col_charoff[col] + if self.col_valign and cell.valign==None: + cell.valign = self.col_valign[col] + # apply column style if specified: + if self.col_styles and cell.style==None: + cell.style = self.col_styles[col] + result += str(cell) + result += ' \n' + return result + +#------------------------------------------------------------------------------- + +class Table (object): + """ + a Table object is used to create a HTML table. (TABLE tag) + + Attributes: + - rows: list, tuple or any iterable, containing one iterable or TableRow + object for each row + - header_row: list, tuple or any iterable, containing the header row (optional) + - border: str or int, border width + - style: str, table style in CSS syntax (thin black borders by default) + - width: str, width of the table on the page + - attribs: dict, additional attributes for the TABLE tag + - col_width: list or tuple defining width for each column + - col_align: list or tuple defining horizontal alignment for each column + - col_char: list or tuple defining alignment character for each column + - col_charoff: list or tuple defining charoff attribute for each column + - col_valign: list or tuple defining vertical alignment for each column + - col_styles: list or tuple of HTML styles for each column + + Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.1 + """ + + def __init__(self, rows=None, border='1', style=None, width=None, + cellspacing=None, cellpadding=4, attribs=None, header_row=None, + col_width=None, col_align=None, col_valign=None, + col_char=None, col_charoff=None, col_styles=None): + """TableCell constructor""" + self.border = border + self.style = style + # style for thin borders by default + if style == None: self.style = TABLE_STYLE_THINBORDER + self.width = width + self.cellspacing = cellspacing + self.cellpadding = cellpadding + self.header_row = header_row + self.rows = rows + if not rows: self.rows = [] + self.attribs = attribs + if not attribs: self.attribs = {} + self.col_width = col_width + self.col_align = col_align + self.col_char = col_char + self.col_charoff = col_charoff + self.col_valign = col_valign + self.col_styles = col_styles + + def __str__(self): + """return the HTML code for the table as a string""" + attribs_str = "" + if self.border: self.attribs['border'] = self.border + if self.style: self.attribs['style'] = self.style + if self.width: self.attribs['width'] = self.width + if self.cellspacing: self.attribs['cellspacing'] = self.cellspacing + if self.cellpadding: self.attribs['cellpadding'] = self.cellpadding + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + result = '\n' % attribs_str + # insert column tags and attributes if specified: + if self.col_width: + for width in self.col_width: + result += ' \n' % width + # The following code would also generate column attributes for style + # and alignement according to HTML4 specs, + # BUT it is not supported completely (only width) on Mozilla Firefox: + # see https://bugzilla.mozilla.org/show_bug.cgi?id=915 +## n_cols = max(len(self.col_styles), len(self.col_width), +## len(self.col_align), len(self.col_valign)) +## for i in range(n_cols): +## col = '' +## try: +## if self.col_styles[i]: +## col += ' style="%s"' % self.col_styles[i] +## except: pass +## try: +## if self.col_width[i]: +## col += ' width="%s"' % self.col_width[i] +## except: pass +## try: +## if self.col_align[i]: +## col += ' align="%s"' % self.col_align[i] +## except: pass +## try: +## if self.col_valign[i]: +## col += ' valign="%s"' % self.col_valign[i] +## except: pass +## result += '\n' % col + # First insert a header row if specified: + if self.header_row: + if not isinstance(self.header_row, TableRow): + result += str(TableRow(self.header_row, header=True)) + else: + result += str(self.header_row) + # Then all data rows: + for row in self.rows: + if not isinstance(row, TableRow): + row = TableRow(row) + # apply column alignments and styles to each row if specified: + # (Mozilla bug workaround) + if self.col_align and not row.col_align: + row.col_align = self.col_align + if self.col_char and not row.col_char: + row.col_char = self.col_char + if self.col_charoff and not row.col_charoff: + row.col_charoff = self.col_charoff + if self.col_valign and not row.col_valign: + row.col_valign = self.col_valign + if self.col_styles and not row.col_styles: + row.col_styles = self.col_styles + result += str(row) + result += '' + return result + + +#------------------------------------------------------------------------------- + +class List (object): + """ + a List object is used to create an ordered or unordered list in HTML. + (UL/OL tag) + + Attributes: + - lines: list, tuple or any iterable, containing one string for each line + - ordered: bool, choice between an ordered (OL) or unordered list (UL) + - attribs: dict, additional attributes for the OL/UL tag + + Reference: http://www.w3.org/TR/html4/struct/lists.html + """ + + def __init__(self, lines=None, ordered=False, start=None, attribs=None): + """List constructor""" + if lines: + self.lines = lines + else: + self.lines = [] + self.ordered = ordered + self.start = start + if attribs: + self.attribs = attribs + else: + self.attribs = {} + + def __str__(self): + """return the HTML code for the list as a string""" + attribs_str = "" + if self.start: self.attribs['start'] = self.start + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + if self.ordered: tag = 'OL' + else: tag = 'UL' + result = '<%s%s>\n' % (tag, attribs_str) + for line in self.lines: + result += '

  • %s\n' % str(line) + result += '\n' % tag + return result + + +##class Link (object): +## """ +## a Link object is used to create link in HTML. ( tag) +## +## Attributes: +## - text: str, text of the link +## - url: str, URL of the link +## - attribs: dict, additional attributes for the A tag +## +## Reference: http://www.w3.org/TR/html4 +## """ +## +## def __init__(self, text, url=None, attribs=None): +## """Link constructor""" +## self.text = text +## self.url = url +## if attribs: +## self.attribs = attribs +## else: +## self.attribs = {} +## +## def __str__(self): +## """return the HTML code for the link as a string""" +## attribs_str = "" +## if self.url: self.attribs['href'] = self.url +## for attr in self.attribs: +## attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) +## return '%s' % (attribs_str, text) + + +#=== FUNCTIONS ================================================================ + +# much simpler definition of a link as a function: +def Link(text, url): + return '%s' % (url, text) + +def link(text, url): + return '%s' % (url, text) + +def table(*args, **kwargs): + 'return HTML code for a table as a string. See Table class for parameters.' + return str(Table(*args, **kwargs)) + +def list(*args, **kwargs): + 'return HTML code for a list as a string. See List class for parameters.' + return str(List(*args, **kwargs)) + + +#=== MAIN ===================================================================== + +# Show sample usage when this file is launched as a script. + +if __name__ == '__main__': + + # open an HTML file to show output in a browser + f = open('test.html', 'w') + + t = Table() + t.rows.append(TableRow(['A', 'B', 'C'], header=True)) + t.rows.append(TableRow(['D', 'E', 'F'])) + t.rows.append(('i', 'j', 'k')) + f.write(str(t) + '

    \n') + print(str(t)) + print('-'*79) + + t2 = Table([ + ('1', '2'), + ['3', '4'] + ], width='100%', header_row=('col1', 'col2'), + col_width=('', '75%')) + f.write(str(t2) + '

    \n') + print(t2) + print('-'*79) + + t2.rows.append(['5', '6']) + t2.rows[1][1] = TableCell('new', bgcolor='red') + t2.rows.append(TableRow(['7', '8'], attribs={'align': 'center'})) + f.write(str(t2) + '

    \n') + print(t2) + print('-'*79) + + # sample table with column attributes and styles: + table_data = [ + ['Smith', 'John', 30, 4.5], + ['Carpenter', 'Jack', 47, 7], + ['Johnson', 'Paul', 62, 10.55], + ] + htmlcode = HTML.table(table_data, + header_row = ['Last name', 'First name', 'Age', 'Score'], + col_width=['', '20%', '10%', '10%'], + col_align=['left', 'center', 'right', 'char'], + col_styles=['font-size: large', '', 'font-size: small', 'background-color:yellow']) + f.write(htmlcode + '

    \n') + print(htmlcode) + print('-'*79) + + def gen_table_squares(n): + """ + Generator to create table rows for integers from 1 to n + """ +## # First, header row: +## yield TableRow(('x', 'square(x)'), header=True, bgcolor='blue') +## # Then all rows: + for x in range(1, n+1): + yield (x, x*x) + + t = Table(rows=gen_table_squares(10), header_row=('x', 'square(x)')) + f.write(str(t) + '

    \n') + + print('-'*79) + l = List(['aaa', 'bbb', 'ccc']) + f.write(str(l) + '

    \n') + l.ordered = True + f.write(str(l) + '

    \n') + l.start=10 + f.write(str(l) + '

    \n') + + f.close() diff --git a/INSTALL_WINDOWS b/INSTALL_WINDOWS deleted file mode 100644 index b95c9c5..0000000 --- a/INSTALL_WINDOWS +++ /dev/null @@ -1,28 +0,0 @@ -dépendances : -R 2.13.2 -http://cran.cict.fr/bin/windows/ - -python 2.7 -http://www.python.org/ - -Numpy -http://surfnet.dl.sourceforge.net/sourceforge/numpy/ - -wxpython (2.8) -http://surfnet.dl.sourceforge.net/sourceforge/wxpython/ - -xlrd : -http://pypi.python.org/pypi/xlrd - -package de R : -rgl -ca -gee -ape -igraph -proxy -textometry - - -pour gui2exe : -mettre le manifeste directement dans Constants.py diff --git a/KeyFrame.py b/KeyFrame.py index 20cb046..e570435 100755 --- a/KeyFrame.py +++ b/KeyFrame.py @@ -1,9 +1,21 @@ # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2008 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL +#------------------------------------ +# import des modules python +#------------------------------------ + +#------------------------------------ +# import des modules wx +#------------------------------------ import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ from functions import sortedby, DoConf # begin wxGlade: extracode @@ -15,32 +27,32 @@ class AlcOptFrame(wx.Dialog): kwds["style"] = wx.DEFAULT_DIALOG_STYLE wx.Dialog.__init__(self, *args, **kwds) self.cle={ - 'adj_sup': [wx.NewId(),wx.NewId(),u"Adjectif supplémentaire"], - 'art_ind': [wx.NewId(),wx.NewId(),u"Article indéfini"], - 'adj_pos': [wx.NewId(),wx.NewId(),u"Adjectif possessif"], - 'adv_sup': [wx.NewId(),wx.NewId(),u"Adverbe supplémentaire"], - 'pro_dem': [wx.NewId(),wx.NewId(),u"Pronom démonstratif"], - 'art_def': [wx.NewId(),wx.NewId(),u"Article défini"], - 'con': [wx.NewId(),wx.NewId(),u"Conjonction"], - 'pre': [wx.NewId(),wx.NewId(),u"Préposition"], - 'ono': [wx.NewId(),wx.NewId(),u"Onomatopée"], - 'adj_dem': [wx.NewId(),wx.NewId(),u"Adjectif démonstratif"], - 'nom_sup': [wx.NewId(),wx.NewId(),u"Nom supplémentaire"], - 'adv': [wx.NewId(),wx.NewId(),u"Adverbe"], - 'pro_per': [wx.NewId(),wx.NewId(),u"Pronom personnel"], - 'ver': [wx.NewId(),wx.NewId(),u"Verbe"], - 'adj_num': [wx.NewId(),wx.NewId(),u"Adjectif numérique"], - 'pro_rel': [wx.NewId(),wx.NewId(),u"Pronom relatif"], - 'adj_ind': [wx.NewId(),wx.NewId(),u"Adjectif indéfini"], - 'pro_ind': [wx.NewId(),wx.NewId(),u"Pronom indéfini"], - 'pro_pos': [wx.NewId(),wx.NewId(),u"Pronom possessif"], - 'aux': [wx.NewId(),wx.NewId(),u"Auxiliaire"], - 'ver_sup': [wx.NewId(),wx.NewId(),u"Verbe supplémentaire"], - 'adj': [wx.NewId(),wx.NewId(),u"Adjectif"], - 'adj_int': [wx.NewId(),wx.NewId(),u"Adjectif interrogatif"], - 'nom': [wx.NewId(),wx.NewId(),u"Nom commun"], - 'num' : [wx.NewId(),wx.NewId(),u"Chiffre"], - 'nr' : [wx.NewId(),wx.NewId(),u"Formes non reconnues"], + 'adj_sup': [wx.NewId(),wx.NewId(),"Adjectif supplémentaire"], + 'art_ind': [wx.NewId(),wx.NewId(),"Article indéfini"], + 'adj_pos': [wx.NewId(),wx.NewId(),"Adjectif possessif"], + 'adv_sup': [wx.NewId(),wx.NewId(),"Adverbe supplémentaire"], + 'pro_dem': [wx.NewId(),wx.NewId(),"Pronom démonstratif"], + 'art_def': [wx.NewId(),wx.NewId(),"Article défini"], + 'con': [wx.NewId(),wx.NewId(),"Conjonction"], + 'pre': [wx.NewId(),wx.NewId(),"Préposition"], + 'ono': [wx.NewId(),wx.NewId(),"Onomatopée"], + 'adj_dem': [wx.NewId(),wx.NewId(),"Adjectif démonstratif"], + 'nom_sup': [wx.NewId(),wx.NewId(),"Nom supplémentaire"], + 'adv': [wx.NewId(),wx.NewId(),"Adverbe"], + 'pro_per': [wx.NewId(),wx.NewId(),"Pronom personnel"], + 'ver': [wx.NewId(),wx.NewId(),"Verbe"], + 'adj_num': [wx.NewId(),wx.NewId(),"Adjectif numérique"], + 'pro_rel': [wx.NewId(),wx.NewId(),"Pronom relatif"], + 'adj_ind': [wx.NewId(),wx.NewId(),"Adjectif indéfini"], + 'pro_ind': [wx.NewId(),wx.NewId(),"Pronom indéfini"], + 'pro_pos': [wx.NewId(),wx.NewId(),"Pronom possessif"], + 'aux': [wx.NewId(),wx.NewId(),"Auxiliaire"], + 'ver_sup': [wx.NewId(),wx.NewId(),"Verbe supplémentaire"], + 'adj': [wx.NewId(),wx.NewId(),"Adjectif"], + 'adj_int': [wx.NewId(),wx.NewId(),"Adjectif interrogatif"], + 'nom': [wx.NewId(),wx.NewId(),"Nom commun"], + 'num' : [wx.NewId(),wx.NewId(),"Chiffre"], + 'nr' : [wx.NewId(),wx.NewId(),"Formes non reconnues"], } self.parent=parent self.keys=self.parent.keys @@ -51,16 +63,16 @@ class AlcOptFrame(wx.Dialog): self.listids=[] self.listidb=[] - self.label_1 = wx.StaticText(self, -1, u" Choix des clés d'analyse\n0=éliminé ; 1=active ; 2=supplémentaire\n") + self.label_1 = wx.StaticText(self, -1, " Choix des clés d'analyse\n0=éliminé ; 1=active ; 2=supplémentaire\n") self.listcleori=[[cle]+self.cle[cle] for cle in self.cle] self.listcleori=sortedby(self.listcleori,1,3) for line in self.listcleori: cle,ids,idb,label=line self.listlabel.append(wx.StaticText(self, -1, label)) - self.listspin.append(wx.SpinCtrl(self, ids,`self.keys[cle]`, min=0, max=2)) + self.listspin.append(wx.SpinCtrl(self, ids,repr(self.keys[cle]), min=0, max=2)) #if cle != 'nr' and cle!= 'num' : - self.listbutton.append(wx.Button(self, idb, u"voir liste")) + self.listbutton.append(wx.Button(self, idb, "voir liste")) self.listids.append(ids) self.listidb.append(idb) self.listcle.append(cle) @@ -81,7 +93,7 @@ class AlcOptFrame(wx.Dialog): def __set_properties(self): # begin wxGlade: AlcOptFrame.__set_properties - self.SetTitle(u"Clés d'analyse") + self.SetTitle("Clés d'analyse") # end wxGlade def __do_layout(self): diff --git a/Liste.py b/Liste.py index daf58f5..96a97da 100644 --- a/Liste.py +++ b/Liste.py @@ -1,107 +1,121 @@ # -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 +#License: GNU/GPL -#---------------------------------------------------------------------------- +# ---------------------------------------------------------------------------- # Name: ListCtrl.py -# Author: Pierre Ratinaud -# - -#comes from ListCtrl.py from the demo tool of wxPython: +# comes from ListCtrl.py from the demo tool of wxPython: # Author: Robin Dunn & Gary Dumer -# # Created: # Copyright: (c) 1998 by Total Control Software # Licence: wxWindows license -#---------------------------------------------------------------------------- +# ---------------------------------------------------------------------------- +#------------------------------------ +# import des modules python +#------------------------------------ import os import sys -import wx +import operator + +import langue +langue.run() + + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ from dialog import SearchDial, message -import wx.lib.mixins.listctrl as listmix -from operator import itemgetter +import wx.lib.mixins.listctrl as listmix from functions import doconcorde -#--------------------------------------------------------------------------- + + +# --------------------------------------------------------------------------- + # wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS) +# --------------------------------------------------------------------------- + class ListPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin): def __init__(self, parent, gparent, dlist): - wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES) + wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT | wx.LC_VIRTUAL | wx.LC_HRULES | wx.LC_VRULES) self.parent = parent self.gparent = gparent self.source = gparent self.dlist = dlist - #wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS) - search_id = wx.NewId() - self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id) + self.parent.Bind(wx.EVT_MENU, self.onsearch, id=search_id) self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id)]) self.SetAcceleratorTable(self.accel_tbl) - self.il = wx.ImageList(16, 16) - a={"sm_up":"GO_UP","sm_dn":"GO_DOWN","w_idx":"WARNING","e_idx":"ERROR","i_idx":"QUESTION"} - for k,v in a.items(): - s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v) + a = {"sm_up": "GO_UP", "sm_dn": "GO_DOWN", "w_idx": "WARNING", "e_idx": "ERROR", "i_idx": "QUESTION"} + for k, v in list(a.items()): + s = "self.%s= self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k, v) exec(s) self.SetImageList(self.il, wx.IMAGE_LIST_SMALL) - tID = wx.NewId() - - -#----------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------- self.attr1 = wx.ListItemAttr() self.attr1.SetBackgroundColour((230, 230, 230)) self.attr2 = wx.ListItemAttr() self.attr2.SetBackgroundColour("light blue") - - - self.InsertColumn(0, _(u'Form').decode('utf8'), wx.LIST_FORMAT_RIGHT) - self.InsertColumn(1, _(u'Freq.').decode('utf8'), wx.LIST_FORMAT_RIGHT) - self.InsertColumn(2, _(u'POS').decode('utf8'), wx.LIST_FORMAT_RIGHT) - #self.InsertColumn(3, '', wx.LIST_FORMAT_RIGHT) - - self.SetColumnWidth(0, 150) - self.SetColumnWidth(1, 100) + self.InsertColumn(0, _('Form'), wx.LIST_FORMAT_RIGHT) + self.InsertColumn(1, _('Freq.'), wx.LIST_FORMAT_RIGHT) + self.InsertColumn(2, _('POS'), wx.LIST_FORMAT_RIGHT) + # self.InsertColumn(3, '', wx.LIST_FORMAT_RIGHT) + self.SetColumnWidth(0, 150) + self.SetColumnWidth(1, 100) self.SetColumnWidth(2, 100) - #self.SetColumnWidth(3, wx.LIST_AUTOSIZE) - + # self.SetColumnWidth(3, wx.LIST_AUTOSIZE) self.itemDataMap = dlist - self.itemIndexMap = dlist.keys() + self.itemIndexMap = list(dlist.keys()) self.SetItemCount(len(dlist)) - - #self.Bind(wx.EVT_SIZE, self.OnSize) - + # self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self) self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self) - self.Bind(wx.EVT_LIST_ITEM_ACTIVATED , self.OnPopupTwo, self) + self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnPopupTwo, self) # for wxMSW self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick) - # for wxGTK self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick) - - #listmix.ListCtrlAutoWidthMixin.__init__(self) + # listmix.ListCtrlAutoWidthMixin.__init__(self) listmix.ColumnSorterMixin.__init__(self, 3) - self.SortListItems(1, False) - #self.do_greyline() + self.SortListItems(1, False) #indice de la colonne pour le tri + sens du tri + # self.do_greyline() + # self.currentItem = 0 + + def OnGetItemColumnImage(self, item, col): + return -1 - #self.currentItem = 0 + def OnGetItemImage(self, item): + pass def OnGetItemText(self, item, col): - index=self.itemIndexMap[item] + index = self.itemIndexMap[item] s = self.itemDataMap[index][col] - return s + if isinstance(s, (int, float)): + return str(s) + else: + return s #modification pour python 3 def OnGetItemAttr(self, item): - #index=self.itemIndexMap[item] - #genre=self.itemDataMap[index][2] - if item % 2 : + # index=self.itemIndexMap[item] + # genre=self.itemDataMap[index][2] + if item % 2: return self.attr1 - else : + else: return self.attr2 def OnColClick(self, event): pass - #self.do_greyline() - + # self.do_greyline() + # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py def GetListCtrl(self): return self @@ -110,76 +124,69 @@ class ListPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorte def GetSortImages(self): return (self.sm_dn, self.sm_up) - def SortItems(self,sorter=cmp): - items = list(self.itemDataMap.keys()) - items.sort(sorter) - self.itemIndexMap = items - - # redraw the list - self.Refresh() - + # anciennement : def SortItems(self,sorter=cmp), mais plus 'cmp' en python 3 + def SortItems(self, sorter=None): + listTemp = sorted(self.itemDataMap.items(), + key=lambda x:x[1][self._col], reverse= (self._colSortFlag[self._col]!=True)) + dlist = dict([[line[0],line[1]] for line in listTemp]) + self.itemDataMap = dlist + self.itemIndexMap = list(dlist.keys()) + self.Refresh() # redraw the list def OnRightDown(self, event): x = event.GetX() y = event.GetY() item, flags = self.HitTest((x, y)) - if flags & wx.LIST_HITTEST_ONITEM: self.Select(item) - event.Skip() - def getColumnText(self, index, col): item = self.GetItem(index, col) return item.GetText() - def OnItemSelected(self, event): - self.currentItem = event.m_itemIndex + self.currentItem = event.GetIndex() event.Skip() - def onsearch(self, evt) : + def onsearch(self, evt): self.dial = SearchDial(self, self, 0, True) self.dial.CenterOnParent() self.dial.Show() - #self.dial.Destroy() + # self.dial.Destroy() def OnRightClick(self, event): - # only do this part the first time so the events are only bound once if not hasattr(self, "popupID1"): self.popupID1 = wx.NewId() self.popupID2 = wx.NewId() - # self.popupID3 = wx.NewId() - + # self.popupID3 = wx.NewId() self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1) self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2) -# self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) - + # self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) # make a menu menu = wx.Menu() # add some items - menu.Append(self.popupID1, _(u"Associated forms").decode('utf8')) - menu.Append(self.popupID2, _(u"Concordance").decode('utf8')) -# menu.Append(self.popupID3, "recharger") - + menu.Append(self.popupID1, _("Associated forms")) + menu.Append(self.popupID2, _("Concordance")) + #menu.Append(self.popupID3, "recharger") self.PopupMenu(menu) menu.Destroy() - def OnPopupOne(self, event): corpus = self.gparent.corpus word = self.getColumnText(self.GetFirstSelected(), 0) lems = corpus.getlems() rep = [] - for forme in lems[word].formes : + for forme in lems[word].formes: rep.append([corpus.getforme(forme).forme, corpus.getforme(forme).freq]) - rep.sort(key = itemgetter(1), reverse = True) - items = dict([[i, '' + '\t:\t'.join([str(val) for val in forme]) + ''] for i, forme in enumerate(rep)]) - win = message(self, items, _(u"Associated forms").decode('utf8'), (300, 200)) - #win.html = '\n' + '
    '.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' - #win.HtmlPage.SetPage(win.html) + rep.sort( key= lambda x:x[1], reverse=True) + items = dict( + [[i, '' + '\t:\t'.join([str(val) for val in forme]) + ''] for i, forme in + enumerate(rep)]) + win = message(self, items, _("Associated forms"), (300, 200)) + # win.html = '\n' + '
    '.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' + # win.HtmlPage.SetPage(win.html) win.Show(True) def OnPopupTwo(self, event): @@ -187,9 +194,9 @@ class ListPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorte item = self.getColumnText(self.GetFirstSelected(), 0) uce_ok = corpus.getlemuces(item) ucis_txt, ucestxt = doconcorde(corpus, uce_ok, [item]) - items = dict([[i, '

    '.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))]) - win = message(self, items, ' - '.join([_(u"Concordance").decode('utf8'), "%s" % item]), (800, 500), uceids = uce_ok) - #win = message(self, u"Concordancier", (750, 600)) - #win.html = ('\n

    %s

    ' % item) + '
    '.join(['
    '.join([ucis_txt[i], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n' - #win.HtmlPage.SetPage(win.html) + items = dict([[i, '

    '.join([ucis_txt[i], ucestxt[i]])] for i in range(0, len(ucestxt))]) + win = message(self, items, ' - '.join([_("Concordance"), "%s" % item]), (800, 500), uceids=uce_ok) + # win = message(self, u"Concordancier", (750, 600)) + # win.html = ('\n

    %s

    ' % item) + '
    '.join(['
    '.join([ucis_txt[i], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n' + # win.HtmlPage.SetPage(win.html) win.Show(True) diff --git a/OptionAlceste.py b/OptionAlceste.py index 80366de..991fb20 100755 --- a/OptionAlceste.py +++ b/OptionAlceste.py @@ -1,17 +1,32 @@ # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2008-2009 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL -import wx +#------------------------------------ +# import des modules python +#------------------------------------ import shutil + +import langue +langue.run() + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ from KeyFrame import AlcOptFrame from chemins import ConstructConfigPath from functions import DoConf - class OptionAlc(wx.Dialog): + def __init__(self, parent, parametres, *args, **kwds): kwds['style'] = wx.DEFAULT_DIALOG_STYLE wx.Dialog.__init__(self, parent, *args, **kwds) @@ -23,44 +38,41 @@ class OptionAlc(wx.Dialog): self.svdmethod = ['svdR', 'irlba'] if self.parent.pref.getboolean('iramuteq','libsvdc') : self.svdmethod.append('svdlibc') - #self.label_1 = wx.StaticText(self, -1, u"Lemmatisation") - #self.radio_1 = wx.RadioBox(self, -1, u"", choices=['oui', 'non'], majorDimension=0, style=wx.RA_SPECIFY_ROWS) - - self.label_12 = wx.StaticText(self, -1, _(u"Clustering").decode('utf8')) - self.radio_box_2 = wx.RadioBox(self, -1, u"", choices=[_(u"double on RST").decode('utf8'), _(u"simple on text segments").decode('utf8'), _(u"simple on texts").decode('utf8')], majorDimension=0, style=wx.RA_SPECIFY_ROWS) #, u"simple sur UCE (non implemente)" - self.label_2 = wx.StaticText(self, -1, _(u"Size of rst1").decode('utf8')) - self.spin_ctrl_1 = wx.SpinCtrl(self, -1, _(u"actives forms").decode('utf8'),size = (100,30), min=0, max=1000000) - self.label_3 = wx.StaticText(self, -1, _(u"Size of rst2").decode('utf8')) + #self.label_1 = wx.StaticText(self, -1, "Lemmatisation") + #self.radio_1 = wx.RadioBox(self, -1, "", choices=['oui', 'non'], majorDimension=0, style=wx.RA_SPECIFY_ROWS) + self.label_12 = wx.StaticText(self, -1, _("Clustering")) + self.radio_box_2 = wx.RadioBox(self, -1, "", choices=[_("double on RST"), _("simple on text segments"), _("simple on texts")], majorDimension=0, style=wx.RA_SPECIFY_ROWS) #, u"simple sur UCE (non implemente)" + self.label_2 = wx.StaticText(self, -1, _("Size of rst1")) + self.spin_ctrl_1 = wx.SpinCtrl(self, -1, _("actives forms"),size = (100,30), min=0, max=1000000) + self.label_3 = wx.StaticText(self, -1, _("Size of rst2")) self.spin_ctrl_2 = wx.SpinCtrl(self, -1, "",size = (100,30), min=0, max=1000000) - self.lab_nbcl = wx.StaticText(self, -1, _(u"Number of terminal clusters on phase 1").decode('utf8')) + self.lab_nbcl = wx.StaticText(self, -1, _("Number of terminal clusters on phase 1")) self.spin_nbcl = wx.SpinCtrl(self, -1, "",size = (100,30), min=2, max=1000000) - txt = _(u"Minimum frequency of text segments by clusters (0=automatic)").decode('utf8') + txt = _("Minimum frequency of text segments by clusters (0=automatic)") self.label_7 = wx.StaticText(self, -1, txt) self.spin_ctrl_4 = wx.SpinCtrl(self, -1, "",size = (100,30), min=0, max=1000000) - txt = _(u"Minimum frequency of an analyzed form (2=automatic)").decode('utf8') + txt = _("Minimum frequency of an analyzed form (2=automatic)") self.label_8 = wx.StaticText(self, -1, txt) self.spin_ctrl_5 = wx.SpinCtrl(self, -1, "",size = (100,30), min=2, max=1000000) - self.label_max_actives = wx.StaticText(self, -1, _(u"Maximum number of analyzed forms").decode('utf8')) + self.label_max_actives = wx.StaticText(self, -1, _("Maximum number of analyzed forms")) self.spin_max_actives = wx.SpinCtrl(self, -1, "",size = (100,30), min=20, max=1000000) - self.label_svd = wx.StaticText(self, -1, _(u"svd method").decode('utf8')) + self.label_svd = wx.StaticText(self, -1, _("svd method")) self.choicesvd = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, self.svdmethod, 0 ) - self.label_patate = wx.StaticText(self, -1, _(u"Potato mode (less precise, faster)").decode('utf8')) + self.label_patate = wx.StaticText(self, -1, _("Potato mode (less precise, faster)")) self.check_patate = wx.CheckBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) #self.label_4 = wx.StaticText(self, -1, u"Configuration \ndes clés d'analyse") #self.button_5 = wx.Button(self, wx.ID_PREFERENCES, "") self.button_1 = wx.Button(self, wx.ID_CANCEL, "") - self.button_2 = wx.Button(self, wx.ID_DEFAULT, _(u"Default values").decode('utf8')) + self.button_2 = wx.Button(self, wx.ID_DEFAULT, _("Default values")) self.button_4 = wx.Button(self, wx.ID_OK, "") self.static_line_1 = wx.StaticLine(self, -1) - self.__set_properties() self.__do_layout() - #self.Bind(wx.EVT_BUTTON, self.OnKeyPref, self.button_5) self.Bind(wx.EVT_BUTTON, self.OnDef, self.button_2) - + def __set_properties(self): - self.SetTitle(_(u"Settings").decode('utf8')) + self.SetTitle(_("Settings")) #lang = self.AlcesteConf.get('ALCESTE', 'lang') #self.choice_dict.SetSelection(self.langues.index(lang)) #DefaultLem = self.parametres['lem'] @@ -85,66 +97,55 @@ class OptionAlc(wx.Dialog): else : self.check_patate.SetValue(False) - def __do_layout(self): sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_2 = wx.BoxSizer(wx.VERTICAL) grid_sizer2 = wx.FlexGridSizer(0, 2, 0, 0) grid_button = wx.FlexGridSizer(1, 3, 0, 0) - + # éléments désactivés ??? #grid_sizer2.Add(self.label_dict, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) #grid_sizer2.Add(self.choice_dict, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) - #grid_sizer2.Add(self.label_1, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) #grid_sizer2.Add(self.radio_1, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) #grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) #grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - + # ??? grid_sizer2.Add(self.label_12, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.radio_box_2, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_2, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_ctrl_1, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_3, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_ctrl_2, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.lab_nbcl, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_nbcl, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_7, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_ctrl_4, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_8, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_ctrl_5, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_max_actives, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_max_actives, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_svd, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.choicesvd, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_patate, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.check_patate, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_button.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) grid_button.Add(self.button_2, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) grid_button.Add(self.button_4, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) @@ -160,7 +161,7 @@ class OptionAlc(wx.Dialog): dial = AlcOptFrame(self.parent, self) dial.CenterOnParent() val = dial.ShowModal() - + def OnDef(self, event): ConfOri = ConstructConfigPath(self.parent.AppliPath, user=False) ConfUser = ConstructConfigPath(self.parent.UserConfigPath) @@ -171,10 +172,10 @@ class OptionAlc(wx.Dialog): self.parametres['corpus'] = corpus self.parametres['pathout'] = pathout self.__set_properties() - -###################################################################################@ + class OptionPam(wx.Dialog): + def __init__(self, parent, *args, **kwds): kwds['style'] = wx.DEFAULT_DIALOG_STYLE wx.Dialog.__init__(self, *args, **kwds) @@ -183,25 +184,26 @@ class OptionPam(wx.Dialog): self.pamconf = parent.pamconf self.type = parent.type self.choose = False - - self.label_1 = wx.StaticText(self, -1, u"Lemmatisation") - self.radio_1 = wx.RadioBox(self, -1, u"", choices=['oui', 'non'], majorDimension=0, style=wx.RA_SPECIFY_ROWS) + self.label_1 = wx.StaticText(self, -1, "Lemmatisation") + self.radio_1 = wx.RadioBox(self, -1, "", choices=['oui', 'non'], majorDimension=0, style=wx.RA_SPECIFY_ROWS) #self.label_exp = wx.StaticText(self, -1, u"Utiliser le dict. des expressions") #self.radio_exp = wx.RadioBox(self, -1, u"", choices=['oui', 'non'], majorDimension=0, style=wx.RA_SPECIFY_ROWS) - txt = u"""Methode de construction + # pourquoi le retour à la ligne ??? + txt = """Methode de construction de la matrice des distances""" self.label_12 = wx.StaticText(self, -1, txt) - self.distance = [u"binary", u"euclidean", u"maximum", u'manhattan', u'canberra', u'minkowski'] + self.distance = ["binary", "euclidean", "maximum", 'manhattan', 'canberra', 'minkowski'] self.choice_1 = wx.Choice(self, -1, (100,50), choices=self.distance) - self.label_13 = wx.StaticText(self, -1, u'Analyse') - self.cltype = [u'k-means (pam)', u'fuzzy (fanny)'] - self.radio_box_3 = wx.RadioBox(self, -1, u"", choices=self.cltype, majorDimension=0, style=wx.RA_SPECIFY_ROWS) - self.label_classif = wx.StaticText(self, -1, u"Classification") - self.radio_box_classif = wx.RadioBox(self, -1, u"", choices=[u"sur UCE", u"sur UCI"], majorDimension=0, style=wx.RA_SPECIFY_ROWS) + self.label_13 = wx.StaticText(self, -1, 'Analyse') + self.cltype = ['k-means (pam)', 'fuzzy (fanny)'] + self.radio_box_3 = wx.RadioBox(self, -1, "", choices=self.cltype, majorDimension=0, style=wx.RA_SPECIFY_ROWS) + self.label_classif = wx.StaticText(self, -1, "Classification") + self.radio_box_classif = wx.RadioBox(self, -1, "", choices=["sur UCE", "sur UCI"], majorDimension=0, style=wx.RA_SPECIFY_ROWS) #self.label_2 = wx.StaticText(self, -1, "taille uc") #self.spin_ctrl_1 = wx.SpinCtrl(self, -1, "formes actives", min=0, max=100) - self.label_max_actives = wx.StaticText(self, -1, u"Nombre maximum de formes analysées") + self.label_max_actives = wx.StaticText(self, -1, "Nombre maximum de formes analysées") self.spin_max_actives = wx.SpinCtrl(self, -1, "",size = (100,30), min=20, max=10000) + # pourquoi le retour à la ligne ??? txt = """Nombre de formes par uce (0 = automatique)""" self.label_6 = wx.StaticText(self, -1, txt) @@ -209,16 +211,14 @@ de la matrice des distances""" txt = "Nombre de classes" self.label_7 = wx.StaticText(self, -1, txt) self.spin_ctrl_4 = wx.SpinCtrl(self, -1, "", size = (100,30), min=0, max=1000) - self.label_4 = wx.StaticText(self, -1, u"Configuration \ndes clés d'analyse") + self.label_4 = wx.StaticText(self, -1, "Configuration \ndes clés d'analyse") self.button_5 = wx.Button(self, wx.ID_PREFERENCES, "") self.button_1 = wx.Button(self, wx.ID_CANCEL, "") - self.button_2 = wx.Button(self, wx.ID_DEFAULT, u"Valeurs par défaut") + self.button_2 = wx.Button(self, wx.ID_DEFAULT, "Valeurs par défaut") self.button_4 = wx.Button(self, wx.ID_OK, "") self.static_line_1 = wx.StaticLine(self, -1) - self.__set_properties() self.__do_layout() - self.Bind(wx.EVT_BUTTON, self.OnKeyPref, self.button_5) self.Bind(wx.EVT_BUTTON, self.OnDef, self.button_2) @@ -235,7 +235,7 @@ de la matrice des distances""" #else : # self.radio_exp.SetSelection(1) self.choice_1.SetSelection(self.distance.index(self.pamconf.get('pam', 'method'))) - if self.pamconf.get('pam', 'cluster_type') == u'pam' : + if self.pamconf.get('pam', 'cluster_type') == 'pam' : self.radio_box_3.SetSelection(0) else : self.radio_box_3.SetSelection(1) @@ -254,52 +254,44 @@ de la matrice des distances""" grid_sizer2.Add(self.radio_1, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_exp, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.radio_exp, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_12, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.choice_1, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_13, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.radio_box_3, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_classif, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.radio_box_classif, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - + # ??? #grid_sizer2.Add(self.label_2, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) #grid_sizer2.Add(self.spin_ctrl_1, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) #grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) #grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - + # ??? grid_sizer2.Add(self.label_max_actives, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_max_actives, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_6, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_ctrl_3, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_7, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.spin_ctrl_4, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_sizer2.Add(self.label_4, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(self.button_5, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer2.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1) grid_sizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 1) - grid_button.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) grid_button.Add(self.button_2, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) grid_button.Add(self.button_4, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) @@ -315,7 +307,7 @@ de la matrice des distances""" dial = AlcOptFrame(self.parent, self) dial.CenterOnParent() val = dial.ShowModal() - + def OnDef(self, event): ConfOri = ConstructConfigPath(self.parent.parent.AppliPath, user=False) ConfUser = ConstructConfigPath(self.parent.parent.UserConfigPath) diff --git a/PrintRScript.py b/PrintRScript.py index e334a87..27c4d27 100755 --- a/PrintRScript.py +++ b/PrintRScript.py @@ -1,68 +1,83 @@ # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2008-2011 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL +#------------------------------------ +# import des modules python +#------------------------------------ import tempfile -from chemins import ffr, PathOut import os import locale from datetime import datetime import logging +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +from chemins import ffr, PathOut + + log = logging.getLogger('iramuteq.printRscript') -class PrintRScript : + +class PrintRScript: + def __init__ (self, analyse, parametres = None): log.info('Rscript') self.pathout = analyse.pathout self.analyse = analyse - if parametres is None : + if parametres is None: self.parametres = analyse.parametres - else : + else: self.parametres = parametres #self.scriptout = ffr(self.pathout['lastRscript.R']) self.scriptout = self.pathout['temp'] - self.script = u"#Script genere par IRaMuTeQ - %s\n" % datetime.now().ctime() + self.script = "#Script genere par IRaMuTeQ - %s\n" % datetime.now().ctime() - def add(self, txt) : + def add(self, txt): self.script = '\n'.join([self.script, txt]) - def defvar(self, name, value) : + def defvar(self, name, value): self.add(' <- '.join([name, value])) - def defvars(self, lvars) : - for val in lvars : + def defvars(self, lvars): + for val in lvars: self.defvar(val[0],val[1]) - def sources(self, lsources) : - for source in lsources : + def sources(self, lsources): + for source in lsources: self.add('source("%s", encoding = \'utf8\')' % ffr(source)) - def packages(self, lpks) : - for pk in lpks : + def packages(self, lpks): + for pk in lpks: self.add('library(%s)' % pk) - def load(self, l) : - for val in l : + def load(self, l): + for val in l: self.add('load("%s")' % ffr(val)) - def write(self) : - with open(self.scriptout, 'w') as f : + def write(self): + with open(self.scriptout, 'w') as f: f.write(self.script) -class chdtxt(PrintRScript) : +# ??? +class chdtxt(PrintRScript): pass -def Rcolor(color) : + +def Rcolor(color): return str(color).replace(')', ', max=255)') -class Alceste2(PrintRScript) : - def doscript(self) : + +class Alceste2(PrintRScript): + + def doscript(self): self.sources(['chdfunct']) self.load(['Rdata']) - lvars = [['clnb', `self.analyse.clnb`], + lvars = [['clnb', repr(self.analyse.clnb)], ['Contout', '"%s"' % self.pathout['Contout']], ['ContSupOut', '"%s"' % self.pathout['ContSupOut']], ['ContEtOut', '"%s"' % self.pathout['ContEtOut']], @@ -73,8 +88,6 @@ class Alceste2(PrintRScript) : self.defvars(lvars) - - # txt = "clnb<-%i\n" % clnb # txt += """ #source("%s") @@ -120,35 +133,34 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv source("%s") source("%s") """ % (ffr(RscriptPath['CHD']), ffr(RscriptPath['chdtxt']), ffr(RscriptPath['anacor']), ffr(RscriptPath['Rgraph'])) - if R_max_mem : + if R_max_mem: txt += """ memory.limit(%i) """ % R_max_mem - txt += """ nbt <- %i """ % nbt - if svdmethod == 'svdlibc' and libsvdc : + if svdmethod == 'svdlibc' and libsvdc: txt += """ svd.method <- 'svdlibc' libsvdc.path <- "%s" """ % ffr(libsvdc_path) - elif svdmethod == 'irlba' : + elif svdmethod == 'irlba': txt += """ library(irlba) svd.method <- 'irlba' libsvdc.path <- NULL """ - else : + else: txt += """ svd.method = 'svdR' libsvdc.path <- NULL """ - if mode_patate : + if mode_patate: txt += """ mode.patate = TRUE """ - else : + else: txt += """ mode.patate = FALSE """ @@ -158,7 +170,6 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv data1 <- as(data1, "dgCMatrix") row.names(data1) <- 1:nrow(data1) """ % ffr(DicoPath['TableUc1']) - if classif_mode == 0: txt += """ data2 <- readMM("%s") @@ -173,28 +184,23 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv #chd1<-CHD(data1, x = nbt, mode.patate = mode.patate, svd.method = svd.method, libsvdc.path = libsvdc.path, find='matrix', select.next='size', sample=20, amp=500, proc.nb=nbproc) chd1<-CHD(data1, x = nbt, mode.patate = mode.patate, svd.method = svd.method, libsvdc.path = libsvdc.path)#, log.file = log1) """ % (ffr(DicoPath['log-chd1.txt']), nbproc) - if classif_mode == 0: txt += """ log2 <- "%s" chd2<-CHD(data2, x = nbt, mode.patate = mode.patate, svd.method = svd.method, libsvdc.path = libsvdc.path)#, log.file = log2) """ % ffr(DicoPath['log-chd2.txt']) - txt += """ #lecture des uce listuce1<-read.csv2("%s") """ % ffr(DicoPath['listeuce1']) - if classif_mode == 0: txt += """ listuce2<-read.csv2("%s") """ % ffr(DicoPath['listeuce2']) - txt += """ rm(data1) """ - if classif_mode == 0: txt += """ rm(data2) @@ -210,7 +216,6 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv classeuce1 <- chd.result$cuce1 tree.tot1 <- make_tree_tot(chd1) tree.cut1 <- make_dendro_cut_tuple(tree.tot1$dendro_tuple, chd.result$coord_ok, classeuce1, 1, nbt) - } else { #chd.result <- Rchdtxt(uceout, chd1, chd2 = chd1, mincl = mincl,classif_mode = classif_mode, nbt = nbt) tree.tot1 <- make_tree_tot(chd1) @@ -222,14 +227,12 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv classes<-chd.result$n1[,ncol(chd.result$n1)] write.csv2(chd.result$n1, file="%s") """ % (classif_mode, mincl, ffr(DicoPath['uce']), ffr(DicoPath['n1-1.csv']), ffr(DicoPath['n1.csv'])) - txt += """ # tree.tot1 <- make_tree_tot(chd1) # open_file_graph("%s", widt = 600, height=400) # plot(tree.tot1$tree.cl) # dev.off() """ % ffr(DicoPath['arbre1']) - if classif_mode == 0: txt += """ classeuce2 <- chd.result$cuce2 @@ -238,7 +241,6 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv # plot(tree.tot2$tree.cl) # dev.off() """ % ffr(DicoPath['arbre2'] ) - txt += """ save(tree.cut1, file="%s") @@ -248,7 +250,6 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv plot(tree.cut1$dendro_tot_cl) dev.off() """ % (ffr(DicoPath['Rdendro']), ffr(DicoPath['dendro1']), ffr(DicoPath['arbre1'])) - if classif_mode == 0: txt += """ tree.cut2 <- make_dendro_cut_tuple(tree.tot2$dendro_tuple, chd.result$coord_ok, classeuce2, 2, nbt) @@ -259,12 +260,9 @@ def RchdTxt(DicoPath, RscriptPath, mincl, classif_mode, nbt = 9, svdmethod = 'sv plot(tree.cut2$dendro_tot_cl) dev.off() """ % (ffr(DicoPath['dendro2']), ffr(DicoPath['arbre2'])) - txt += """ - #save.image(file="%s") """ % (ffr(DicoPath['RData'])) - fileout = open(DicoPath['Rchdtxt'], 'w') fileout.write(txt) fileout.close() @@ -293,7 +291,6 @@ def RPamTxt(corpus, RscriptPath): fileout = open(DicoPath['Rchdtxt'], 'w') fileout.write(txt) fileout.close() - def RchdQuest(DicoPath, RscriptPath, nbcl = 10, mincl = 10): txt = """ @@ -302,25 +299,21 @@ def RchdQuest(DicoPath, RscriptPath, nbcl = 10, mincl = 10): source("%s") source("%s") """ % (ffr(RscriptPath['CHD']), ffr(RscriptPath['chdquest']), ffr(RscriptPath['anacor']),ffr(RscriptPath['Rgraph'])) - txt += """ nbt <- %i - 1 mincl <- %i """ % (nbcl, mincl) - txt += """ chd.result<-Rchdquest("%s","%s","%s", nbt = nbt, mincl = mincl) n1 <- chd.result$n1 classeuce1 <- chd.result$cuce1 """ % (ffr(DicoPath['mat01.csv']), ffr(DicoPath['listeuce1']), ffr(DicoPath['uce'])) - txt += """ tree_tot1 <- make_tree_tot(chd.result$chd) open_file_graph("%s", width = 600, height=400) plot(tree_tot1$tree.cl) dev.off() """ % ffr(DicoPath['arbre1']) - txt += """ tree_cut1 <- make_dendro_cut_tuple(tree_tot1$dendro_tuple, chd.result$coord_ok, classeuce1, 1, nbt) tree.cut1 <- tree_cut1 @@ -329,7 +322,6 @@ def RchdQuest(DicoPath, RscriptPath, nbcl = 10, mincl = 10): classes<-n1[,ncol(n1)] plot.dendropr(tree_cut1$tree.cl,classes, histo = TRUE) """ % (ffr(DicoPath['Rdendro']), ffr(DicoPath['dendro1'])) - txt += """ save.image(file="%s") """ % ffr(DicoPath['RData']) @@ -357,7 +349,6 @@ print('ATTENTION NEW BUILD PROF') tablesqrpact<-new.build.prof(as.matrix(dataact),n1,clnb) tablesqrpsup<-new.build.prof(as.matrix(datasup),n1,clnb) tablesqrpet<-new.build.prof(as.matrix(dataet),n1,clnb) - """ txt += """ PrintProfile(n1,tablesqrpact[4],tablesqrpet[4],tablesqrpact[5],tablesqrpet[5],clnb,"%s","%s",tablesqrpsup[4],tablesqrpsup[5]) @@ -379,7 +370,7 @@ write.csv2(ptabletot,file="%s") gbcluster<-n1 write.csv2(gbcluster,file="%s") """ % (ffr(DictChdTxtOut['chisqtable']), ffr(DictChdTxtOut['ptable']), ffr(DictChdTxtOut['SbyClasseOut'])) - if clnb > 2 : + if clnb > 2: txt += """ library(ca) colnames(dataact)<-paste('classe',1:clnb,sep=' ') @@ -399,7 +390,6 @@ write.csv2(gbcluster,file="%s") txt += """ source("%s") """ % ffr(RscriptsPath['Rgraph']) - txt += """ afc <- summary.ca.dm(afc) afc_table <- create_afc_table(afc) @@ -407,7 +397,6 @@ write.csv2(gbcluster,file="%s") write.csv2(afc_table$colonne, file = "%s") write.csv2(afc_table$ligne, file = "%s") """ % (ffr(DictChdTxtOut['afc_facteur']), ffr(DictChdTxtOut['afc_col']), ffr(DictChdTxtOut['afc_row'])) - txt += """ PARCEX<-%s """ % taillecar @@ -426,12 +415,11 @@ write.csv2(gbcluster,file="%s") PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", col=TRUE, what='coord', xlab = xlab, ylab = ylab, xmin = xyminmax$xminmax[1], xmax = xyminmax$xminmax[2], ymin = xyminmax$yminmax[1], ymax = xyminmax$yminmax[2], active=FALSE) """ % (ffr(DictChdTxtOut['AFC2DCL_OUT'])) # txt += """ - # PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", what='crl', deb=1, fin=(debsup-1), xlab = xlab, ylab = ylab) - # PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", what='crl', deb=debsup, fin=(debet-1), xlab = xlab, ylab = ylab) - # PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", what='crl', deb=debet, fin=fin, xlab = xlab, ylab = ylab) - # PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", col=TRUE, what='crl', xlab = xlab, ylab = ylab) - # """ % (DictChdTxtOut['AFC2DCoul'], DictChdTxtOut['AFC2DCoulSup'], DictChdTxtOut['AFC2DCoulEt'], DictChdTxtOut['AFC2DCoulCl']) - +# PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", what='crl', deb=1, fin=(debsup-1), xlab = xlab, ylab = ylab) +# PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", what='crl', deb=debsup, fin=(debet-1), xlab = xlab, ylab = ylab) +# PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", what='crl', deb=debet, fin=fin, xlab = xlab, ylab = ylab) +# PlotAfc2dCoul(afc, as.data.frame(chistabletot), "%s", col=TRUE, what='crl', xlab = xlab, ylab = ylab) +# """ % (DictChdTxtOut['AFC2DCoul'], DictChdTxtOut['AFC2DCoulSup'], DictChdTxtOut['AFC2DCoulEt'], DictChdTxtOut['AFC2DCoulCl']) txt += """ #rm(dataact) #rm(datasup) @@ -445,39 +433,43 @@ save.image(file="%s") file.write(txt) file.close() - def write_afc_graph(self): - if self.param['over'] : over = 'TRUE' - else : over = 'FALSE' - - if self.param['do_select_nb'] : do_select_nb = 'TRUE' - else : do_select_nb = 'FALSE' - - if self.param['do_select_chi'] : do_select_chi = 'TRUE' - else : do_select_chi = 'FALSE' - - if self.param['do_select_chi_classe'] : do_select_chi_classe = 'TRUE' - else : do_select_chi_classe = 'FALSE' - - if self.param['cex_txt'] : cex_txt = 'TRUE' - else : cex_txt = 'FALSE' - - if self.param['tchi'] : tchi = 'TRUE' - else : tchi = 'FALSE' - - if self.param['svg'] : svg = 'TRUE' - else : svg = 'FALSE' - - if self.param['typegraph'] == 4 : + if self.param['over']: + over = 'TRUE' + else: + over = 'FALSE' + if self.param['do_select_nb']: + do_select_nb = 'TRUE' + else: + do_select_nb = 'FALSE' + if self.param['do_select_chi']: + do_select_chi = 'TRUE' + else: + do_select_chi = 'FALSE' + if self.param['do_select_chi_classe']: + do_select_chi_classe = 'TRUE' + else: + do_select_chi_classe = 'FALSE' + if self.param['cex_txt']: + cex_txt = 'TRUE' + else: + cex_txt = 'FALSE' + if self.param['tchi']: + tchi = 'TRUE' + else: + tchi = 'FALSE' + if self.param['svg']: + svg = 'TRUE' + else: + svg = 'FALSE' + if self.param['typegraph'] == 4: nodesfile = os.path.join(os.path.dirname(self.fileout),'nodes.csv') edgesfile = os.path.join(os.path.dirname(self.fileout),'edges.csv') - else : + else: nodesfile = 'NULL' edgesfile = 'NULL' - with open(self.RscriptsPath['afc_graph'], 'r') as f: txt = f.read() - # self.DictPathOut['RData'], \ scripts = txt % (ffr(self.RscriptsPath['Rgraph']),\ self.param['typegraph'], \ @@ -508,30 +500,26 @@ def write_afc_graph(self): ffr(os.path.dirname(self.fileout)),\ svg) return scripts - + def print_simi3d(self): simi3d = self.parent.simi3dpanel txt = '#Fichier genere par Iramuteq' - if simi3d.movie.GetValue() : + if simi3d.movie.GetValue(): movie = "'" + ffr(os.path.dirname(self.DictPathOut['RData'])) + "'" - else : + else: movie = 'NULL' - - #if self.corpus.parametres['type'] == 'corpus' : + #if self.corpus.parametres['type'] == 'corpus': # header = 'TRUE' - #else : + #else: # header = 'FALSE' header = 'FALSE' txt += """ dm<-read.csv2("%s",row.names=1,header = %s) load("%s") """ % (self.DictPathOut['Contout'], header, self.DictPathOut['RData']) - txt += """ source("%s") """ % self.parent.RscriptsPath['Rgraph'] - - txt += """ make.simi.afc(dm,chistabletot, lim=%i, alpha = %.2f, movie = %s) """ % (simi3d.spin_1.GetValue(), float(simi3d.slider_1.GetValue())/100, movie) @@ -541,20 +529,20 @@ def print_simi3d(self): tmp.close() return tmpfile -def dendroandbarplot(table, rownames, colnames, rgraph, tmpgraph, intxt = False, dendro=False) : - if not intxt : +def dendroandbarplot(table, rownames, colnames, rgraph, tmpgraph, intxt = False, dendro=False): + if not intxt: txttable = 'c(' + ','.join([','.join(line) for line in table]) + ')' rownb = len(rownames) rownames = 'c("' + '","'.join(rownames) + '")' colnames = 'c("' + '","'.join(colnames) + '")' - if not intxt : + if not intxt: #FIXME txt = """ di <- matrix(data=%s, nrow=%i, byrow = TRUE) rownames(di)<- %s colnames(di) <- %s """ % (txttable, rownb, rownames, colnames) - else : + else: txt = intxt txt += """ load("%s") @@ -568,18 +556,17 @@ def dendroandbarplot(table, rownames, colnames, rgraph, tmpgraph, intxt = False, """ % (ffr(dendro),ffr(rgraph), ffr(tmpgraph)) return txt -def barplot(table, parametres, intxt = False) : - if not intxt : +def barplot(table, parametres, intxt = False): + if not intxt: txttable = 'c(' + ','.join([','.join(line) for line in table]) + ')' #width = 100 + (15 * len(rownames)) + (100 * len(colnames)) #height = len(rownames) * 15 rownb = len(parametres['rownames']) - #if height < 400 : + #if height < 400: # height = 400 rownames = 'c("' + '","'.join(parametres['rownames']) + '")' colnames = 'c("' + '","'.join(parametres['colnames']) + '")' - - if not intxt : + if not intxt: #FIXME txt = """ di <- matrix(data=%s, nrow=%i, byrow = TRUE) @@ -608,17 +595,17 @@ def barplot(table, parametres, intxt = False) : rownames(di)<- %s colnames(di) <- %s """ % (txttable, rownb, rownames, colnames) - else : + else: txt = intxt - if not 'tree' in parametres : + if not 'tree' in parametres: txt += """ source("%s") color = rainbow(nrow(di)) width <- %i height <- %i open_file_graph("%s",width = width, height = height, svg = %s) - par(mar=c(0,0,0,0)) - layout(matrix(c(1,2),1,2, byrow=TRUE),widths=c(3,lcm(12))) + par(mar=c(0,0,0,0)) + layout(matrix(c(1,2),1,2, byrow=TRUE),widths=c(3,lcm(12))) par(mar=c(8,4,1,0)) yp = ifelse(length(toinf), 0.2, 0) ym = ifelse(length(tominf), 0.2, 0) @@ -662,7 +649,7 @@ def barplot(table, parametres, intxt = False) : legend(x = 'center' , rownames(di), fill = color) dev.off() """ % (ffr(parametres['rgraph']), parametres['width'], parametres['height'], ffr(parametres['tmpgraph']), parametres['svg']) - else : + else: txt += """ load("%s") library(ape) @@ -729,24 +716,26 @@ def barplot(table, parametres, intxt = False) : # f.write(txt) # f.close() -class PrintSimiScript(PrintRScript) : - def make_script(self) : + +class PrintSimiScript(PrintRScript): + + def make_script(self): self.txtgraph = '' self.packages(['igraph', 'proxy', 'Matrix']) self.sources([self.analyse.parent.RscriptsPath['simi'], self.analyse.parent.RscriptsPath['Rgraph']]) txt = '' - if not self.parametres['keep_coord'] and not (self.parametres['type'] == 'simimatrix' or self.parametres['type'] == 'simiclustermatrix') : + if not self.parametres['keep_coord'] and not (self.parametres['type'] == 'simimatrix' or self.parametres['type'] == 'simiclustermatrix'): txt += """ dm.path <- "%s" cn.path <- "%s" selected.col <- "%s" """ % (ffr(self.pathout['mat01.csv']), ffr(self.pathout['actives.csv']), ffr(self.pathout['selected.csv'])) - if 'word' in self.parametres : + if 'word' in self.parametres: txt += """ word <- TRUE index <- %i + 1 """ % self.parametres['word'] - else : + else: txt += """ word <- FALSE index <- NULL @@ -777,12 +766,12 @@ class PrintSimiScript(PrintRScript) : dm.path <- "%s" selected.col <- "%s" """ % (ffr(self.pathout['mat01.csv']), ffr(self.pathout['selected.csv'])) - if 'word' in self.parametres : + if 'word' in self.parametres: txt += """ word <- TRUE index <- %i + 1 """ % self.parametres['word'] - else : + else: txt += """ word <- FALSE """ @@ -806,51 +795,50 @@ class PrintSimiScript(PrintRScript) : index <- which(colnames(dm) == forme) } """ - else : + else: txt += """ load("%s") """ % ffr(self.pathout['RData.RData']) - - if self.parametres['coeff'] == 0 : + if self.parametres['coeff'] == 0: method = 'cooc' - if not self.parametres['keep_coord'] : + if not self.parametres['keep_coord']: txt += """ method <- 'cooc' mat <- make.a(dm) """ - elif self.analyse.indices[self.parametres['coeff']] == 'Jaccard' : + elif self.analyse.indices[self.parametres['coeff']] == 'Jaccard': method = 'Jaccard' - if not self.parametres['keep_coord'] : + if not self.parametres['keep_coord']: txt += """ method <- 'Jaccard' mat <- sparse.jaccard(dm) """ - else : - if not self.parametres['keep_coord'] : + else: + if not self.parametres['keep_coord']: txt += """ dm <- as.matrix(dm) """ - if self.parametres['coeff'] == 1 : + if self.parametres['coeff'] == 1: method = 'prcooc' txt += """ method <- 'Russel' mat <- simil(dm, method = 'Russel', diag = TRUE, upper = TRUE, by_rows = FALSE) """ - elif self.analyse.indices[self.parametres['coeff']] == 'binomial' : + elif self.analyse.indices[self.parametres['coeff']] == 'binomial': method = 'binomial' - if not self.parametres['keep_coord'] : + if not self.parametres['keep_coord']: txt += """ method <- 'binomial' mat <- binom.sim(dm) """ elif self.parametres['coeff'] != 0 and self.analyse.indices[self.parametres['coeff']] != 'Jaccard': method = self.analyse.indices[self.parametres['coeff']] - if not self.parametres['keep_coord'] : + if not self.parametres['keep_coord']: txt += """ method <-"%s" mat <- simil(dm, method = method, diag = TRUE, upper = TRUE, by_rows = FALSE) """ % self.analyse.indices[self.parametres['coeff']] - if not self.parametres['keep_coord'] : + if not self.parametres['keep_coord']: txt += """ mat <- as.matrix(stats::as.dist(mat,diag=TRUE,upper=TRUE)) mat[is.na(mat)] <- 0 @@ -877,7 +865,7 @@ class PrintSimiScript(PrintRScript) : mat[infm] <- minmat } """ - if 'word' in self.parametres and not self.parametres['keep_coord'] : + if 'word' in self.parametres and not self.parametres['keep_coord']: txt += """ mat <- graph.word(mat, index) cs <- colSums(mat) @@ -889,27 +877,33 @@ class PrintSimiScript(PrintRScript) : index <- which(colnames(mat)==forme) } """ - - if self.parametres['layout'] == 0 : layout = 'random' - if self.parametres['layout'] == 1 : layout = 'circle' - if self.parametres['layout'] == 2 : layout = 'frutch' - if self.parametres['layout'] == 3 : layout = 'kawa' - if self.parametres['layout'] == 4 : layout = 'graphopt' - if self.parametres['layout'] == 5 : layout = 'spirale' - if self.parametres['layout'] == 6 : layout = 'spirale3D' - - + if self.parametres['layout'] == 0: + layout = 'random' + if self.parametres['layout'] == 1: + layout = 'circle' + if self.parametres['layout'] == 2: + layout = 'frutch' + if self.parametres['layout'] == 3: + layout = 'kawa' + if self.parametres['layout'] == 4: + layout = 'graphopt' + if self.parametres['layout'] == 5: + layout = 'spirale' + if self.parametres['layout'] == 6: + layout = 'spirale3D' self.filename='' - if self.parametres['type_graph'] == 0 : type = 'tkplot' - if self.parametres['type_graph'] == 1 : + if self.parametres['type_graph'] == 0: + type = 'tkplot' + if self.parametres['type_graph'] == 1: graphnb = 1 type = 'nplot' dirout = os.path.dirname(self.pathout['mat01.csv']) while os.path.exists(os.path.join(dirout,'graph_simi_'+str(graphnb)+'.png')): graphnb +=1 self.filename = ffr(os.path.join(dirout,'graph_simi_'+str(graphnb)+'.png')) - if self.parametres['type_graph'] == 2 : type = 'rgl' - if self.parametres['type_graph'] == 3 : + if self.parametres['type_graph'] == 2: + type = 'rgl' + if self.parametres['type_graph'] == 3: graphnb = 1 type = 'web' dirout = os.path.dirname(self.pathout['mat01.csv']) @@ -918,7 +912,7 @@ class PrintSimiScript(PrintRScript) : self.filename = ffr(os.path.join(dirout,'web_'+str(graphnb))) os.mkdir(self.filename) self.filename = os.path.join(self.filename, 'gexf.gexf') - if self.parametres['type_graph'] == 4 : + if self.parametres['type_graph'] == 4: graphnb = 1 type = 'rglweb' dirout = os.path.dirname(self.pathout['mat01.csv']) @@ -926,46 +920,47 @@ class PrintSimiScript(PrintRScript) : graphnb +=1 self.filename = ffr(os.path.join(dirout,'webrgl_'+str(graphnb))) os.mkdir(self.filename) - - if self.parametres['arbremax'] : + if self.parametres['arbremax']: arbremax = 'TRUE' self.txtgraph += ' - arbre maximum' - else : arbremax = 'FALSE' - - if self.parametres['coeff_tv'] : + else: + arbremax = 'FALSE' + + if self.parametres['coeff_tv']: coeff_tv = self.parametres['coeff_tv_nb'] tvminmax = 'c(NULL,NULL)' - elif not self.parametres['coeff_tv'] or self.parametres.get('sformchi', False) : + elif not self.parametres['coeff_tv'] or self.parametres.get('sformchi', False): coeff_tv = 'NULL' tvminmax = 'c(%i, %i)' %(self.parametres['tvmin'], self.parametres['tvmax']) - if self.parametres['coeff_te'] : coeff_te = 'c(%i,%i)' % (self.parametres['coeff_temin'], self.parametres['coeff_temax']) - else : coeff_te = 'NULL' - - if self.parametres['vcex'] or self.parametres.get('cexfromchi', False) : + if self.parametres['coeff_te']: + coeff_te = 'c(%i,%i)' % (self.parametres['coeff_temin'], self.parametres['coeff_temax']) + else: + coeff_te = 'NULL' + if self.parametres['vcex'] or self.parametres.get('cexfromchi', False): vcexminmax = 'c(%i/10,%i/10)' % (self.parametres['vcexmin'],self.parametres['vcexmax']) - else : + else: vcexminmax = 'c(NULL,NULL)' - if not self.parametres['label_v'] : label_v = 'FALSE' - else : label_v = 'TRUE' - - if not self.parametres['label_e'] : label_e = 'FALSE' - else : label_e = 'TRUE' - - if self.parametres['seuil_ok'] : seuil = str(self.parametres['seuil']) - else : seuil = 'NULL' - - if not self.parametres.get('edgecurved', False) : + if not self.parametres['label_v']: + label_v = 'FALSE' + else: + label_v = 'TRUE' + if not self.parametres['label_e']: + label_e = 'FALSE' + else: + label_e = 'TRUE' + if self.parametres['seuil_ok']: + seuil = str(self.parametres['seuil']) + else: + seuil = 'NULL' + if not self.parametres.get('edgecurved', False): ec = 'FALSE' - else : + else: ec = 'TRUE' - txt += """ edge.curved <- %s """ % ec - cols = str(self.parametres['cols']).replace(')',', max=255)') cola = str(self.parametres['cola']).replace(')',',max=255)') - txt += """ minmaxeff <- %s """ % tvminmax @@ -975,12 +970,11 @@ class PrintSimiScript(PrintRScript) : txt += """ cex = %i/10 """ % self.parametres['cex'] - - if self.parametres['film'] : + if self.parametres['film']: txt += """ film <- "%s" """ % ffr(self.pathout['film']) - else : + else: txt += """ film <- NULL """ @@ -992,7 +986,6 @@ class PrintSimiScript(PrintRScript) : } } """ % seuil - txt += """ label.v <- %s label.e <- %s @@ -1005,14 +998,14 @@ class PrintSimiScript(PrintRScript) : width <- %i height <- %i """ % (self.parametres['width'], self.parametres['height']) - if self.parametres['keep_coord'] : + if self.parametres['keep_coord']: txt += """ coords <- try(coords, TRUE) if (!is.matrix(coords)) { coords<-NULL } """ - else : + else: txt += """ coords <- NULL """ @@ -1022,15 +1015,15 @@ class PrintSimiScript(PrintRScript) : txt += """ alpha <- %i/100 """ % self.parametres['alpha'] -############################################# - if self.parametres.get('bystar',False) : + ######### ??? ########## + if self.parametres.get('bystar',False): txt += """ et <- list() """ - for i, line in enumerate(self.parametres['listet']) : + for i, line in enumerate(self.parametres['listet']): txt+= """ et[[%i]] <- c(%s) - """ % (i+1, ','.join([`val + 1` for val in line])) + """ % (i+1, ','.join([repr(val + 1) for val in line])) txt+= """ unetoile <- c('%s') """ % ("','".join([val for val in self.parametres['selectedstars']])) @@ -1059,14 +1052,13 @@ class PrintSimiScript(PrintRScript) : chivertex.size <- norm.vec(toblack, vcexminmax[1], vcexminmax[2]) """ % (ffr(self.analyse.parent.RscriptsPath['chdfunct'])) - else : + else: txt += """ vertex.label.color <- 'black' chivertex.size <- 1 leg<-NULL """ -############################################# - + ######### ??? ########## # txt += """ # eff <- colSums(dm) # g.ori <- graph.adjacency(mat, mode='lower', weighted = TRUE) @@ -1088,13 +1080,13 @@ class PrintSimiScript(PrintRScript) : # g.toplot <- g.ori # } # """ - if self.parametres['com'] : - com = `self.parametres['communities']` - else : + if self.parametres['com']: + com = repr(self.parametres['communities']) + else: com = 'NULL' - if self.parametres['halo'] : + if self.parametres['halo']: halo = 'TRUE' - else : + else: halo = 'FALSE' txt += """ communities <- %s @@ -1105,25 +1097,24 @@ class PrintSimiScript(PrintRScript) : x <- list(mat = mat, eff = eff) graph.simi <- do.simi(x, method='%s', seuil = seuil, p.type = '%s', layout.type = '%s', max.tree = %s, coeff.vertex=%s, coeff.edge = %s, minmaxeff = minmaxeff, vcexminmax = vcexminmax, cex = cex, coords = coords, communities = communities, halo = halo, index.word=index) """ % (method, type, layout, arbremax, coeff_tv, coeff_te) - - if self.parametres.get('bystar',False) : - if self.parametres.get('cexfromchi', False) : + if self.parametres.get('bystar',False): + if self.parametres.get('cexfromchi', False): txt+=""" label.cex<-chivertex.size """ - else : + else: txt+=""" label.cex <- cex """ - if self.parametres.get('sfromchi', False) : + if self.parametres.get('sfromchi', False): txt += """ vertex.size <- norm.vec(toblack, minmaxeff[1], minmaxeff[2]) """ - else : + else: txt += """ vertex.size <- NULL """ - else : + else: #print self.parametres if (self.parametres['type'] == 'clustersimitxt' and self.parametres.get('tmpchi', False)) or (self.parametres['type'] in ['simimatrix','simiclustermatrix'] and 'tmpchi' in self.parametres): txt += """ @@ -1133,11 +1124,11 @@ class PrintSimiScript(PrintRScript) : txt += """ lchi <- lchi[sel.col] """ - if self.parametres['type'] in ['clustersimitxt', 'simimatrix', 'simiclustermatrix'] and self.parametres.get('cexfromchi', False) : + if self.parametres['type'] in ['clustersimitxt', 'simimatrix', 'simiclustermatrix'] and self.parametres.get('cexfromchi', False): txt += """ label.cex <- norm.vec(lchi, vcexminmax[1], vcexminmax[2]) """ - else : + else: txt += """ if (is.null(vcexminmax[1])) { label.cex <- cex @@ -1150,7 +1141,7 @@ class PrintSimiScript(PrintRScript) : vertex.size <- norm.vec(lchi, minmaxeff[1], minmaxeff[2]) if (!length(vertex.size)) vertex.size <- 0 """ - else : + else: txt += """ if (is.null(minmaxeff[1])) { vertex.size <- 0 @@ -1159,8 +1150,10 @@ class PrintSimiScript(PrintRScript) : } """ #txt += """ vertex.size <- NULL """ - if self.parametres['svg'] : svg = 'TRUE' - else : svg = 'FALSE' + if self.parametres['svg']: + svg = 'TRUE' + else: + svg = 'FALSE' txt += """ svg <- %s """ % svg @@ -1196,19 +1189,20 @@ class PrintSimiScript(PrintRScript) : coords <- plot.simi(graph.simi, p.type='%s',filename="%s", vertex.label = label.v, edge.label = label.e, vertex.col = vertex.col, vertex.label.color = vertex.label.color, vertex.label.cex=label.cex, vertex.size = vertex.size, edge.col = cola, leg=leg, width = width, height = height, alpha = alpha, movie = film, edge.curved = edge.curved, svg = svg) save.image(file="%s") """ % (type, self.filename, ffr(self.pathout['RData'])) - self.add(txt) self.write() -class WordCloudRScript(PrintRScript) : - def make_script(self) : + +class WordCloudRScript(PrintRScript): + + def make_script(self): self.sources([self.analyse.parent.RscriptsPath['Rgraph']]) self.packages(['wordcloud']) bg_col = Rcolor(self.parametres['col_bg']) txt_col = Rcolor(self.parametres['col_text']) - if self.parametres['svg'] : + if self.parametres['svg']: svg = 'TRUE' - else : + else: svg = 'FALSE' txt = """ svg <- %s @@ -1231,13 +1225,15 @@ class WordCloudRScript(PrintRScript) : self.add(txt) self.write() -class ProtoScript(PrintRScript) : - def make_script(self) : + +class ProtoScript(PrintRScript): + + def make_script(self): self.sources([self.analyse.parent.RscriptsPath['Rgraph'], self.analyse.parent.RscriptsPath['prototypical.R']]) self.packages(['wordcloud']) - if self.parametres.get('cloud', False) : + if self.parametres.get('cloud', False): cloud = 'TRUE' - else : + else: cloud = 'FALSE' txt = """ errorn <- function(x) { @@ -1255,24 +1251,26 @@ class ProtoScript(PrintRScript) : self.write() -class ExportAfc(PrintRScript) : - def make_script(self) : +class ExportAfc(PrintRScript): + + def make_script(self): self.source([self.analyse.parent.RscriptsPath['Rgraph']]) self.packages(['rgexf']) txt = """ """ -class MergeGraphes(PrintRScript) : + +class MergeGraphes(PrintRScript): + def __init__(self, analyse): - self.script = u"#Script genere par IRaMuTeQ - %s\n" % datetime.now().ctime() + self.script = "#Script genere par IRaMuTeQ - %s\n" % datetime.now().ctime() self.pathout = PathOut() self.parametres = analyse.parametres self.scriptout = self.pathout['temp'] self.analyse = analyse - def make_script(self) : + def make_script(self): #FIXME - txt = """ library(igraph) library(Matrix) @@ -1284,9 +1282,9 @@ class MergeGraphes(PrintRScript) : V(g)$weight <- (graph.simi$mat.eff/nrow(dm))*100 graphs[['%s']] <- g """ - for i, graph in enumerate(self.parametres['graphs']) : + for i, graph in enumerate(self.parametres['graphs']): path = os.path.dirname(graph) - gname = ''.join(['g', `i`]) + gname = ''.join(['g', repr(i)]) RData = os.path.join(path,'RData.RData') txt += load % (ffr(RData), gname) self.add(txt) @@ -1302,8 +1300,10 @@ class MergeGraphes(PrintRScript) : write.graph(ng, "%s", format = 'graphml') """ % ffr(self.parametres['grapheout']) self.add(txt) - + + class TgenSpecScript(PrintRScript): + def make_script(self): self.packages(['textometry']) txt = """ @@ -1323,8 +1323,10 @@ class TgenSpecScript(PrintRScript): write.table(result, file = "%s", sep='\\t', col.names = NA) """ % ffr(self.pathout['tgenspec.csv']) self.add(txt) - + + class TgenProfScript(PrintRScript): + def make_script(self): self.sources([self.analyse.ira.RscriptsPath['chdfunct']]) txt = """ @@ -1344,8 +1346,10 @@ class TgenProfScript(PrintRScript): write.table(reslem$pchi2, file = "%s", sep='\\t', col.names = NA) """ % (ffr(self.pathout['tgenlemchi2.csv']), ffr(self.pathout['tgenlempchi2.csv'])) self.add(txt) - + + class FreqMultiScript(PrintRScript): + def make_script(self): self.sources([self.analyse.parent.RscriptsPath['Rgraph']]) txt = """ @@ -1371,8 +1375,10 @@ class FreqMultiScript(PrintRScript): self.add(txt) self.write() -class LabbeScript(PrintRScript) : - def make_script(self) : + +class LabbeScript(PrintRScript): + + def make_script(self): self.sources([self.analyse.parent.RscriptsPath['distance-labbe.R'], self.analyse.parent.RscriptsPath['Rgraph']]) txt = """ @@ -1427,10 +1433,12 @@ class LabbeScript(PrintRScript) : self.add(txt) self.write() -class ChronoChi2Script(PrintRScript) : - def make_script(self) : + +class ChronoChi2Script(PrintRScript): + + def make_script(self): self.sources([self.analyse.parent.RscriptsPath['Rgraph']]) - print self.parametres + print(self.parametres) txt = """ inRData <- "%s" dendrof <- "%s" @@ -1450,7 +1458,7 @@ class ChronoChi2Script(PrintRScript) : ptc <- tcp/sum(tcp) dpt <- t(dpt) dd <- dpt - """ % self.parametres['var'].replace(u'*', u"\\\\*") + """ % self.parametres['var'].replace('*', "\\\\*") txt += """ classes <- n1[,ncol(n1)] tcl <- table(classes) @@ -1459,7 +1467,6 @@ class ChronoChi2Script(PrintRScript) : tcl <- tcl[-to.vire] } tclp <- tcl/sum(tcl) - #chi2 colors library(ape) k <- 1e-02 @@ -1511,7 +1518,6 @@ class ChronoChi2Script(PrintRScript) : last.col <- c(last.col, rgb(r=col2rgb(mcol)[1]/255, g=col2rgb(mcol)[2]/255, b=col2rgb(mcol)[3]/255, a=k)) } #print(last.col) - barplot(rep(1,ncol(dd)), width=ptc, names.arg=FALSE, axes=FALSE, col=last.col[lcol], border=rgb(r=0, g=0, b=0, a=0.3)) } plot(0,type='n',axes=FALSE,ann=FALSE) @@ -1522,10 +1528,12 @@ class ChronoChi2Script(PrintRScript) : self.add(txt) self.write() -class ChronoPropScript(PrintRScript) : - def make_script(self) : + +class ChronoPropScript(PrintRScript): + + def make_script(self): self.sources([self.analyse.parent.RscriptsPath['Rgraph']]) - print self.parametres + print(self.parametres) txt = """ inRData <- "%s" dendrof <- "%s" @@ -1545,7 +1553,7 @@ class ChronoPropScript(PrintRScript) : ptc <- tcp/sum(tcp) dpt <- t(dpt) dd <- dpt - """ % self.parametres['var'].replace(u'*', u"\\\\*") + """ % self.parametres['var'].replace('*', "\\\\*") txt += """ classes <- n1[,ncol(n1)] tcl <- table(classes) @@ -1567,10 +1575,12 @@ class ChronoPropScript(PrintRScript) : self.add(txt) self.write() -class ChronoggScript(PrintRScript) : - def make_script(self) : + +class ChronoggScript(PrintRScript): + + def make_script(self): self.sources([self.analyse.parent.RscriptsPath['Rgraph']]) - print self.parametres + print(self.parametres) txt = """ library(ggplot2) inRData <- "%s" @@ -1591,7 +1601,7 @@ class ChronoggScript(PrintRScript) : ptc <- tcp/sum(tcp) dpt <- t(dpt) dd <- dpt - """ % self.parametres['var'].replace(u'*', u"\\\\*") + """ % self.parametres['var'].replace('*', "\\\\*") txt += """ classes <- n1[,ncol(n1)] tcl <- table(classes) @@ -1619,31 +1629,33 @@ class ChronoggScript(PrintRScript) : self.add(txt) self.write() -class DendroScript(PrintRScript) : - def make_script(self) : - if self.parametres['svg'] : + +class DendroScript(PrintRScript): + + def make_script(self): + if self.parametres['svg']: typefile = '.svg' - else : + else: typefile = '.png' fileout = self.parametres['fileout'] width = self.parametres['width'] height = self.parametres['height'] type_dendro = self.parametres['dendro_type'] - if self.parametres['taille_classe'] : + if self.parametres['taille_classe']: tclasse = 'TRUE' - else : + else: tclasse = 'FALSE' - if self.parametres['color_nb'] == 0 : + if self.parametres['color_nb'] == 0: bw = 'FALSE' - else : + else: bw = 'TRUE' - if self.parametres['type_tclasse'] == 0 : + if self.parametres['type_tclasse'] == 0: histo='FALSE' - else : + else: histo = 'TRUE' - if self.parametres['svg'] : + if self.parametres['svg']: svg = 'TRUE' - else : + else: svg = 'FALSE' dendro_path = self.pathout['Rdendro'] classe_path = self.pathout['uce'] @@ -1654,12 +1666,12 @@ class DendroScript(PrintRScript) : classes <- read.csv2("%s", row.names=1) classes <- classes[,1] """ % (ffr(dendro_path), ffr(self.parametres['Rgraph']), ffr(classe_path)) - if self.parametres['dendro'] == 'simple' : + if self.parametres['dendro'] == 'simple': txt += """ open_file_graph("%s", width=%i, height=%i, svg=%s) plot.dendropr(tree.cut1$tree.cl, classes, type.dendro="%s", histo=%s, bw=%s, lab=NULL, tclasse=%s) """ % (ffr(fileout), width, height, svg, type_dendro, histo, bw, tclasse) - elif self.parametres['dendro'] == 'texte' : + elif self.parametres['dendro'] == 'texte': txt += """ load("%s") source("%s") @@ -1668,7 +1680,7 @@ class DendroScript(PrintRScript) : } chistable <- chistabletot[1:(debsup-1),] """ % (ffr(self.pathout['RData.RData']), ffr(self.parametres['Rgraph'])) - if self.parametres.get('translation', False) : + if self.parametres.get('translation', False): txt += """ rn <- read.csv2("%s", header=FALSE, sep='\t') rnchis <- row.names(chistable) @@ -1681,7 +1693,7 @@ class DendroScript(PrintRScript) : open_file_graph("%s", width=%i, height=%i, svg = %s) plot.dendro.prof(tree.cut1$tree.cl, classes, chistable, nbbycl = 60, type.dendro="%s", bw=%s, lab=NULL) """ % (ffr(fileout), width, height, svg, type_dendro, bw) - elif self.parametres['dendro'] == 'cloud' : + elif self.parametres['dendro'] == 'cloud': txt += """ load("%s") source("%s") @@ -1696,8 +1708,8 @@ class DendroScript(PrintRScript) : self.write() -class ReDoProfScript(PrintRScript) : - def make_script(self) : - self.sources([self.analyse.parent.RscriptsPath['chdfunct.R']]) - print self.parametres +class ReDoProfScript(PrintRScript): + def make_script(self): + self.sources([self.analyse.parent.RscriptsPath['chdfunct.R']]) + print(self.parametres) diff --git a/ProfList.py b/ProfList.py index 6b553e9..6038edb 100644 --- a/ProfList.py +++ b/ProfList.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 +#License: GNU/GPL #---------------------------------------------------------------------------- # Name: ListCtrl.py -# Author: Pierre Ratinaud -# - -#comes from ListCtrl.py from the demo tool of wxPython: +# comes from ListCtrl.py from the demo tool of wxPython: # Author: Robin Dunn & Gary Dumer # # Created: @@ -13,27 +14,40 @@ # Licence: wxWindows license #---------------------------------------------------------------------------- +#------------------------------------ +# import des modules python +#------------------------------------ import os -import wx -import wx.lib.mixins.listctrl as listmix +import codecs +from operator import itemgetter +from copy import copy +import webbrowser +import tempfile + +import langue +langue.run() + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx +import wx.lib.mixins.listctrl as listmix + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ from listlex import ListForSpec from chemins import ConstructPathOut, ffr from dialog import PrefUCECarac, SearchDial, message, BarFrame, ChronoFrame from tableau import copymatrix from search_tools import SearchFrame -import webbrowser -#import cStringIO -import tempfile -import codecs from functions import progressbar, treat_var_mod, doconcorde -from operator import itemgetter -from copy import copy -#--------------------------------------------------------------------------- + class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin): + def __init__(self, parent, gparent, profclasse, Alceste=False, cl=0, translation = False): wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES) - self.parent = parent self.Alceste = Alceste self.Source = gparent @@ -42,20 +56,19 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.var_mod = {} self.them_mod = {} self.ira = wx.GetApp().GetTopWindow() - line1 = profclasse.pop(0) classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****'] try : - self.lenact = profclasse.index([u'*****', u'*', u'*', u'*', u'*', u'*', '', '']) + self.lenact = profclasse.index(['*****', '*', '*', '*', '*', '*', '', '']) profclasse.pop(self.lenact) except ValueError: try : - self.lenact = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', '']) + self.lenact = profclasse.index(['*', '*', '*', '*', '*', '*', '', '']) profclasse.pop(self.lenact) except ValueError: self.lenact = len(profclasse) try : - self.lensup = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', '']) + self.lensup = profclasse.index(['*', '*', '*', '*', '*', '*', '', '']) self.lensup = self.lensup - self.lenact profclasse.pop(self.lensup) except ValueError: @@ -64,8 +77,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col # print self.lenact, self.lensup, self.lenet for i, line in enumerate(classen) : line[0] = i - dictdata = dict(zip([i for i in range(0,len(classen))], classen)) - + dictdata = dict(list(zip([i for i in range(0,len(classen))], classen))) if self.lenact != 0 : self.la = [dictdata[i][6] for i in range(0, self.lenact)] self.lchi = [dictdata[i][4] for i in range(0, self.lenact)] @@ -75,15 +87,13 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.lchi = [] self.lfreq = [] self.tmpchi = None - #adding some art self.il = wx.ImageList(16, 16) a={"sm_up":"GO_UP","sm_dn":"GO_DOWN","w_idx":"WARNING","e_idx":"ERROR","i_idx":"QUESTION"} - for k,v in a.items(): - s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v) + for k,v in list(a.items()): + s="self.%s= self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v) exec(s) self.SetImageList(self.il, wx.IMAGE_LIST_SMALL) - #adding some attributes (colourful background for each item rows) self.attr1 = wx.ListItemAttr() self.attr1.SetBackgroundColour((220, 220, 220)) @@ -97,8 +107,6 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.attr3.SetBackgroundColour((245, 180, 180)) self.attr3s = wx.ListItemAttr() self.attr3s.SetBackgroundColour((245, 190, 190)) - - self.InsertColumn(0, "num", wx.LIST_FORMAT_RIGHT) self.InsertColumn(1, "eff. s.t.", wx.LIST_FORMAT_RIGHT) self.InsertColumn(2, "eff. total", wx.LIST_FORMAT_RIGHT) @@ -107,8 +115,6 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT) self.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT) self.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT) - - self.SetColumnWidth(0, 60) self.SetColumnWidth(1, 70) self.SetColumnWidth(2, 80) @@ -117,32 +123,25 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.SetColumnWidth(5, 60) self.SetColumnWidth(6, 140) self.SetColumnWidth(7, wx.LIST_AUTOSIZE) - #These two should probably be passed to init more cleanly #setting the numbers of items = number of elements in the dictionary self.itemDataMap = dictdata - self.itemIndexMap = dictdata.keys() + self.itemIndexMap = list(dictdata.keys()) self.SetItemCount(len(dictdata)) - #mixins listmix.ListCtrlAutoWidthMixin.__init__(self) listmix.ColumnSorterMixin.__init__(self, len(classen[0])) - #sort by genre (column 2), A->Z ascending order (1) - self.SortListItems(0, 1) - + self.SortListItems(0, True) #events #self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnPopupTwo, self) #self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected) self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick) - # for wxMSW self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick) - # for wxGTK self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick) - #for searching search_id = wx.NewId() searchall_id = wx.NewId() @@ -153,16 +152,20 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), searchall_id)]) self.SetAcceleratorTable(self.accel_tbl) + def OnGetItemColumnImage(self, item, col): + return -1 + def OnGetItemImage(self, item): + pass def OnColClick(self,event): event.Skip() def OnItemSelected(self, event): - self.currentItem = event.m_itemIndex + self.currentItem = event.GetIndex() #event.m_itemIndex def OnItemActivated(self, event): - self.currentItem = event.m_itemIndex + self.currentItem = event.GetIndex() #event.m_itemIndex def getColumnText(self, index, col): item = self.GetItem(index, col) @@ -177,20 +180,10 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col def OnGetItemText(self, item, col): index=self.itemIndexMap[item] s = self.itemDataMap[index][col] - return s - - def OnGetItemImage(self, item): - index=self.itemIndexMap[item] - genre=self.itemDataMap[index][2] - - if genre=="Rock": - return self.w_idx - elif genre=="Jazz": - return self.e_idx - elif genre=="New Age": - return self.i_idx + if isinstance(s, (int, float)): + return str(s) else: - return -1 + return s #modification pour python 3 def OnGetItemAttr(self, item): index=self.itemIndexMap[item] @@ -218,13 +211,14 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col # the ColumnSorterMixin.__ColumnSorter() method already handles the ascending/descending, # and it knows to sort on another column if the chosen columns have the same value. - def SortItems(self,sorter=cmp): - items = list(self.itemDataMap.keys()) - items.sort(sorter) - self.itemIndexMap = items - - # redraw the list - self.Refresh() +# def SortItems(self,sorter=cmp): en version python2 + def SortItems(self, sorter=None): + listTemp = sorted(self.itemDataMap.items(), + key=lambda x:x[1][self._col], reverse= (self._colSortFlag[self._col]!=True)) + dlist = dict([[line[0],line[1]] for line in listTemp]) + self.itemDataMap = dlist + self.itemIndexMap = list(dlist.keys()) + self.Refresh() # redraw the list # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py def GetListCtrl(self): @@ -242,14 +236,13 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col def onsearchall(self, evt) : if 'FrameSearch' not in dir(self.Source) : - self.Source.FrameSearch = SearchFrame(self.parent, -1, _(u"Search...").decode('utf8'), self.Source.corpus) + self.Source.FrameSearch = SearchFrame(self.parent, -1, _("Search..."), self.Source.corpus) self.dial = SearchDial(self, self.Source.FrameSearch.liste, 1, False) self.dial.CenterOnParent() self.dial.Show() #self.dial.Destroy() def OnRightClick(self, event): - # only do this part the first time so the events are only bound once if self.Alceste: if not hasattr(self, "popupID1"): @@ -278,8 +271,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.onmaketgen = wx.NewId() self.onchronochi2 = wx.NewId() self.onchronoprop = wx.NewId() - # self.export_classes = wx.NewId() - + #self.export_classes = wx.NewId() self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1) self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2) self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) @@ -305,52 +297,48 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.Bind(wx.EVT_MENU, self.OnMakeTgen, id=self.onmaketgen) self.Bind(wx.EVT_MENU, self.OnChronoChi2, id=self.onchronochi2) self.Bind(wx.EVT_MENU, self.OnChronoProp, id=self.onchronoprop) - # self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes) - # self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) - + #self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes) + #self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) # make a menu menu = wx.Menu() - menu.Append(self.popupID1, _(u"Associated forms").decode('utf8')) - menu.Append(self.idtablex, _(u"Chi2 by cluster").decode('utf8')) - menu.Append(self.idlexdendro, _(u"Chi2 by cluster on dendrogram").decode('utf8')) - menu.Append(self.idchimod, _(u"Chi2 modalities of variable").decode('utf8')) + menu.Append(self.popupID1, _("Associated forms")) + menu.Append(self.idtablex, _("Chi2 by cluster")) + menu.Append(self.idlexdendro, _("Chi2 by cluster on dendrogram")) + menu.Append(self.idchimod, _("Chi2 modalities of variable")) menu_chrono = wx.Menu() - menu_chrono.Append(self.onchronochi2, _(u'Chi2').decode('utf8')) - menu_chrono.Append(self.onchronoprop, _(u'Proportion').decode('utf8')) - menu.AppendMenu(-1, _(u"Chronological view").decode('utf8'), menu_chrono) - menu.Append(self.idwordgraph, _(u"Word graph").decode('utf8')) + menu_chrono.Append(self.onchronochi2, _('Chi2')) + menu_chrono.Append(self.onchronoprop, _('Proportion')) + menu.Append(-1, _("Chronological view"), menu_chrono) + menu.Append(self.idwordgraph, _("Word graph")) #menu.Append(self.export_classes, u"Exporter le corpus...") - #menu.Append(self.popupID10, u"Spécificités") - menu_conc = wx.Menu() - menu_conc.Append(self.popupID2, _(u"In segments of this cluster").decode('utf8')) - menu_conc.Append(self.popupID3, _(u"In segments of this clustering").decode('utf8')) - menu_conc.Append(self.popupID4, _(u"In all segments").decode('utf8')) - menu.AppendMenu(-1, _(u"Concordance").decode('utf8'), menu_conc) - menu.Append(self.onmaketgen, _(u"Make Tgen").decode('utf8')) + menu_conc.Append(self.popupID2, _("In segments of this cluster")) + menu_conc.Append(self.popupID3, _("In segments of this clustering")) + menu_conc.Append(self.popupID4, _("In all segments")) + menu.Append(-1, _("Concordance"), menu_conc) + menu.Append(self.onmaketgen, _("Make Tgen")) menu_cnrtl = wx.Menu() - menu_cnrtl.Append(self.popupID5, _(u"Definition").decode('utf8')) - menu_cnrtl.Append(self.popupID6, _(u"Etymology").decode('utf8')) - menu_cnrtl.Append(self.popupID7, _(u"Synonymous").decode('utf8')) - menu_cnrtl.Append(self.popupID8, _(u"Antonym").decode('utf8')) - menu_cnrtl.Append(self.popupID9, _(u"Morphology").decode('utf8')) - menu_cnrtl.Append(self.popup_proxe, _(u"Proxemy").decode('utf8')) - menu.AppendMenu(-1, _(u"Tools from CNRTL (french only)").decode('utf8'), menu_cnrtl) + menu_cnrtl.Append(self.popupID5, _("Definition")) + menu_cnrtl.Append(self.popupID6, _("Etymology")) + menu_cnrtl.Append(self.popupID7, _("Synonymous")) + menu_cnrtl.Append(self.popupID8, _("Antonym")) + menu_cnrtl.Append(self.popupID9, _("Morphology")) + menu_cnrtl.Append(self.popup_proxe, _("Proxemy")) + menu.Append(-1, _("Tools from CNRTL (french only)"), menu_cnrtl) menu.AppendSeparator() - menu.Append(self.popupIDgraph, _(u"Graph of cluster").decode('utf8')) - menu.Append(self.idseg, _(u"Repeated segments").decode('utf8')) - menu.Append(self.iducecarac, _(u"Typical text segments").decode('utf8')) - menu.Append(self.idcloud, _(u"Word cloud of cluster").decode('utf8')) - menu.Append(self.idexport, _(u'Export...').decode('utf8')) - menu.Append(self.idexporttropes, _(u'Export for Tropes').decode('utf8')) - menu.Append(self.idexportowledge, _('Exporter for Owledge').decode('utf8')) + menu.Append(self.popupIDgraph, _("Graph of cluster")) + menu.Append(self.idseg, _("Repeated segments")) + menu.Append(self.iducecarac, _("Typical text segments")) + menu.Append(self.idcloud, _("Word cloud of cluster")) + menu.Append(self.idexport, _('Export...')) + menu.Append(self.idexporttropes, _('Export for Tropes')) + menu.Append(self.idexportowledge, _('Exporter for Owledge')) #menu.Append(self.popupID2, u"Concordancier") - # menu.Append(self.popupID3, "recharger") - + #menu.Append(self.popupID3, "recharger") self.PopupMenu(menu) menu.Destroy() - elif 'tableau' in dir(self.Source) : + elif 'tableau' in dir(self.Source): if not hasattr(self, "pop1"): self.pop1 = wx.NewId() self.pop2 = wx.NewId() @@ -358,16 +346,15 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col self.Bind(wx.EVT_MENU, self.quest_simi, id=self.pop1) self.Bind(wx.EVT_MENU, self.on_tablex, id=self.pop2) self.Bind(wx.EVT_MENU, self.quest_var_mod, id=self.pop3) - menu = wx.Menu() - menu.Append(self.pop2, _(u"Chi2 by cluster").decode('utf8')) - menu.Append(self.pop3, _(u"Chi2 modalities of variable").decode('utf8')) + menu.Append(self.pop2, _("Chi2 by cluster")) + menu.Append(self.pop3, _("Chi2 modalities of variable")) menu.AppendSeparator() - menu.Append(self.pop1, _(u"Graph of cluster").decode('utf8')) + menu.Append(self.pop1, _("Graph of cluster")) self.PopupMenu(menu) menu.Destroy() - def oncloud(self, evt) : + def oncloud(self, evt): if 'corpus' in dir(self.Source): corpus = self.Source.corpus prof = [[self.la[i], self.lchi[i], self.lfreq[i]] for i, val in enumerate(self.la)] @@ -386,7 +373,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col else : uci = True corpus.export_classe(self.Source.pathout['classe_%i_export.txt' % self.cl], self.cl, uci = uci) - dial = wx.MessageDialog(self, self.Source.pathout['classe_%i_export.txt' % self.cl], u"Export", wx.OK|wx.ICON_INFORMATION) + dial = wx.MessageDialog(self, self.Source.pathout['classe_%i_export.txt' % self.cl], "Export", wx.OK|wx.ICON_INFORMATION) dial.ShowModal() dial.Destroy() @@ -423,15 +410,14 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col def quest_var_mod(self, evt) : word = self.getselectedwords()[0] if len(word.split('_')) <= 1 : - dial = wx.MessageDialog(self, _(u"This is not a variable_modality form").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING) + dial = wx.MessageDialog(self, _("This is not a variable_modality form"), _("Problem"), wx.OK | wx.ICON_WARNING) dial.CenterOnParent() dial.ShowModal() dial.Destroy() return - if 'corpus' in dir(self.Source): corpus = self.Source.corpus - if word.startswith(u'-*') : + if word.startswith('-*') : if self.them_mod == {} : self.them_mod = self.Source.corpus.make_theme_dict() var_mod = self.them_mod @@ -451,13 +437,12 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col chistable.pop(0) vchistable = [line[1:] for line in chistable] fchistable = [line[0] for line in chistable] - var = word.split('_') #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]] try : words = [word for word in var_mod[var[0]]] except KeyError: - dial = wx.MessageDialog(self, _(u"This is not a meta-data").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING) + dial = wx.MessageDialog(self, _("This is not a meta-data"), _("Problem"), wx.OK | wx.ICON_WARNING) dial.CenterOnParent() dial.ShowModal() dial.Destroy() @@ -474,15 +459,14 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col def OnChronoChi2(self, evt) : word = self.getselectedwords()[0] if len(word.split('_')) <= 1 : - dial = wx.MessageDialog(self, _(u"This is not a variable_modality form").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING) + dial = wx.MessageDialog(self, _("This is not a variable_modality form"), _("Problem"), wx.OK | wx.ICON_WARNING) dial.CenterOnParent() dial.ShowModal() dial.Destroy() return - if 'corpus' in dir(self.Source): corpus = self.Source.corpus - if word.startswith(u'-*') : + if word.startswith('-*') : if self.them_mod == {} : self.them_mod = self.Source.corpus.make_theme_dict() var_mod = self.them_mod @@ -500,7 +484,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col try : words = [word for word in var_mod[var[0]]] except KeyError: - dial = wx.MessageDialog(self, _(u"This is not a meta-data").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING) + dial = wx.MessageDialog(self, _("This is not a meta-data"), _("Problem"), wx.OK | wx.ICON_WARNING) dial.CenterOnParent() dial.ShowModal() dial.Destroy() @@ -513,15 +497,14 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col def OnChronoProp(self, evt) : word = self.getselectedwords()[0] if len(word.split('_')) <= 1 : - dial = wx.MessageDialog(self, _(u"This is not a variable_modality form").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING) + dial = wx.MessageDialog(self, _("This is not a variable_modality form"), _("Problem"), wx.OK | wx.ICON_WARNING) dial.CenterOnParent() dial.ShowModal() dial.Destroy() return - if 'corpus' in dir(self.Source): corpus = self.Source.corpus - if word.startswith(u'-*') : + if word.startswith('-*') : if self.them_mod == {} : self.them_mod = self.Source.corpus.make_theme_dict() var_mod = self.them_mod @@ -539,7 +522,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col try : words = [word for word in var_mod[var[0]]] except KeyError: - dial = wx.MessageDialog(self, _(u"This is not a meta-data").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING) + dial = wx.MessageDialog(self, _("This is not a meta-data"), _("Problem"), wx.OK | wx.ICON_WARNING) dial.CenterOnParent() dial.ShowModal() dial.Destroy() @@ -549,7 +532,6 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col parametres = {'var' : vartoplot} ChronoFrame(self.Source.parent, parametres, self.Source.pathout, which = 'prop') - def quest_simi(self, evt) : tableau = self.Source.tableau tab = tableau.make_table_from_classe(self.cl, self.la) @@ -637,7 +619,6 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col 'pathout' : self.Source.parametres['pathout'], 'lem' : self.Source.parametres['lem'], 'tmpchi' : self.tmpchi} - self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self.ira, 4)) def on_segments(self,evt) : @@ -649,7 +630,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col else : uci = True l = [] - dlg.Update(1, u'Segments...') + dlg.Update(1, 'Segments...') for i in range(2,10) : li = corpus.find_segments_in_classe(uces, i, 1000, uci = uci) if li == [] : @@ -664,7 +645,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col first = ['','',''] para={'dico': d,'fline':first} dlg.Destroy() - win = wliste(self, -1, ' - '.join([_(u"Repeated segments").decode('utf8'), "Classe %i" % self.cl]), d, first, size=(600, 500)) + win = wliste(self, -1, ' - '.join([_("Repeated segments"), "Classe %i" % self.cl]), d, first, size=(600, 500)) win.Show(True) def on_uce_carac(self,evt) : @@ -682,7 +663,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col uci = True tab = corpus.make_table_with_classe(uces, self.la, uci = uci) tab.pop(0) - dlg.Update(2, u'score...') + dlg.Update(2, 'score...') if atype == 0 : ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1]),2) for line in tab] else : @@ -692,11 +673,11 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col ntab2.sort(reverse = True) ntab2 = ntab2[:limite] nuces = [val[1] for val in ntab2] - dlg.Update(3, u'concordancier...') + dlg.Update(3, 'concordancier...') ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci) items = dict([[i, '
    '.join([ucis_txt[i], '
    score : %.2f

    ' % ntab2[i][0], ucestxt[i]])] for i, uce in enumerate(nuces)]) dlg.Destroy() - win = message(self, items, ' - '.join([_(u"Typical text segments").decode('utf8'), "Classe %i" % self.cl]), (750, 600), uceids = nuces) + win = message(self, items, ' - '.join([_("Typical text segments"), "Classe %i" % self.cl]), (750, 600), uceids = nuces) #win.SetWindowStyle(wx.STAY_ON_TOP) #win.html = '\n' + '
    '.join(['
    '.join([ucis_txt[i], '
    score : %.2f
    ' % ntab2[i][0], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n' #win.HtmlPage.SetPage(win.html) @@ -769,19 +750,19 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col if 'corpus' in dir(self.Source) : corpus = self.Source.corpus uces = corpus.lc[self.cl-1] - win = self.make_concord(uces, ' - '.join([_(u"Concordance").decode('utf8'), "Classe %i" % self.cl])) + win = self.make_concord(uces, ' - '.join([_("Concordance"), "Classe %i" % self.cl])) win.Show(True) def OnPopupThree(self, event): corpus = self.Source.corpus uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] - win = self.make_concord(uces, ' - '.join([_(u"Concordance").decode('utf8'), _(u"Segments of this clustering").decode('utf8')])) + win = self.make_concord(uces, ' - '.join([_("Concordance"), _("Segments of this clustering")])) win.Show(True) def OnPopupFour(self, event): corpus = self.Source.corpus uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0 - win = self.make_concord(uces, ' - '.join([_(u"Concordance").decode('utf8'), _(u"All segments").decode('utf8')])) + win = self.make_concord(uces, ' - '.join([_("Concordance"), _("All segments")])) win.Show(True) def OnPopupFive(self, event): @@ -836,7 +817,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col rep.sort(key = itemgetter(1), reverse = True) #win = message(self, u"Formes associées", wx.Size(300, 200)) items = dict([[i, '\t:\t'.join([str(val) for val in forme])] for i, forme in enumerate(rep)]) - win = message(self, items, _(u"Associated forms").decode('utf8'), (300, 200)) + win = message(self, items, _("Associated forms"), (300, 200)) #win.html = '\n' + '
    '.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' #win.HtmlPage.SetPage(win.html) win.Show(True) @@ -846,10 +827,11 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col class wliste(wx.Frame): + def __init__(self, parent, id, title, d, fline, size=(600, 500)): wx.Frame.__init__(self, parent, id) self.liste = ListForSpec(self, parent, d, fline[1:], menu = False) - self.button_1 = wx.Button(self, -1, _(u"Close").decode('utf8')) + self.button_1 = wx.Button(self, -1, _("Close")) self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) self.__do_layout() diff --git a/Rlib/textometrieR/DESCRIPTION b/Rlib/textometrieR/DESCRIPTION deleted file mode 100644 index 817e7d0..0000000 --- a/Rlib/textometrieR/DESCRIPTION +++ /dev/null @@ -1,14 +0,0 @@ -Package: textometrieR -Type: Package -Title: Statistical exploration of textual corpora -Version: 0.5 -Date: 2009-01-18 -Author: Sylvain Loiseau, Vaudor Lise, Matthieu Decorde -Maintainer: Matthieu Decorde -Description: Statistical exploration of textual corpora using several methods - from french 'lexiometrie' and french 'Data Analysis' schools. It includes - methods for exploring irregularity of distribution of lexicon (or other - features) accross parts of texts; multidimensionnal exploration ('Analyse - des correspondances'), etc. -License: GPLv3 -Depends: R (>= 2.5.0) diff --git a/Rlib/textometrieR/NAMESPACE b/Rlib/textometrieR/NAMESPACE deleted file mode 100644 index 2bf07cc..0000000 --- a/Rlib/textometrieR/NAMESPACE +++ /dev/null @@ -1,7 +0,0 @@ -import("grDevices") - -# file "R/specificites.R" -export(pareto, specificites, specificites.probabilities, specificites.lexicon, specificites.lexicon.probabilities, cooccurrences, specificites.lexicon.new) - -# file "R/repartition.R" -export(printrepartition) diff --git a/Rlib/textometrieR/Read-and-delete-me b/Rlib/textometrieR/Read-and-delete-me deleted file mode 100644 index d04323a..0000000 --- a/Rlib/textometrieR/Read-and-delete-me +++ /dev/null @@ -1,9 +0,0 @@ -* Edit the help file skeletons in 'man', possibly combining help files - for multiple functions. -* Put any C/C++/Fortran code in 'src'. -* If you have compiled code, add a .First.lib() function in 'R' to load - the shared library. -* Run R CMD build to build the package tarball. -* Run R CMD check to check the package tarball. - -Read "Writing R Extensions" for more information. diff --git a/Rlib/textometrieR/cgt75.R b/Rlib/textometrieR/cgt75.R deleted file mode 100644 index a478386..0000000 --- a/Rlib/textometrieR/cgt75.R +++ /dev/null @@ -1,4 +0,0 @@ -f <- file(description = "cgt75.splitted.txt", open = "r", blocking = TRUE, encoding = "latin1"); -cgt75 <- readLines(f, n = -1, ok = TRUE, warn = TRUE); -# i <- grep("\\.", cgt75); -# get.contexts(factor(cgt75, "."); diff --git a/Rlib/textometrieR/cgt75.splitted.txt b/Rlib/textometrieR/cgt75.splitted.txt deleted file mode 100644 index 0ba097e..0000000 --- a/Rlib/textometrieR/cgt75.splitted.txt +++ /dev/null @@ -1,39240 +0,0 @@ -< -S00 -= -02 -> -< -S01 -= -003 -> -< -S02 -= -001 -> -< -S03 -= -001 -> -< -Sda -= -1975 -> -< -Sdm -= -06 -> -< -Sat -= -0 -> -< -S10 -= -1 -> -document -d -' -orientation -de -la -CGT -. -. -< -S10 -= -0 -> -§ -deux -données -essentielles -caractérisent -la -situation -, -déterminent -le -comportement -des -diverses -forces -sociales -et -politiques -et -situent -par -conséquent -les -conditions -de -l -' -action -syndicale -$ -: -_ -l -' -aggravation -de -la -crise -qui -affecte -l -' -économie -et -la -vie -du -pays -; -_ -la -montée -de -la -volonté -de -changement -et -les -perspectives -qu -' -offre -l -' -union -de -la -gauche -sur -la -base -de -son -* -programme -commun -de -gouvernement -. -§ -dans -sa -manifestation -la -plus -immédiate -et -la -plus -sensible -aux -travailleurs -la -crise -se -traduit -par -de -sérieuses -atteintes -au -pouvoir -d -' -achat -de -leurs -salaires -, -retraites -et -prestations -sociales -, -par -la -montée -du -chômage -, -l -' -aggravation -de -leurs -conditions -de -travail -et -d -' -existence -. -§ -mais -la -dimension -de -cette -crise -est -plus -vaste -. -elle -affecte -_ -les -précédents -* -congrès -de -la -CGT -l -' -ont -déjà -souligné -_ -l -' -ensemble -de -la -vie -du -pays -, -sous -tous -ses -aspects -essentiels -$ -: -économique -, -social -, -politique -, -culturel -, -moral -. -§ -elle -met -en -cause -les -fondements -de -la -société -capitaliste -et -pose -la -nécessité -de -transformations -profondes -touchant -aux -structures -économiques -et -sociales -de -la -société -. -§ -c -' -est -dans -ce -contexte -de -crise -profonde -et -durable -de -l -' -ensemble -des -grands -pays -capitalistes -que -se -situe -l -' -aggravation -de -la -situation -économique -. -elle -se -manifeste -par -une -poussée -beaucoup -plus -forte -d -' -une -inflation -depuis -longtemps -permanente -. -cette -inflation -se -combine -avec -une -montée -considérable -du -chômage -et -un -déclin -du -développement -économique -. -il -est -faux -d -' -attribuer -cette -situation -au -prix -du -pétrole -et -des -matières -premières -. -§ -la -récession -de -1974 -- -1975 -est -la -plus -forte -que -les -économies -capitalistes -aient -connu -depuis -la -deuxième -guerre -mondiale -. -§ -il -ne -s -' -agit -pas -seulement -d -' -une -période -défavorable -accentuée -, -mais -d -' -un -dérèglement -durable -en -profondeur -de -l -' -économie -capitaliste -qui -est -le -fond -de -la -crise -. -§ -le -dérèglement -en -profondeur -de -l -' -économie -capitaliste -mondiale -est -à -la -base -de -la -crise -. -il -résulte -de -l -' -exploitationet -de -la -course -au -profit -poussées -jusqu -' -à -leurs -limites -dans -tous -les -pays -où -l -' -* -état -est -l -' -instrument -des -grandes -sociétés -capitalistes -. -parmi -ces -pays -, -les -Etats -- -Unis -occupent -une -position -dominante -, -et -l -' -économie -américaine -pèse -d -' -un -poids -déterminant -. -§ -l -' -accumulation -des -profits -extraordinaires -réalisés -par -les -grandes -sociétés -, -les -moyens -employés -pour -maintenir -ces -profits -et -les -accroître -, -même -au -prix -d -' -énormes -gaspillages -, -la -militarisation -de -l -' -économie -, -en -particulier -aux -USA -, -sont -à -l -' -origine -de -l -' -inflation -, -de -la -crise -du -système -monétaire -et -des -relations -économiques -des -pays -capitalistes -ainsi -que -de -tous -les -désordres -économiques -qui -les -accompagnent -. -§ -la -place -prépondérante -des -sociétés -multinationales -dans -l -' -ensemble -du -monde -capitaliste -et -dans -les -pays -en -voie -de -développement -, -leurs -dimensions -, -la -nature -de -leurs -activités -en -font -l -' -un -des -principaux -facteurs -des -perturbations -économiques -, -un -danger -pour -les -travailleurs -, -pour -l -' -indépendance -des -peuples -et -les -droits -des -* -états -. -§ -cette -malfaisance -s -' -exerce -également -en -Europe -occidentale -et -particulièrement -au -sein -du -marché -commun -. -l -' -ensemble -des -phénomènes -de -crise -s -' -y -manifestent -. -les -sociétés -multinationales -y -sont -pour -les -deux -tiers -sous -la -domination -des -groupes -financiers -et -industriels -américains -, -en -particulier -dans -les -secteurs -de -pointe -. -§ -elles -assoient -leur -emprise -avec -l -' -appui -des -gouvernements -qui -facilitent -l -' -interpénétration -des -capitaux -publics -et -privés -au -profit -de -ces -derniers -. -§ -les -contradictions -s -' -aiguisent -au -sein -du -* -marché -commun -alors -que -le -capital -ouest -- -allemand -y -joue -le -rôle -principal -et -que -se -renforce -la -dépendance -à -l -' -égard -des -USA -. -§ -les -abandons -de -souveraineté -opérés -par -le -* -pouvoir -portent -gravement -préjudice -à -l -' -indépendance -nationale -de -la -France -menacée -par -les -projets -de -supranationalité -et -replacée -pratiquement -dans -le -giron -atlantique -. -la -volonté -d -' -unification -des -politiques -économiques -et -sociales -vise -à -renforcer -le -front -des -patrons -et -des -gouvernements -contre -les -travailleurs -de -ces -pays -. -§ -en -France -, -la -crise -a -les -mêmes -causes -profondes -que -dans -les -autres -pays -capitalistes -. -l -' -économie -est -dominée -par -un -petit -nombre -de -groupes -financiers -géants -qui -augmentent -leurs -richesses -et -leur -puissance -au -détriment -des -travailleurs -et -du -pays -. -la -politique -menée -depuis -des -années -, -avec -pour -but -essentiel -leurs -profits -et -le -renforcement -de -leurs -positions -à -l -' -échelle -nationale -et -internationale -, -a -plongé -le -pays -dans -la -crise -. -§ -la -politique -d -' -austérité -imposée -par -le -gouvernement -sous -prétexte -d -' -endiguer -la -crise -ne -s -' -attaque -pas -à -l -' -inflation -qui -est -source -de -profits -accrus -. -elle -l -' -entretientet -augmente -le -chômage -. -§ -les -promesses -gouvernementales -d -' -amélioration -de -la -situation -économique -sont -contredites -par -la -réalité -. -§ -les -milliards -distribués -sous -prétexte -de -relance -gonflent -les -profits -et -alimentent -l -' -inflation -. -§ -l -' -orientation -prévue -pour -le -* -7ème -plan -est -une -prolongation -de -la -politique -d -' -austérité -. -elle -ne -peut -assurer -le -taux -de -croissance -mensongèrement -affiché -. -elle -vise -à -diminuer -brutalement -le -pouvoir -d -' -achat -par -une -politique -des -revenus -. -le -nombre -de -chômeurs -, -déjà -égal -à -1200000 -au -début -de -1975 -, -risque -sérieusement -d -' -augmenter -encore -dans -une -forte -proportion -. -§ -le -* -pouvoir -des -féodalités -capitalistes -ne -peut -combattre -efficacement -ni -l -' -inflation -, -ni -le -chômage -. -loin -de -s -' -attaquerà -leurs -causes -réelles -, -il -veut -faire -supporter -les -frais -de -la -crise -aux -travailleurs -et -saisir -cette -occasion -pour -accélérer -la -concentration -capitaliste -, -l -' -élimination -d -' -entreprises -petites -, -moyennes -et -parfois -grandes -. -le -" -redéploiement -de -l -' -industrie -" -consiste -principalement -à -mettre -les -ressources -du -pays -et -les -moyens -de -financement -et -d -' -action -économiques -de -l -' -* -état -à -la -disposition -des -groupes -industriels -et -financiers -susceptibles -d -' -atteindre -la -dimension -multinationale -. -§ -le -budget -, -la -fiscalité -, -la -politique -du -crédit -, -la -politique -des -prix -, -la -politique -de -tarifs -et -de -transferts -d -' -activités -bénéficiaires -des -services -publics -et -des -entreprises -nationalisées -vers -le -secteur -privé -, -tous -les -moyens -sont -mis -en -oeuvre -par -le -* -pouvoir -pour -répondre -aux -exigences -des -principaux -groupes -capitalistes -. -§ -le -* -pouvoir -giscardien -pousse -plus -avant -l -' -interpénétration -et -la -conjonction -des -moyens -de -l -' -* -état -et -des -monopoles -, -au -service -de -ces -derniers -, -c -' -est -- -à -- -dire -le -capitalisme -monopoliste -d -' -* -état -. -§ -pour -cette -raison -il -ne -peut -qu -' -aggraver -la -crise -qui -mine -la -société -française -. -§ -la -confiscation -, -par -une -minorité -toujours -plus -restreinte -et -plus -puissante -des -richesses -du -travail -du -plus -grand -nombre -et -des -moyens -de -la -direction -de -l -' -économie -conduit -aux -aberrations -les -plus -choquantes -$ -: -la -baisse -du -niveau -de -vie -des -travailleurs -et -le -chômage -, -l -' -énormité -des -gaspillages -des -forces -humaines -et -matérielles -, -le -sacrifice -des -équipements -collectifs -, -les -injustices -de -toutes -sortes -. -§ -face -au -bilan -désastreux -d -' -un -système -condamné -, -une -puissante -force -de -transformation -a -grandi -et -s -' -est -mise -en -mouvement -. -la -résistance -des -travailleurs -s -' -est -renforcée -, -leur -pression -revendicative -s -' -est -exprimée -par -la -montée -des -luttes -sociales -. -la -signature -du -* -programme -commun -de -gouvernement -entre -le -* -parti -communiste -, -le -* -parti -socialiste -et -le -* -mouvement -des -radicaux -de -gauche -, -avec -le -soutien -de -la -CGT -a -constitué -un -tournant -. -§ -en -se -prononçant -pour -la -réalisation -de -ce -programme -, -lors -de -l -' -élection -présidentielle -de -mai -1974 -, -plus -de -49 -% -des -électeurs -ont -démontré -que -le -changement -véritable -, -fondé -sur -des -réformes -profondes -est -possible -, -qu -' -il -peut -devenir -la -volonté -majoritaire -du -peuple -. -§ -cette -situation -crée -un -nouveau -rapport -de -force -dans -le -pays -. -§ -les -travailleurs -y -puisent -un -grand -espoir -, -une -plus -grande -confiance -en -leurs -forces -. -§ -ils -y -trouvent -des -conditions -plus -favorables -pour -leurs -luttes -revendicatives -, -pour -défendre -avec -succès -leurs -intérêts -les -plus -urgents -, -obtenir -certains -résultats -, -mettre -en -échec -certaines -mesures -antisociales -. -le -* -pouvoir -et -le -* -patronat -doivent -en -tenir -compte -. -§ -dans -cette -situation -des -possibilités -nouvelles -existent -pour -gagner -de -nouvelles -forces -, -de -nouvelles -couches -aux -luttes -immédiates -et -à -l -' -idée -des -changements -qui -seuls -sont -de -nature -à -permettre -la -solution -effective -et -durable -des -grands -problèmes -posés -à -la -société -. -§ -mais -leur -attitude -est -également -dictée -par -l -' -étroitesse -de -la -marge -d -' -action -dont -ils -disposent -. -§ -d -' -une -part -, -le -maintien -et -l -' -accroissement -des -profits -des -grandes -sociétés -dans -le -contexte -de -la -crise -économique -exigent -une -politique -aux -conséquences -sociales -aggravées -. -d -' -autrepart -, -toute -concession -aux -revendications -démontre -qu -' -il -est -possible -de -les -satisfaire -et -qu -' -une -autre -politique -peut -être -mise -en -oeuvre -. -§ -* -pouvoir -et -* -patronat -s -' -efforcent -donc -, -dans -ces -nouvelles -conditions -, -de -s -' -adapter -pour -maintenir -une -résistance -acharnée -aux -revendications -, -poursuivre -et -aggraver -leur -politique -. -ils -s -' -efforcent -également -de -contrarier -par -tous -les -moyens -l -' -évolution -des -masses -populaires -vers -l -' -idée -du -changement -. -§ -c -' -est -dans -cet -ensemble -de -circonstances -qu -' -il -convient -de -définir -les -positions -, -les -tâches -et -l -' -action -de -la -CGT -. -< -S10 -= -1 -> -l -' -action -revendicative -et -l -' -unité -d -' -action -syndicale -. -. -< -S10 -= -0 -> -§ -le -* -patronat -et -le -* -gouvernement -giscardien -s -' -efforcent -de -mettre -à -profit -la -situation -économique -dont -ils -sont -responsables -pour -comprimer -le -pouvoir -d -' -achat -des -salaires -, -faire -admettre -le -chômage -, -les -fermetures -d -' -entreprises -, -les -licenciements -, -pour -aggraver -les -conditions -de -travail -, -alourdir -les -impôts -payés -par -les -salariés -, -déprécier -les -prestations -sociales -et -familiales -, -renforcer -l -' -exploitationdes -travailleurs -français -et -immigrés -. -§ -pour -y -parvenir -ils -usent -de -tous -les -moyens -dont -ils -peuvent -disposer -$ -: -_ -l -' -intransigeance -globale -dans -toutes -les -négociations -et -le -détournement -d -' -une -véritable -politique -contractuelle -par -la -conclusion -avec -des -organisations -minoritaires -, -d -' -accords -de -collaboration -à -la -politique -d -' -austérité -; -_ -la -démagogie -sous -ses -diverses -variantes -, -plus -ou -moins -renouvelées -en -dernier -lieu -le -thème -de -la -" -réforme -de -l -' -entreprise -" -, -pour -tenter -inlassablement -de -détourner -les -travailleurs -des -réalités -sociales -et -de -la -défense -de -leurs -intérêts -de -classe -; -_ -la -tentative -de -domestiquer -toute -l -' -information -et -la -mise -en -oeuvre -des -moyens -énormes -de -pression -idéologique -pour -faire -admettre -l -' -inéluctabilité -de -la -crise -et -de -l -' -austérité -, -jouer -de -l -' -inquiétude -pour -l -' -emploi -, -et -dénaturer -la -lutte -de -la -CGT -et -de -toutes -les -forces -démocratiques -; -_ -l -' -extension -des -méthodes -plus -perfectionnées -d -' -exploitation -sous -couvert -d -' -une -prétendue -participation -ou -d -' -une -organisation -différente -du -travail -; -_ -la -division -entre -travailleurs -de -diverses -catégories -; -_ -la -tentative -de -mettre -en -selle -la -collaboration -de -classe -comme -une -institution -permanente -( -accords -séparés -, -collusion -dans -les -organismes -paritaires -, -concertation -avec -le -gouvernement -, -utilisation -abusive -de -l -' -information -officielle -et -de -la -formation -professionnelle -) -; -_ -l -' -attaque -généralisée -contre -les -libertés -syndicales -et -le -droit -de -grève -, -les -mesures -de -répression -arbitraires -et -illégales -, -l -' -emploi -de -la -force -policière -, -des -milices -privées -armées -, -contre -les -grévistes -dans -les -entreprises -. -§ -c -' -est -aussi -dans -ce -cadre -qu -' -il -faut -placer -le -recours -par -certains -patrons -, -avec -la -complicité -et -le -soutien -direct -du -pouvoir -, -à -des -syndicats -maison -, -des -officines -patronales -comme -la -CFT -, -des -entreprises -de -louage -d -' -hommes -de -main -employant -des -méthodes -fascistes -. -§ -loin -d -' -être -un -signe -de -force -, -ces -pratiques -sont -un -signe -des -difficultés -de -la -bourgeoisie -. -§ -elles -constituent -néanmoins -un -grave -danger -pour -les -libertés -. -elles -s -' -inscrivent -dans -un -processus -de -renforcement -du -système -autoritaire -. -c -' -est -pourquoi -elles -doivent -recevoir -les -ripostes -immédiates -et -énergiques -qui -s -' -imposent -, -et -susciter -un -grand -mouvement -de -lutte -pour -la -démocratie -. -§ -c -' -est -dans -ce -cadre -qu -' -il -faut -placer -le -recours -, -pour -une -partie -du -patronat -avec -la -complicité -et -parfois -le -soutien -direct -des -milieux -du -* -pouvoir -, -aux -syndicats -maison -CFT -dont -le -caractère -d -' -officine -patronale -et -les -méthodes -ont -été -dévoilés -par -la -CGT -. -§ -mais -ils -font -un -mauvais -calcul -en -misant -sur -une -quelconque -résignation -des -travailleurs -. -ils -ne -tiennent -pas -compte -du -mécontentement -accumulé -ni -de -l -' -état -d -' -esprit -né -du -progrès -des -forces -de -gauche -, -ni -des -conséquences -que -tirent -les -travailleurs -de -toutes -les -injustices -, -de -tout -ce -qui -témoigne -de -l -' -incapacité -du -système -à -résoudre -les -problèmes -sociaux -les -plus -élémentaires -. -§ -les -luttes -syndicales -ont -connu -, -en -plusieurs -occasions -, -des -périodes -particulièrement -intenses -. -elles -ont -mis -en -avant -des -revendications -d -' -une -ampleur -et -d -' -une -portée -nouvelles -. -§ -depuis -l -' -aggravation -de -la -crise -, -bien -des -actions -et -des -grèves -d -' -envergure -ont -témoigné -, -d -' -une -combativité -parmi -l -' -ensemble -des -travailleurs -et -particulièrement -dans -la -jeunesse -, -qu -' -il -faut -considérer -comme -l -' -indice -d -' -un -état -d -' -esprit -significatif -du -monde -du -travail -. -§ -toutes -les -manoeuvres -, -tous -les -procédés -employés -pour -détourner -les -salariés -de -la -lutte -sont -voués -à -l -' -échec -, -inadaptés -aux -conditions -nouvelles -, -à -condition -de -recevoir -la -riposte -appropriée -. -§ -car -il -n -' -est -pas -vrai -que -la -crise -, -le -chômage -, -l -' -inflation -soient -une -fatalité -$ -: -ils -sont -un -produit -du -système -capitaliste -et -de -la -domination -des -monopoles -. -§ -il -n -' -est -pas -vrai -, -que -l -' -austérité -pour -les -travailleurs -soit -inévitable -. -§ -il -n -' -est -pas -vrai -, -que -le -gouvernement -s -' -attaque -aux -inégalités -sociales -. -§ -il -n -' -est -pas -vrai -, -que -les -mesures -patronales -et -giscardiennes -soient -les -seules -possibles -. -§ -au -contraire -, -même -dans -les -conditions -actuelles -, -il -est -possible -d -' -imposer -d -' -autres -mesures -pour -combattre -l -' -inflation -et -le -chômage -et -d -' -engager -l -' -action -avec -l -' -immense -majorité -des -travailleurs -. -§ -c -' -est -parce -qu -' -ils -le -ressentent -que -les -travailleurs -n -' -ont -cessé -de -mener -des -luttes -importantes -. -mieux -ils -en -auront -conscience -et -plus -énergiquement -encore -ils -défendront -leurs -intérêts -, -avec -succès -. -§ -le -programme -d -' -action -soumis -au -39ème -* -congrès -précise -l -' -ensemble -des -objectifs -revendicatifs -essentiels -de -la -CGT -pour -la -période -à -venir -. -§ -parmi -ces -objectifs -, -il -en -est -un -certain -nombre -qui -ont -un -caractère -d -' -urgence -et -une -portée -générale -qui -sont -à -la -base -des -luttes -actuelles -. -§ -dans -le -contexte -de -la -crise -économique -, -la -défense -des -conditions -de -vie -et -de -travail -par -les -revendications -syndicales -est -étroitement -liée -à -l -' -action -pour -des -mesures -économiques -capables -de -combattre -la -crise -et -de -s -' -attaquer -à -ses -causes -afin -d -' -assainir -l -' -économie -et -d -' -assurer -son -développement -. -§ -les -revendications -concernent -en -particulier -: -< -S10 -= -1 -> -les -salaires -. -. -< -S10 -= -0 -> -_ -garantie -du -pouvoir -d -' -achat -pour -tous -par -l -' -échelle -mobile -et -progression -avec -des -différenciations -allant -dans -le -sens -d -' -une -remise -en -ordre -des -systèmes -de -rémunération -; -_ -SMIC -à -1700F -par -mois -pour -40 -heures -hebdomadaires -; -_ -relèvement -des -prestations -sociales -et -familiales -, -des -pensions -et -retraites -et -allocations -de -chômage -total -ou -partiel -. -< -S10 -= -1 -> -l -' -emploi -. -. -< -S10 -= -0 -> -_ -une -politique -de -développement -économique -créatrice -d -' -emplois -; -_ -le -droit -et -les -moyens -de -discuter -du -bien -fondé -des -décisions -de -licenciements -et -de -fermetures -d -' -entreprises -avec -la -possibilité -d -' -instances -de -recours -avec -effet -suspensif -; -_ -l -' -interdiction -de -tout -licenciement -sans -reclassement -préalable -équivalent -. -§ -dans -les -conditions -présentes -, -deux -mesures -longtemps -refusées -prennent -une -importance -et -une -urgence -particulières -$ -: -_ -le -droit -à -une -retraite -pleine -à -60 -ans -pour -les -hommes -et -à -55 -ans -pour -les -femmes -, -avec -75 -% -des -éléments -du -salaire -; -_ -la -semaine -de -40 -heures -en -5 -jours -partout -, -sans -réduction -de -salaire -et -dans -les -plus -brefs -délais -. -< -S10 -= -1 -> -les -conditions -de -travail -< -S10 -= -0 -> -exigent -un -ensemble -de -mesures -pour -$ -: -_ -limiter -les -cadences -, -embaucher -en -nombre -suffisant -, -_ -protéger -la -santé -et -la -vie -des -travailleurs -, -_ -élever -l -' -intérêt -, -la -responsabilité -, -la -qualification -du -travail -avec -des -classifications -et -des -salaires -correspondants -, -_ -assurer -des -garanties -d -' -accès -à -la -formation -et -à -la -promotion -professionnelles -. -< -S10 -= -1 -> -les -libertés -syndicales -. -. -< -S10 -= -0 -> -cessation -immédiate -des -atteintes -aux -libertés -syndicales -et -au -droit -de -grève -et -garanties -légales -contre -ces -pratiques -; -_ -sanctions -judiciaires -contre -toutes -les -violations -de -ces -libertés -et -contre -l -' -emploi -de -la -force -contre -les -travailleurs -; -_ -extension -des -libertés -syndicales -, -des -droits -démocratiques -des -travailleurs -et -des -moyens -attribués -pour -leur -exercice -dans -les -entreprises -et -dans -la -vie -publique -. -< -S10 -= -1 -> -les -discriminations -de -toutes -sortes -< -S10 -= -0 -> -doivent -être -supprimées -et -toutes -tentatives -de -les -maintenir -sanctionnées -. -< -S10 -= -1 -> -une -véritable -réforme -de -la -fiscalité -< -S10 -= -0 -> -allégeant -la -charge -des -salariés -et -frappant -le -* -capital -. -< -S10 -= -1 -> -la -sécurité -sociale -< -S10 -= -0 -> -doit -être -rendue -aux -travailleurs -et -les -mesures -consécutives -à -la -politique -de -démantèlement -poursuivie -par -le -* -pouvoir -et -le -* -patronat -doivent -être -abrogées -. -§ -l -' -indexation -des -allocations -, -rentes -et -pensions -sur -la -base -d -' -un -indice -de -prix -négocié -par -les -organisations -syndicales -. -§ -les -mesures -économiques -immédiatement -nécessaires -visent -principalement -à -assurer -un -développement -suffisant -et -équilibré -de -la -production -, -combattre -l -' -inflation -et -la -vie -chère -, -sauvegarder -l -' -emploi -et -rééquilibrer -les -échanges -. -c -' -est -pour -atteindre -ces -buts -qu -' -elles -doivent -s -' -attaquer -aux -privilèges -, -aux -profits -et -aux -moyens -de -domination -des -grandes -sociétés -capitalistes -. -§ -énoncées -précisément -dans -le -programme -d -' -action -du -39ème -* -congrès -, -elles -comportent -: -§ -contre -l -' -inflation -et -la -vie -chère -$ -: -_ -des -réductions -de -TVA -, -le -blocage -temporaire -de -certains -prix -et -tarifs -publics -, -la -réduction -et -le -contrôle -des -bénéfices -ainsi -que -la -limitation -du -crédit -pour -les -grandes -sociétés -, -la -défense -de -l -' -épargne -populaire -. -§ -pour -l -' -emploi -$ -: -_ -une -politique -de -développement -créatrice -d -' -emplois -fondée -sur -un -solide -marché -intérieur -développé -, -notamment -par -l -' -amélioration -du -pouvoir -d -' -achat -, -une -politique -industrielle -s -' -appuyant -sur -le -secteur -public -, -un -développement -des -équipements -collectifs -améliorant -les -conditions -d -' -existence -, -un -développement -régional -réel -. -§ -pour -l -' -équilibre -des -échanges -extérieurs -$ -: -_ -un -développement -diversifié -, -vers -tous -les -pays -et -notamment -les -pays -socialistes -et -du -Tiers -- -Monde -, -des -échanges -commerciaux -et -de -la -coopération -technique -et -scientifique -en -les -fondant -sur -l -' -intérêt -mutuel -, -le -contrôle -des -mouvements -de -capitaux -et -des -investissements -étrangers -en -France -. -§ -pour -assurer -les -besoins -en -énergie -$ -: -_ -des -contrats -de -type -nouveau -avec -les -pays -producteurs -de -pétrole -, -l -' -arrêt -immédiat -des -fermetures -de -puits -de -mine -et -un -plan -d -' -augmentation -de -la -production -charbonnière -, -l -' -utilisation -de -l -' -énergie -hydraulique -, -marémotrice -, -géothermique -, -la -maîtrise -technologique -, -la -protection -de -l -' -environnement -et -la -garantie -de -l -' -approvisionnement -en -combustible -pour -les -centrales -nucléaires -, -la -suppression -des -privilèges -des -sociétés -pétrolières -et -la -nationalisation -immédiate -des -groupes -pétroliers -français -, -le -développement -de -la -recherche -sur -les -sources -de -l -' -avenir -. -§ -ces -revendications -correspondent -à -des -besoins -impérieux -et -justifiés -. -elles -constituent -des -éléments -importants -de -réponse -aux -problèmes -économiques -et -sociaux -actuels -en -favorisant -l -' -emploi -et -la -lutte -contre -l -' -inflation -. -elles -répondent -à -l -' -intérêt -national -. -§ -si -le -* -pouvoir -et -le -* -patronat -en -tenaient -compte -, -des -difficultés -pourraient -être -atténuées -. -§ -mais -il -faut -s -' -attendre -pour -l -' -essentiel -à -une -résistance -acharnée -de -leur -part -, -car -telle -est -leur -nature -de -classe -et -telles -sont -les -exigences -des -intérêts -du -grand -capital -monopoliste -. -§ -l -' -action -revendicative -de -masse -est -et -sera -nécessaire -pour -obtenir -chaque -amélioration -. -§ -la -réduction -du -pouvoir -d -' -achat -des -salaires -, -les -pertes -dues -à -la -réduction -d -' -activité -, -le -chômage -total -et -partiel -, -la -misère -qui -gagne -un -grand -nombre -de -foyers -de -travailleurs -, -loin -d -' -engendrer -la -résignation -, -se -traduisent -par -le -mécontentement -et -la -colère -, -et -une -conscience -plus -élevée -de -la -responsabilité -de -la -politique -du -pouvoir -. -§ -le -patronat -et -le -gouvernement -poussent -chaque -conflit -à -l -' -extrême -tension -. -§ -mais -la -tendance -principale -est -constituée -par -la -combativité -, -l -' -endurance -exceptionnelle -des -travailleurs -, -le -nombre -et -la -durée -des -grèves -en -même -temps -que -par -la -recherche -des -méthodes -d -' -action -les -plus -efficaces -, -les -mieux -adaptées -. -§ -il -est -possible -, -par -l -' -action -, -d -' -imposer -des -succès -marquants -comme -maints -exemples -l -' -ont -déjà -démontré -. -§ -l -' -intransigeance -gouvernementale -et -patronale -conduit -à -une -montée -des -luttes -sociales -, -susceptibles -d -' -atteindre -une -grande -envergure -. -§ -faire -échec -à -la -politique -d -' -austérité -pour -les -travailleurs -, -de -privations -pour -beaucoup -, -implique -une -grande -ténacité -dans -la -lutte -. -§ -il -s -' -agit -d -' -une -bataille -de -longue -haleine -et -d -' -envergure -dans -laquelle -s -' -allient -les -actions -multiformes -et -incessantes -dans -les -entreprises -et -des -mouvements -coordonnés -de -divers -types -$ -: -au -plan -professionnel -ou -au -plan -interprofessionnel -selon -la -nature -des -revendications -essentielles -; -parfois -au -niveau -local -ou -départemental -, -parfois -par -de -grandes -initiatives -d -' -ampleur -nationale -. -§ -dans -tous -les -cas -, -parmi -les -conditions -nécessaires -à -la -conduite -des -luttes -, -l -' -information -de -l -' -opinion -publique -et -la -recherche -de -son -soutien -sont -indispensables -. -§ -ce -sont -les -circonstances -, -les -situations -concrètes -qui -conduisent -à -adopter -les -initiatives -qui -conviennent -le -mieux -dans -chaque -cas -. -§ -et -c -' -est -l -' -ensemble -de -ces -luttes -aux -aspects -diversifiés -, -souvent -très -décentralisées -et -parfois -puissamment -regroupées -qui -constitue -un -mouvement -revendicatif -rassemblant -, -sur -toute -une -période -, -des -forces -de -plus -en -plus -grandes -capables -d -' -imposer -non -seulement -des -reculs -dans -telle -ou -telle -entreprise -ou -branche -mais -au -patronat -et -au -gouvernement -pour -les -objectifs -communs -à -l -' -ensemble -des -travailleurs -. -§ -les -orientations -du -38ème -* -congrès -confédéral -définissant -les -principes -d -' -une -action -efficace -et -responsable -se -sont -pleinement -vérifiées -. -§ -l -' -essentiel -dans -la -conduite -de -la -bataille -présente -est -, -avec -la -persévérance -, -le -souci -plus -indispensable -que -jamais -de -la -plus -large -démocratie -$ -: -démocratie -avec -les -syndiqués -qui -doivent -jouer -leur -rôle -, -démocratie -avec -l -' -ensemble -des -travailleurs -, -pour -tenir -le -plus -grand -compte -de -leurs -besoins -, -de -leur -état -d -' -esprit -, -définir -avec -eux -à -toutes -les -étapes -de -la -lutte -et -rechercher -la -convergence -dans -les -objectifs -et -les -méthodes -d -' -action -. -§ -les -militants -et -les -organisations -de -la -CGT -ont -à -faire -preuve -d -' -audace -pour -se -placer -, -de -la -sorte -, -résolument -à -la -tête -des -luttes -avec -esprit -d -' -initiative -, -de -décision -et -d -' -unité -. -§ -c -' -est -dans -cet -esprit -que -la -CGT -et -la -CFDT -ont -pris -, -dans -toute -la -dernière -période -des -initiatives -d -' -action -et -animé -le -développement -des -luttes -. -§ -l -' -accord -conclu -le -26 -juin -1974 -entre -les -deux -centrales -sur -les -objectifs -communs -, -les -méthodes -de -l -' -action -et -le -renforcement -de -l -' -unité -d -' -action -a -représenté -un -progrès -considérable -dans -les -relations -confédérales -. -il -a -permis -d -' -éliminer -un -grand -nombre -d -' -obstacles -et -a -favorisé -une -amélioration -à -différents -niveaux -quoique -subsistent -bien -des -inégalités -de -situations -. -§ -la -pratique -a -prouvé -$ -: -_ -que -les -divergences -existant -sur -les -questions -fondamentales -de -l -' -avenir -de -la -société -ne -sont -pas -un -obstacle -insurmontable -à -l -' -unité -d -' -action -pour -les -revendications -communes -et -urgentes -pour -les -travailleurs -; -_ -que -les -divergences -sur -les -revendications -et -les -méthodes -de -l -' -action -, -lorsqu -' -elles -existent -, -sont -plus -facilement -surmontées -lorsqu -' -elles -sont -discutées -clairement -et -franchement -avec -les -travailleurs -dont -l -' -appui -est -décisif -; -_ -que -la -pratique -de -l -' -unité -d -' -action -sur -des -bases -claires -favorise -l -' -établissement -de -rapports -fraternels -et -loyaux -, -qu -' -elle -contribue -à -aborder -dans -de -meilleures -conditions -la -discussion -des -divergences -plus -fondamentales -pour -tenter -de -les -réduire -. -tout -progrès -dans -ce -sens -facilite -réciproquement -l -' -unité -d -' -action -; -_ -qu -' -une -bonne -et -saine -unité -suppose -la -vitalité -, -l -' -activité -et -l -' -esprit -d -' -initiative -des -organisations -de -la -CGT -en -tant -que -telles -. -§ -la -CGT -persiste -à -souhaiter -que -l -' -unité -d -' -action -qui -se -développe -avec -la -CFDT -s -' -étende -à -la -FEN -et -à -Force -Ouvrière -. -§ -mais -la -direction -de -la -FEN -en -dépit -des -intentions -qu -' -elle -affirme -est -délibérément -retournée -à -la -collaboration -avec -le -gouvernement -en -signant -un -nouvel -accord -salarial -qui -s -' -inscrit -dans -la -politique -d -' -austérité -. -la -pratique -de -l -' -unité -d -' -action -avec -de -nombreuses -organisations -de -la -FEN -est -fondée -sur -la -défense -des -intérêts -de -classe -des -travailleurs -, -la -lutte -contre -la -crise -et -ses -conséquences -, -pour -faire -reculer -le -pouvoir -et -le -patronat -. -§ -la -CGT -lutte -pour -l -' -unité -avec -la -FEN -en -combattant -les -positions -de -collaboration -de -classe -dans -la -fonction -publique -. -§ -la -direction -confédérale -de -FO -est -devenue -l -' -agent -officiel -et -le -symbole -de -la -collaboration -de -classe -. -elle -s -' -attaque -directement -aux -travailleurs -en -grève -et -apporte -systématiquement -la -caution -de -son -organisation -au -patronat -et -au -gouvernement -. -§ -la -CGT -ne -peut -qu -' -espérer -un -sursaut -contre -cette -dégradation -parmi -les -militants -et -les -organisations -de -Force -Ouvrière -et -la -réalisation -de -l -' -unité -d -' -action -sur -des -bases -de -classe -avec -les -organisations -FO -qui -y -sont -prêtes -. -§ -le -* -congrès -souligne -que -cela -ne -peut -être -possible -que -si -cette -organisation -adopte -enfin -une -attitude -combative -de -défense -des -intérêts -des -travailleurs -. -§ -le -renforcement -et -l -' -élargissement -de -l -' -unité -d -' -action -pour -les -revendications -communes -est -toujours -la -question -actuelle -, -la -tâche -urgente -en -matière -d -' -unité -. -la -CGT -s -' -y -emploie -sans -relâche -. -simultanément -, -elle -ne -s -' -est -jamais -résignée -à -la -division -syndicale -et -maintient -plus -que -jamais -son -objectif -de -réunification -syndicale -. -elle -entend -travailler -à -en -créer -les -conditions -. -§ -dans -cette -perspective -, -elle -a -défini -ses -propres -conceptions -fondées -sur -le -contenu -de -classe -de -son -action -, -le -caractère -de -masse -de -ses -activités -et -la -démocratie -syndicale -assurant -la -véritable -indépendance -d -' -une -organisation -groupant -l -' -ensemble -des -salariés -dans -la -diversité -des -opinions -. -§ -elle -est -prête -à -en -discuter -, -certaine -d -' -aller -au -devant -du -désir -de -la -masse -des -travailleurs -et -particulièrement -des -jeunes -. -< -S10 -= -1 -> -rassemblement -des -forces -populaires -pour -la -victoire -du -programme -commun -. -. -< -S10 -= -0 -> -§ -des -millions -de -travailleurs -se -persuadent -, -à -l -' -expérience -et -par -l -' -effort -de -conviction -de -la -CGT -, -que -si -l -' -indispensable -action -revendicative -permet -de -résister -à -l -' -agression -permanente -contre -le -niveau -de -vie -, -rien -d -' -essentiel -ni -de -durable -ne -pourra -être -fait -sans -des -changements -profonds -dans -la -société -. -§ -la -crise -étale -toute -la -malfaisance -, -les -tares -et -les -absurdités -d -' -un -système -qui -ne -répond -pas -aux -besoins -du -développement -de -l -' -humanité -et -qui -s -' -avère -incapable -de -résoudre -aucun -des -problèmes -posés -par -notre -époque -. -§ -c -' -est -le -socialisme -qui -représente -l -' -avenir -de -la -société -. -cette -idée -continue -à -progresser -dans -l -' -esprit -des -travailleurs -. -la -CGT -qui -s -' -est -fixée -pour -but -cette -transformation -décisive -conduisant -à -l -' -émancipation -des -travailleurs -, -a -clairement -exposé -ses -conceptions -à -cet -égard -. -son -38ème -* -congrès -les -a -confirmées -. -elle -est -disponible -pour -la -poursuite -de -la -réflexion -et -de -la -discussion -avec -les -travailleurs -et -toutes -les -forces -intéressées -à -ce -but -. -§ -c -' -est -en -poursuivant -cet -objectif -et -en -militant -pour -y -gagner -toujours -plus -de -travailleurs -que -la -CGT -a -engagé -toutes -ses -forces -dans -la -lutte -pour -la -démocratie -économique -et -politique -, -pour -les -changements -profonds -qu -' -il -faut -d -' -urgence -apporter -à -la -société -. -§ -la -conclusion -du -* -programme -commun -de -gouvernement -entre -le -* -parti -communiste -, -le -* -parti -socialiste -et -le -* -mouvement -des -radicaux -de -gauche -en -a -ouvert -la -perspective -. -§ -le -soutien -massif -à -cette -alliance -et -à -ce -programme -lors -de -l -' -élection -présidentielle -a -créé -une -situation -nouvelle -. -§ -la -possibilité -de -faire -parvenir -la -* -gauche -au -pouvoir -pour -appliquer -son -programme -soulève -un -grand -espoir -parmi -les -travailleurs -. -§ -cet -espoir -, -pour -être -pleinement -justifié -, -doit -s -' -accompagner -d -' -une -vue -lucide -des -conditions -de -la -lutte -pour -y -parvenir -. -§ -car -cette -même -perspective -provoque -la -profonde -inquiétude -des -milieux -dirigeants -de -la -haute -bourgeoisie -et -de -toutes -les -forces -de -réaction -qui -ne -restent -pas -passifs -. -§ -le -* -pouvoir -regroupe -toutes -les -forces -de -conservation -sociale -quelle -que -soit -leur -étiquette -. -il -précipite -son -alignement -atlantique -. -il -renforce -le -caractère -personnel -, -autoritaire -du -système -et -en -particulier -sa -mainmise -sur -les -principaux -moyens -d -' -information -. -§ -tout -en -s -' -efforçant -de -maintenir -ainsi -le -pouvoir -qui -lui -convient -le -mieux -, -la -bourgeoisie -multiplie -et -multipliera -constamment -les -manoeuvres -pour -s -' -efforcer -de -dissocier -l -' -alliance -de -la -* -gauche -et -surtout -pour -tenter -de -la -vider -de -son -contenu -. -§ -à -cet -effet -, -le -pouvoir -tente -d -' -entraîner -des -forces -de -la -gauche -à -un -comportement -de -collaboration -de -classe -. -les -campagnes -anticommunistes -sont -destinées -à -diviser -et -à -affaiblir -la -gauche -. -c -' -est -pourquoi -il -est -du -devoir -de -l -' -ensembledes -forces -de -gauche -, -syndicales -et -politiques -, -de -les -combattre -. -§ -car -ce -qui -inquiète -le -plus -le -grand -patronat -dans -l -' -union -de -la -* -gauche -, -ce -sont -ses -objectifs -et -le -contenu -social -et -économique -avancé -de -son -programme -. -§ -c -' -est -aussi -ce -qui -importe -le -plus -aux -travailleurs -et -à -la -CGT -. -§ -la -CGT -a -constamment -défini -, -dans -ses -* -congrès -et -instances -responsables -, -à -partir -de -ses -préoccupations -syndicales -, -ses -positions -indépendantes -quant -aux -perspectives -de -transformation -de -la -société -. -§ -cette -indépendance -, -conforme -aux -intérêts -des -travailleurs -, -ne -peut -pas -se -détacher -des -principes -de -classe -et -, -par -conséquent -, -ne -saurait -être -confondue -avec -une -quelconque -neutralité -. -§ -pendant -de -longues -années -la -CGT -a -lutté -pour -que -se -réalise -l -' -alliance -des -forces -de -gauche -sur -la -base -d -' -un -* -programme -commun -au -contenu -fermement -dirigé -contre -la -domination -des -monopoles -. -§ -elle -a -défini -, -pour -sa -part -, -les -objectifs -qu -' -elle -jugeait -essentiels -dans -ce -but -. -ces -objectifs -figurent -toujours -dans -son -programme -confédéral -. -§ -lorsque -fut -conclu -le -* -programme -commun -de -la -gauche -, -la -CGT -a -fondé -son -soutien -sans -défaillance -sur -le -fait -qu -' -elle -y -retrouvait -l -' -essentiel -de -ses -propres -objectifs -. -§ -c -' -est -avec -ces -mêmes -préoccupations -que -la -CGT -poursuit -son -action -. -§ -l -' -essentiel -, -du -point -de -vue -des -intérêts -de -classe -des -travailleurs -_ -et -par -conséquent -du -point -de -vue -de -la -CGT -_ -est -dans -l -' -application -des -mesures -prévues -par -le -* -programme -commun -$ -: -_ -pour -retirer -aux -monopoles -les -moyens -de -leur -puissance -et -remettre -à -la -* -nation -les -leviers -de -commande -essentiels -de -l -' -économie -, -c -' -est -- -à -- -dire -la -nationalisation -des -secteurs -clés -et -leur -gestion -démocratique -dans -le -cadre -d -' -une -planification -également -démocratique -; -_ -pour -mettre -en -oeuvre -des -mesures -sociales -hardies -répondant -aux -revendications -des -travailleurs -; -_ -pour -développer -, -en -démocratisant -l -' -économie -, -l -' -intervention -active -et -la -participation -de -la -masse -des -travailleurs -à -la -gestion -et -à -la -planification -. -§ -les -mises -au -point -et -ajustements -nécessaires -du -programme -, -qui -doivent -intervenir -en -temps -opportun -pour -tenir -compte -de -la -conjoncture -et -des -conditions -concrètes -devant -lesquelles -sera -placée -la -* -gauche -, -ne -sauraient -en -affecter -les -dispositions -fondamentales -, -celles -qui -sont -destinées -à -donner -les -moyens -du -changement -réel -. -§ -loin -d -' -être -dépassé -, -comme -le -prétendent -ses -détracteurs -, -le -* -programme -commun -est -plus -actuel -et -urgent -que -jamais -, -dans -son -fond -. -§ -non -, -la -crise -n -' -est -pas -fatale -, -l -' -austérité -pour -les -travailleurs -n -' -est -pas -inévitable -et -ne -constitue -pas -une -solution -. -§ -contre -le -pouvoir -actuel -et -les -féodalités -capitalistes -qu -' -il -s -' -agit -d -' -éliminer -, -seules -les -réformes -profondes -contenues -dans -le -* -programme -commun -permettront -de -sortir -le -pays -de -la -crise -, -d -' -assurer -son -développement -et -de -résoudre -d -' -une -manière -neuve -et -efficace -les -problèmes -essentiels -posés -à -la -société -moderne -et -d -' -abord -ceux -qui -importent -le -plus -aux -travailleurs -pour -améliorer -leur -situation -, -leurs -conditions -de -vie -et -de -travail -. -§ -pour -qu -' -elle -devienne -majoritaire -, -l -' -union -de -la -gauche -implique -$ -: -_ -l -' -action -concrète -contre -le -pouvoir -pour -assurer -la -défense -des -intérêts -des -travailleurs -et -la -défense -des -libertés -; -_ -le -rassemblement -et -l -' -union -de -tous -pour -la -mise -en -échec -de -toutes -les -tentatives -de -collaboration -de -classe -; -_ -des -initiatives -multiples -afin -de -gagner -aux -idées -décisives -du -* -programme -commun -des -millions -de -consciences -nouvelles -et -notamment -parmi -les -salariés -et -de -contribuer -au -renforcement -de -leur -détermination -pour -de -véritables -changements -. -§ -c -' -est -dans -cet -esprit -et -pour -ces -objectifs -communs -que -la -CGT -souhaite -voir -se -renforcer -l -' -* -union -de -la -gauche -. -§ -elle -travaillera -pour -sa -part -, -sur -la -base -de -ses -positions -de -classe -, -à -gagner -à -ces -conceptions -et -aux -solutions -fondamentales -du -* -programme -commun -, -la -masse -des -travailleurs -. -elle -impulsera -l -' -action -commune -pour -des -buts -concrets -. -elle -contribuera -ainsi -au -renforcement -de -l -' -* -union -de -la -gauche -et -à -la -réalisation -du -rassemblement -majoritaire -qui -assurera -sa -victoire -et -l -' -application -de -son -programme -. -< -S10 -= -1 -> -dans -l -' -intérêt -des -travailleurs -$ -: -puissance -, -capacité -d -' -organisation -, -d -' -initiative -et -d -' -influence -de -la -CGT -. -. -< -S10 -= -0 -> -§ -défendre -les -intérêts -des -travailleurs -dans -une -situation -aussi -complexe -, -quand -la -lutte -de -classe -atteint -un -tel -degré -; -les -aider -à -s -' -orienter -, -à -s -' -organiser -pour -intervenir -eux -- -mêmes -efficacement -; -les -rassembler -par -millions -dans -la -lutte -pour -les -transformations -sociales -indispensables -$ -: -il -est -impossible -d -' -accomplir -ces -tâches -sans -un -renforcement -considérable -de -la -CGT -, -en -quantité -comme -en -qualité -. -§ -les -travailleurs -de -toutes -catégories -et -de -toutes -professions -ne -peuvent -se -passer -d -' -une -CGT -active -, -vivante -, -présente -partout -, -capable -de -faire -face -à -ses -responsabilités -en -toutes -circonstances -, -ce -qui -suppose -à -la -fois -le -recrutement -systématique -de -nouveaux -adhérents -, -l -' -exercice -d -' -une -large -démocratie -syndicale -et -la -diffusion -des -idées -de -la -CGT -$ -: -trois -conditions -indispensables -au -syndicalisme -de -masse -et -donc -à -l -' -efficacité -de -l -' -action -syndicale -. -< -S10 -= -1 -> -syndiquer -massivement -les -travailleurs -. -. -< -S10 -= -0 -> -§ -c -' -est -à -partir -de -ces -préoccupations -que -l -' -année -1974 -a -marqué -une -ouverture -dans -la -voie -d -' -un -recrutement -important -et -permanent -et -de -la -création -d -' -un -grand -nombre -d -' -organisations -là -où -elles -n -' -existaient -pas -. -§ -les -résultats -obtenus -en -1974 -, -avec -308000 -adhésions -et -3400 -bases -nouvelles -, -sont -encourageants -mais -ils -ne -représentent -que -le -début -d -' -une -attitude -nouvelle -pour -placer -les -forces -organisées -de -la -CGT -en -concordance -avec -son -influence -et -ses -responsabilités -. -§ -il -s -' -agit -, -chaque -année -, -de -progresser -au -rythme -de -nombreuses -centaines -de -milliers -d -' -adhérents -et -de -milliers -d -' -organisations -nouvelles -. -§ -ce -résultat -ne -peut -être -atteint -que -par -une -activitéde -masse -s -' -appuyant -sur -une -prise -de -conscience -générale -de -tous -les -militants -, -de -tous -les -syndiqués -et -un -travail -systématique -, -organisé -, -dirigé -par -les -directions -syndicales -aux -différents -niveaux -. -§ -le -renforcement -numérique -doit -s -' -accompagner -d -' -un -perfectionnement -général -du -travail -des -organisations -de -la -CGT -$ -: -direction -collective -pour -assurer -entièrement -nos -responsabilités -dans -tous -les -domaines -. -promotion -de -forces -militantes -nouvelles -représentatives -de -la -diversité -de -la -CGT -aux -responsabilités -et -tout -particulièrement -les -femmes -qui -prennent -une -place -de -plus -en -plus -grande -dans -l -' -action -et -la -vie -syndicale -et -des -jeunes -gens -et -jeunes -filles -; -formation -de -centaines -de -milliers -de -militants -de -toutes -responsabilités -. -§ -donner -à -la -CGT -un -caractère -de -masse -dans -toute -sa -vie -et -son -action -exige -également -de -veiller -aux -intérêts -de -chaque -catégorie -de -travailleurs -, -de -comprendre -leurs -besoins -, -leurs -préoccupations -. -cela -exige -de -déployer -un -travail -d -' -organisation -et -une -activité -spécifique -qui -tiennent -compte -de -leurs -revendications -particulières -, -de -leur -sensibilité -propre -à -l -' -égard -des -revendications -générales -et -des -problèmes -d -' -ensemble -de -tous -les -travailleurs -. -§ -ce -travail -spécifique -, -pour -être -efficace -, -doit -s -' -appuyer -sur -l -' -activité -de -l -' -ensemble -des -organisations -de -la -CGT -. -§ -cet -ensemble -de -préoccupations -qui -concernent -toutes -les -organisations -de -la -CGT -à -tous -les -échelons -s -' -impose -particulièrement -dans -les -grandes -entreprises -en -raison -de -leur -place -dans -la -vie -économique -et -sociale -, -dans -les -luttes -. -< -S10 -= -1 -> -développer -et -perfectionner -la -démocratie -syndicale -. -. -< -S10 -= -0 -> -§ -c -' -est -pour -des -raisons -importantes -que -la -CGT -poursuit -avec -insistance -une -campagne -intérieure -pour -le -développement -de -la -démocratie -syndicale -$ -: -c -' -est -la -clé -du -perfectionnement -des -organisations -de -la -CGT -ainsi -que -la -solution -de -nombreux -problèmes -qui -s -' -y -rapportent -, -l -' -état -actuel -de -sa -pratique -au -sein -de -nos -organisations -réclame -qu -' -on -poursuive -avec -une -plus -grande -attention -les -efforts -entrepris -. -§ -la -démocratie -syndicale -consiste -principalement -à -assurer -la -participation -active -des -syndiqués -à -la -vie -de -l -' -organisation -, -à -la -détermination -de -son -orientation -et -de -ses -décisions -. -§ -elle -suppose -la -plus -large -expression -des -syndiqués -, -l -' -information -et -la -circulation -des -idées -. -§ -le -38ème -* -congrès -a -défini -les -principales -conditions -nécessaires -à -la -démocratie -syndicale -. -§ -plus -est -grande -la -participation -des -adhérents -à -la -vie -de -l -' -organisation -, -meilleures -sont -les -décisions -, -plus -étroits -sont -les -liens -du -syndicat -avec -les -travailleurs -par -l -' -intermédiaire -de -ses -adhérents -mieux -informés -, -plus -nombreux -les -syndiqués -qui -prennent -une -part -même -modeste -, -au -travail -syndical -, -plus -nombreux -enfin -ceux -qui -deviennent -des -militants -. -§ -par -là -, -le -syndicat -décuple -son -efficacité -dans -son -orientation -, -dans -la -mise -en -activité -des -forces -indispensables -pour -faire -face -à -toutes -ces -obligations -, -dans -les -moyens -d -' -un -plus -grand -recrutement -, -d -' -une -meilleure -promotion -de -cadres -. -§ -par -là -, -il -donne -pleinement -l -' -image -, -à -tous -les -échelons -, -de -la -grande -organisation -de -masse -qu -' -est -la -CGT -et -qu -' -elle -veut -être -toujours -mieux -, -pour -être -" -la -CGT -partout -et -pour -tous -" -. -§ -lorsque -les -militants -responsables -sont -animés -par -ces -préoccupations -et -en -assimilent -la -portée -, -ils -trouvent -plus -aisément -les -solutions -pour -y -parvenir -, -les -mesures -d -' -organisation -et -le -style -de -direction -. -< -S10 -= -1 -> -porter -la -bataille -des -idées -à -la -mesure -de -nos -responsabilités -. -. -< -S10 -= -0 -> -§ -c -' -est -à -partir -de -la -même -préoccupation -$ -: -le -caractère -de -masse -de -toute -l -' -activité -syndicale -, -qu -' -il -convient -d -' -envisager -la -bataille -des -idées -. -§ -le -38ème -* -congrès -a -lancé -le -mot -d -' -ordre -$ -: -" -gagner -des -millions -de -consciences -" -car -telle -est -l -' -envergure -de -la -bataille -sociale -. -§ -c -' -est -à -des -millions -de -travailleurs -qu -' -il -faut -apporter -constamment -les -idées -, -les -réponses -, -les -réflexions -, -les -propositions -de -la -CGT -pour -qu -' -ils -puissent -se -déterminer -, -trouver -leur -voie -en -dépit -du -martèlement -des -idées -du -* -capital -qui -dispose -de -tous -les -moyens -essentiels -d -' -information -. -§ -c -' -est -une -condition -absolue -de -l -' -efficacité -de -l -' -action -revendicative -comme -de -la -lutte -pour -les -changements -plus -fondamentaux -et -de -l -' -accomplissement -de -toutes -les -tâches -de -la -CGT -. -§ -la -mettre -en -mesure -de -faire -face -à -ses -responsabilités -, -c -' -est -à -la -fois -la -doter -de -l -' -organisation -correspondant -aux -exigences -de -la -lutte -gigantesque -de -notre -époque -et -assurer -un -rayonnement -permanent -et -infiniment -plus -large -à -ses -idées -. -§ -tout -l -' -ensemble -de -l -' -activité -d -' -information -et -de -propagande -de -la -CGT -et -de -ses -organisations -doit -être -adapté -à -cette -responsabilité -, -à -cette -obligation -d -' -information -, -d -' -explication -et -d -' -éducation -de -masse -; -c -' -est -dire -qu -' -il -convient -de -donner -à -la -propagande -syndicale -les -moyens -, -l -' -efficacité -, -la -diversité -qui -correspondent -à -ces -exigences -en -adoptant -les -méthodes -modernes -et -en -consacrant -les -forces -nécessaires -pour -y -parvenir -. -§ -et -d -' -abord -l -' -effort -de -diffusion -de -toute -la -presse -confédérale -et -principalement -du -moyen -central -et -permanent -d -' -expression -de -la -CGT -auprès -de -l -' -ensemble -des -travailleurs -: -" -la -Vie -- -Ouvrière -" -. -§ -ce -qui -vaut -pour -la -conception -du -recrutement -qui -doit -prévaloir -vaut -pour -celle -de -la -diffusion -de -" -la -Vie -- -Ouvrière -" -. -car -l -' -organisation -en -masse -des -travailleurs -dans -la -CGT -doit -aller -de -pair -avec -leur -connaissance -, -en -masse -des -idées -de -la -CGT -et -par -conséquent -avec -la -lecture -régulière -de -son -hebdomadaire -de -masse -. -< -S10 -= -1 -> -la -solidarité -ouvrière -internationale -et -l -' -unité -d -' -action -syndicale -en -Europe -. -. -< -S10 -= -0 -> -§ -les -progrès -de -la -détente -_ -fait -principal -de -la -situation -internationale -_ -sont -un -succès -pour -les -travailleurs -, -les -peuples -, -toutes -les -forces -de -progrès -. -ils -traduisent -le -recul -des -positions -de -l -' -impérialisme -dans -le -monde -; -les -résultats -, -dans -leur -édification -, -des -pays -socialistes -, -qui -ne -connaissent -ni -crise -, -ni -inflation -, -ni -chômage -, -le -renforcement -des -luttes -de -classe -des -travailleurs -dans -les -grands -pays -capitalistes -, -les -nouveaux -succès -du -mouvement -de -libération -nationale -caractérisés -par -la -victoire -historique -des -travailleurs -et -des -peuples -du -Viêt -- -Nam -et -du -Cambodge -contre -l -' -impérialisme -américain -, -le -renforcement -de -l -' -indépendance -économique -et -politique -contre -le -néocolonialisme -de -différents -pays -libérés -. -§ -à -cet -égard -, -la -CGT -considère -parfaitement -légitimes -les -mesures -prises -par -les -pays -producteurs -de -pétrole -et -d -' -autres -matières -premières -pour -obtenir -des -prix -normaux -. -elle -exprime -sa -solidarité -à -ceux -qui -sont -engagés -dans -une -voie -démocratique -et -anticapitaliste -. -§ -elle -agit -pour -la -sauvegarde -de -la -paix -, -la -sécurité -en -Europe -et -dans -le -monde -, -la -coopération -internationale -. -§ -elle -exige -du -gouvernement -une -politique -active -de -paix -et -d -' -indépendance -nationale -. -§ -le -courant -pour -la -démocratie -se -renforce -. -il -s -' -est -manifesté -en -particulier -par -le -renversement -de -la -dictature -fasciste -au -Portugal -et -en -Grèce -. -§ -contraint -au -recul -, -l -' -impérialisme -s -' -acharne -pourtant -à -préserver -sa -domination -par -tous -les -moyens -lorsqu -' -il -en -a -la -possibilité -$ -: -la -bestialité -des -généraux -putschistes -au -Chili -en -est -l -' -illustration -et -les -menaces -d -' -intervention -militaire -contre -les -pays -producteurs -de -pétrole -. -§ -la -CGT -renforcera -son -action -de -solidarité -avec -les -travailleurs -, -les -syndicats -, -les -démocrates -du -Chili -, -d -' -Espagne -et -tous -ceux -qui -subissent -la -répression -, -le -joug -fasciste -, -le -racisme -à -travers -le -monde -. -§ -la -CGT -poursuivra -son -action -avec -les -autres -forces -progressistes -de -France -pour -la -solidarité -aux -peuples -du -Viêt -- -Nam -et -du -Cambodge -. -§ -elle -se -prononce -pour -un -règlement -des -problèmes -du -Moyen -- -Orient -qui -, -mettant -fin -à -la -politique -agressive -des -dirigeants -d -' -Israël -, -restitue -leurs -territoires -aux -pays -arabes -, -rétablisse -, -conformément -aux -décisions -de -l -' -ONU -, -le -peuple -palestinien -dans -ses -droits -nationaux -et -assure -le -droit -à -l -' -existence -et -la -sécurité -de -tous -les -* -états -de -cette -région -, -y -compris -l -' -* -état -d -' -Israël -. -§ -affirmant -la -permanence -de -son -attitude -anticolonialiste -et -antinéocolonialiste -, -la -CGT -salue -les -victoires -remportées -par -les -peuples -d -' -Angola -, -du -Mozambique -et -de -Guinée -- -Bissau -, -et -se -déclare -solidaire -des -peuples -d -' -Afrique -en -lutte -pour -conquérir -ou -consolider -leur -indépendance -économique -. -§ -elle -appuie -la -lutte -des -travailleurs -et -des -peuples -des -* -départements -d -' -Outre -- -Mer -et -des -* -territoires -d -' -Outre -- -Mer -pour -la -liquidation -du -colonialisme -français -et -l -' -octroi -aux -DOM -du -statut -d -' -autonomie -réclamé -par -les -populations -de -ces -pays -. -§ -des -changements -importants -et -positifs -se -produisent -dans -le -mouvement -syndical -à -travers -le -monde -. -§ -dans -les -pays -capitalistes -, -frappés -par -la -crise -et -où -sévissent -les -sociétés -multinationales -, -les -travailleurs -en -subissent -les -mêmes -conséquences -$ -: -inflation -, -chômage -, -attaques -contre -leur -niveau -de -vie -et -leurs -droits -. -§ -les -luttes -de -classe -s -' -y -aiguisent -partout -et -elles -trouvent -leur -reflet -au -sein -même -d -' -organisation -dont -l -' -orientation -est -traditionnellement -axée -vers -la -collaboration -de -classe -et -où -l -' -on -constate -la -progression -des -idées -et -de -la -pratique -d -' -une -attitude -plus -combative -dans -la -défense -des -intérêts -de -classe -des -travailleurs -. -§ -sur -cette -base -, -ainsi -qu -' -en -conséquence -de -l -' -évolution -internationale -, -se -développe -un -mouvement -favorable -au -rapprochement -entre -organisations -syndicales -de -différentes -affiliations -internationales -et -entre -les -centrales -internationales -elles -- -mêmes -. -§ -la -CGT -contribue -, -par -ses -initiatives -directes -et -par -sa -participation -active -à -l -' -action -de -la -FSM -, -à -favoriser -cette -évolution -, -pour -aboutir -à -un -vaste -développement -de -l -' -unité -d -' -action -internationale -pour -des -objectifs -concrets -communs -répondant -aux -intérêts -des -travailleurs -, -de -la -démocratie -et -de -la -paix -et -par -des -actions -effectives -. -§ -elle -attache -la -plus -grande -importance -au -renforcement -de -l -' -influence -de -la -FSM -dont -le -rôle -et -le -prestige -international -grandissent -en -raison -de -son -action -et -des -idées -de -lutte -conséquente -qu -' -elle -représente -. -la -CGT -renforcera -en -particulier -son -soutien -aux -UIS -de -la -FSM -dont -le -rôle -est -capital -pour -l -' -organisation -concrète -de -la -défense -internationale -effective -des -intérêts -des -travailleurs -contre -les -sociétés -multinationales -. -§ -la -CGT -qui -entretient -de -longue -date -une -coopération -fraternelle -avec -les -syndicats -des -pays -socialistes -, -entend -la -développer -encore -et -contribuer -à -faire -connaître -avec -objectivité -la -réalité -et -les -résultats -des -pays -socialistes -qui -intéressent -au -plus -haut -point -les -travailleurs -français -. -§ -c -' -est -naturellement -en -Europe -que -les -responsabilités -de -la -CGT -sont -les -plus -grandes -. -c -' -est -aussi -sur -notre -continent -que -l -' -on -assiste -à -des -évolutions -parmi -les -plus -importantes -dans -le -mouvement -syndical -. -§ -une -première -rencontre -unitaire -des -centrales -syndicales -de -tous -les -pays -d -' -Europe -, -capitalistes -et -socialistes -, -sans -considération -d -' -affiliation -internationale -s -' -est -tenue -en -janvier -1974 -. -§ -une -deuxième -rencontre -de -toutes -ces -centrales -a -eu -lieu -en -février -- -mars -1975 -. -des -perspectives -concrètes -existent -pour -que -s -' -instaurent -au -- -delà -des -relations -bilatérales -, -des -relations -multilatérales -, -collectives -, -sans -discrimination -pour -étudier -des -problèmes -syndicaux -, -économiques -et -sociaux -d -' -intérêt -commun -. -§ -la -CGT -y -attache -une -très -grande -importance -et -entend -y -coopérer -de -son -mieux -, -dans -un -esprit -constructif -de -compréhension -mutuelle -. -elle -considère -qu -' -il -est -nécessaire -et -possible -d -' -établir -des -rapports -et -une -coopération -suivis -entre -toutes -les -centrales -des -pays -d -' -Europe -, -quel -que -soit -leur -régime -économique -et -social -. -§ -en -Europe -occidentale -il -est -urgent -d -' -aller -de -l -' -avant -. -dans -tous -ces -pays -, -les -travailleurs -se -heurtent -à -la -même -situation -économique -, -à -des -politiques -gouvernementales -et -patronales -similaires -et -subissent -le -poids -des -sociétés -multinationales -. -§ -au -sein -de -la -CEE -, -qui -s -' -est -avérée -incapable -de -promouvoir -une -véritable -politique -sociale -malgré -les -promesses -réitérées -, -les -travailleurs -sont -appelés -au -" -partage -des -sacrifices -" -et -subissent -les -mêmes -méthodes -d -' -austérité -. -ils -se -heurtent -à -l -' -emprise -accrue -des -grandes -féodalités -financières -et -industrielles -de -chaque -pays -et -internationales -, -notamment -américaines -. -§ -la -coopération -syndicale -est -urgente -, -pour -des -initiatives -communes -dans -les -institutions -de -la -CEE -, -pour -démocratiser -ces -institutions -. -cette -coopération -est -nécessaire -pour -promouvoir -une -Europe -antimonopoliste -, -démocratique -et -pacifique -. -§ -au -- -delà -des -problèmes -propres -aux -pays -membres -de -la -CEE -, -se -pose -avec -acuité -la -recherche -de -l -' -unité -d -' -actionentre -les -syndicats -de -tous -les -pays -d -' -Europe -occidentale -. -§ -la -constitution -de -la -CES -a -représenté -un -événement -nouveau -. -son -ouverture -aux -centrales -affiliées -à -la -CMT -( -dont -la -CFDT -) -puis -à -la -CGIL -marque -un -progrès -. -§ -si -l -' -évolution -unitaire -est -le -trait -dominant -, -il -n -' -en -reste -pas -moins -que -demeurent -encore -dans -certaines -centrales -des -attitudes -héritées -de -la -guerre -froide -qui -maintiennent -des -blocages -artificiels -. -§ -la -CGT -souhaite -participer -à -la -CES -dans -un -esprit -constructif -et -réaliste -. -elle -ne -saurait -évidemment -admettre -des -conditions -discriminatoires -d -' -aucune -sorte -. -§ -de -la -même -manière -qu -' -elle -trouve -naturel -que -les -organisations -affiliées -à -la -CISL -ou -à -la -CMT -aient -conservé -leur -affiliation -internationale -, -elle -entend -conserver -librement -son -affiliation -à -la -FSM -, -sans -aucune -espèce -de -" -distance -" -. -la -CGT -entend -être -un -partenaire -syndical -loyal -, -sérieux -mais -égal -en -tous -points -. -§ -des -tâches -urgentes -et -communes -sollicitent -les -organisations -syndicales -en -Europe -occidentale -. -les -revendications -essentielles -de -défense -des -intérêts -des -travailleurs -sont -communes -. -sous -une -forme -ou -sous -une -autre -, -il -faut -faire -face -ensemble -avec -tout -l -' -esprit -de -compréhension -nécessaire -. -il -faut -développer -des -initiatives -d -' -action -unitaires -; -le -plus -tôt -sera -le -mieux -. -< -S10 -= -1 -> -conclusion -. -. -< -S10 -= -0 -> -§ -l -' -année -1975 -est -celle -du -80ème -anniversaire -de -la -* -confédération -générale -du -travail -. -§ -dès -sa -création -, -la -CGT -a -inscrit -dans -ses -statuts -les -orientations -essentielles -qui -guident -aujourdhui -sa -vie -et -son -action -. -§ -organisation -de -masse -ouverte -à -tous -les -salariés -, -elle -affirmait -en -1895 -la -nécessité -de -la -lutte -pour -défendre -leurs -intérêts -de -classe -et -son -but -$ -: -la -suppression -de -l -' -exploitation -des -salariés -par -les -patrons -. -§ -depuis -cette -période -, -la -CGT -a -été -au -coeur -des -luttes -et -de -l -' -histoire -du -mouvement -ouvrier -, -du -mouvement -syndical -, -et -de -l -' -histoire -de -la -France -tout -particulièrement -lors -du -* -front -populaire -, -pendant -la -* -résistance -à -l -' -occupant -nazi -, -et -dans -les -années -qui -ont -suivi -la -* -libération -. -§ -les -connaissances -, -la -conscience -, -l -' -expérience -historique -acquises -dans -les -luttes -de -classe -, -dans -la -vie -nationale -, -dans -la -solidarité -internationale -et -les -rapports -avec -le -mouvement -syndical -du -monde -entier -ont -profondément -transformé -la -CGT -en -conservant -le -meilleur -de -ses -orientations -initiales -. -§ -au -cours -des -trente -années -qui -ont -suivi -la -deuxième -guerre -mondiale -, -la -CGT -a -connu -les -épreuves -de -la -scission -et -de -la -guerre -froide -, -la -lutte -contre -le -colonialisme -français -, -le -combat -entrepris -dès -le -début -contre -la -mainmise -des -monopoles -sur -l -' -* -état -et -contre -le -pouvoir -personnel -en -France -. -§ -des -éléments -historiques -nouveaux -sont -apparus -dans -ce -combat -. -§ -l -' -unité -d -' -action -entre -la -CGT -et -la -CFDT -est -devenue -un -élément -important -de -la -vie -et -des -luttes -syndicales -. -§ -mai -1968 -a -été -le -premier -grand -affrontement -à -l -' -échelle -nationale -entre -les -travailleurs -et -le -pouvoir -des -grandes -sociétés -capitalistes -. -mouvement -revendicatif -, -il -posait -par -sa -dimension -même -le -problème -d -' -un -changement -radical -de -politique -et -de -transformations -profondes -dans -la -société -. -il -a -servi -de -révélateur -de -la -crise -. -depuis -, -l -' -approfondissement -de -celle -- -ci -fait -apparaître -davantage -que -c -' -est -tout -le -système -actuel -, -le -capitalisme -monopoliste -d -' -* -état -, -qui -est -en -cause -. -§ -l -' -* -union -de -la -gauche -sur -le -* -programme -commun -, -voulue -par -la -CGT -et -les -succès -considérables -qu -' -elle -a -remportés -offrent -aux -travailleurs -et -à -la -France -la -perspective -proche -de -profondes -réformes -démocratiques -et -d -' -un -progrès -économique -et -social -qui -peuvent -, -si -la -réussite -de -cette -expérience -est -réalisée -, -gagner -la -grande -majorité -des -travailleurs -et -du -pays -à -l -' -idée -de -la -transformation -socialiste -de -la -société -. -§ -cette -perspective -se -situe -dans -un -monde -en -pleine -évolution -et -transformation -, -et -ce -contexte -contribue -à -la -rendre -possible -. -§ -le -capitalisme -est -, -au -sein -même -des -grands -pays -les -plus -développés -, -dans -une -crise -profonde -qui -durera -; -le -socialisme -progresse -et -se -construit -, -le -colonialisme -direct -est -en -voie -de -liquidation -complète -, -et -les -pays -du -Tiers -- -Monde -luttent -pour -leur -indépendance -économique -. -plusieurs -régimes -fascistes -sont -tombés -et -l -' -impérialisme -est -en -recul -. -§ -cette -évolution -est -le -résultat -d -' -une -lutte -longue -et -difficile -menée -par -les -travailleurs -, -les -forces -progressistes -et -les -peuples -du -monde -entier -. -la -classe -ouvrière -, -dans -chaque -pays -et -à -l -' -échelle -internationale -a -toujours -été -l -' -élément -le -plus -solide -et -le -plus -résolu -dans -le -combat -pour -la -démocratie -, -la -paix -, -l -' -indépendance -des -peuples -et -le -progrès -. -dans -les -heures -les -plus -difficiles -elle -n -' -abandonne -pas -la -lutte -. -§ -la -CGT -est -consciente -d -' -avoir -, -pour -sa -part -syndicale -et -nationale -, -contribué -à -ce -mouvement -historique -dans -le -monde -entier -, -au -long -des -80 -ans -de -sa -propre -histoire -. -elle -reste -et -restera -fidèle -à -sa -mission -, -conforme -aux -intérêts -et -au -rôle -de -la -classe -ouvrière -et -de -l -' -ensemble -des -travailleurs -. -< -S00 -= -02 -> -< -S01 -= -003 -> -< -S02 -= -001 -> -< -S03 -= -002 -> -< -Sda -= -1975 -> -< -Sdm -= -06 -> -< -Sat -= -0 -> -< -S10 -= -1 -> -programme -d -' -action -. -. -l -' -action -pour -la -satisfaction -des -grands -objectifs -revendicatifs -. -. -< -S10 -= -0 -> -§ -dans -une -période -marquée -par -la -crise -profonde -du -système -capitaliste -et -la -volonté -du -pouvoir -de -renforcer -par -tous -les -moyens -la -puissance -des -groupes -financiers -et -industriels -les -plus -importants -, -la -politique -du -gouvernement -et -du -patronat -est -fondée -sur -une -accentuation -de -l -' -exploitation -capitaliste -. -l -' -inflation -constitue -un -moyen -d -' -accentuer -et -de -généraliser -cette -exploitation -. -§ -peser -sur -le -pouvoir -d -' -achat -, -limiter -sa -progression -, -constitue -l -' -objectif -avoué -du -patronat -et -de -l -' -* -état -patron -. -< -S10 -= -1 -> -pouvoir -d -' -achat -. -. -salaires -. -. -< -S10 -= -0 -> -§ -dans -ces -conditions -, -le -problème -des -salaires -et -du -pouvoir -d -' -achat -est -plus -que -jamais -la -préoccupation -première -et -permanente -des -travailleurs -et -du -mouvement -syndical -, -parce -qu -' -il -détermine -, -dans -une -mesure -décisive -, -le -niveau -de -vie -du -salarié -et -qu -' -il -est -l -' -enjeu -de -la -lutte -quotidienne -avec -le -capital -. -la -progression -du -pouvoir -d -' -achat -représente -un -moyen -efficace -pour -assurer -le -plein -emploi -et -le -développement -de -l -' -économie -. -§ -la -CGT -développe -son -action -conjointement -pour -$ -: -_ -l -' -augmentation -des -salaires -compte -tenu -, -tout -à -la -fois -, -de -leur -niveau -scandaleusement -insuffisant -pour -certaines -catégories -et -dans -certains -secteurs -professionnels -et -de -l -' -écart -qui -s -' -est -creusé -, -en -général -, -entre -les -salaires -et -les -prix -; -_ -la -garantie -du -pouvoir -d -' -achat -s -' -appliquant -aux -salaires -ainsi -revalorisés -; -_ -la -progression -du -pouvoir -d -' -achat -; -_ -la -remise -en -ordre -des -salaires -et -systèmes -de -rémunération -. -< -S10 -= -1 -> -garantie -du -pouvoir -d -' -achat -des -salaires -. -. -< -S10 -= -0 -> -§ -la -poussée -inflationniste -que -l -' -on -observe -dans -notre -pays -conduit -naturellement -les -travailleurs -à -revendiquer -des -mesures -de -protection -de -leur -pouvoir -d -' -achat -. -§ -la -garantie -effective -du -pouvoir -d -' -achat -des -salaires -, -pour -tous -les -salariés -, -suppose -l -' -établissement -d -' -un -véritable -système -national -et -interprofessionnel -d -' -échellemobile -, -assurant -périodiquement -et -à -intervalles -rapprochés -le -relèvement -automatique -des -salaires -et -traitements -, -en -fonction -des -hausses -des -prix -intervenues -, -avec -compensation -pour -les -pertes -subies -dans -la -période -antérieure -. -§ -elle -suppose -aussi -la -suppression -dans -la -législation -des -interdictions -ou -limitation -des -clauses -d -' -indexation -. -§ -l -' -évolution -du -coût -de -la -vie -doit -être -établie -par -un -nouvel -indice -reflétant -la -réalité -des -prix -, -qui -doit -être -élaboré -en -accord -avec -les -organisations -syndicales -et -familiales -. -< -S10 -= -1 -> -progression -du -pouvoir -d -' -achat -des -salaires -. -. -< -S10 -= -0 -> -§ -la -progression -du -pouvoir -d -' -achat -doit -permettre -la -satisfaction -des -besoins -nouveaux -qui -apparaissent -comme -des -exigences -de -la -vie -à -l -' -étape -actuelle -de -la -société -, -pour -toutes -les -catégories -de -travailleurs -. -§ -elle -est -un -impératif -du -développement -économique -et -social -de -la -* -nation -et -contribue -à -assainir -la -situation -de -l -' -emploi -. -§ -cette -progression -se -justifie -pleinement -par -l -' -ampleur -des -profits -capitalistes -, -le -développement -du -revenu -national -, -les -progrès -de -l -' -économie -et -l -' -accroissement -considérable -de -la -productivité -du -travail -; -elle -doit -être -assurée -quelle -que -soit -l -' -évolution -de -la -situation -économique -. -§ -le -pouvoir -d -' -achat -des -salaires -de -tous -les -travailleurs -doit -progresser -. -§ -cette -progression -, -plus -importante -pour -les -bas -et -moyens -salaires -, -donc -différenciée -, -doit -être -négociée -au -niveau -des -branches -professionnelles -et -des -entreprises -, -et -pour -tous -les -secteurs -d -' -activité -, -public -et -privé -. -§ -cette -progression -différenciée -doit -s -' -inscrire -dans -une -politique -de -remise -en -ordre -des -systèmes -de -rémunérations -, -ramenant -les -classifications -et -coefficients -à -un -nombre -raisonnable -avec -, -entre -deux -coefficients -successifs -, -des -écarts -significatifs -, -revalorisant -la -hiérarchie -des -catégories -ouvriers -employés -et -techniciens -et -tendant -à -réduire -l -' -écart -hiérarchique -réel -par -un -resserrement -vers -le -haut -. -< -S10 -= -1 -> -remise -en -ordre -des -salaires -et -des -systèmes -de -rémunérations -. -. -< -S10 -= -0 -> -§ -cette -remise -en -ordre -, -qui -s -' -inscrit -dans -notre -objectif -de -statut -unique -du -manoeuvre -à -l -' -ingénieur -, -doit -être -établie -en -fonction -des -principes -suivants -$ -: -_ -établissement -, -dans -chaque -branche -, -d -' -une -grille -nationale -unique -de -classifications -et -de -salaires -garantis -, -couvrant -toutes -les -catégories -de -salariés -, -du -manoeuvre -au -cadre -, -et -s -' -appliquant -à -tous -, -sans -discrimination -d -' -aucune -sorte -. -_ -ces -grilles -uniques -, -nationales -et -professionnelles -, -devront -comporter -une -définition -des -classifications -, -tenant -compte -des -changements -intervenus -dans -tous -les -domaines -( -scientifiques -, -techniques -, -technologiques -) -des -diplômes -, -de -la -place -et -du -rôle -des -hommes -dans -le -processus -de -production -. -ces -définitions -se -référeront -aux -connaissances -acquises -par -le -travailleur -, -qu -' -elles -soient -sanctionnées -ou -non -par -un -diplôme -, -à -l -' -expérience -qu -' -il -possède -, -aux -initiatives -qu -' -il -peut -prendre -et -aux -responsabilités -qui -lui -incombent -. -_ -les -barèmes -nationaux -de -salaires -garantis -seront -calculés -, -pour -chaque -classification -et -coefficient -correspondant -par -rapport -à -une -valeur -de -point -unique -, -affectée -au -coefficient -100 -. -ces -salaires -garantis -par -conventions -collectives -et -accords -devront -exclure -toutes -les -primes -et -représenter -l -' -essentiel -de -la -rémunération -. -§ -la -réalisation -de -ces -dispositions -essentielles -suppose -$ -: -_ -la -suppression -de -tous -les -systèmes -de -rémunération -basés -sur -les -études -de -postes -; -_ -l -' -intégration -dans -le -salaire -garanti -des -primes -aléatoires -ayant -le -caractère -de -fait -d -' -un -complément -de -salaire -ou -portant -atteinte -à -la -dignité -des -travailleurs -; -_ -l -' -élimination -des -disparités -existantes -entre -des -salariés -de -même -qualification -; -_ -la -suppression -des -abattements -de -zones -et -des -disparités -régionales -; -_ -la -suppression -de -toute -discrimination -basée -sur -l -' -âge -, -le -sexe -ou -la -nationalité -; -_ -la -limitation -des -éléments -de -la -rémunération -liés -au -rendement -par -leur -intégration -partielle -dans -le -salaire -garanti -; -leur -suppression -, -par -voie -contractuelle -, -dans -les -branches -et -les -entreprises -où -les -conditions -existent -pour -les -intégrer -en -totalité -dans -le -salaire -garanti -; -_ -la -garantie -de -la -classification -et -du -salaire -, -en -cas -de -mutation -ou -de -changement -de -poste -de -travail -; -_ -la -suppression -de -la -rémunération -au -rendement -pour -les -femmes -enceintes -, -leur -classification -et -leur -salaire -antérieur -leur -étant -garantis -. -§ -lorsqu -' -une -partie -du -salaire -restera -liée -au -rendement -, -la -partie -mobile -du -salaire -venant -s -' -ajouter -au -salaire -garanti -devra -être -calculée -à -partir -de -celui -- -ci -, -d -' -une -manière -contrôlable -et -claire -pour -les -travailleurs -concernés -, -et -assurer -obligatoirement -une -rémunération -supérieure -au -salaire -garanti -dans -la -catégorie -. -< -S10 -= -1 -> -salaire -minimum -interprofessionnel -. -. -< -S10 -= -0 -> -§ -la -CGT -estime -qu -' -il -est -indispensable -de -donner -au -salaire -minimum -interprofessionnel -de -croissance -( -SMIC -) -une -valeur -telle -qu -' -elle -constitue -une -véritable -garantie -permettant -une -vie -décente -aux -salariés -dont -les -rémunérations -sont -les -plus -faibles -. -c -' -est -pourquoi -, -elle -demande -que -le -SMIC -soit -porté -à -1700 -francs -par -mois -( -valeur -mai -75 -) -qu -' -il -soit -mensualisé -sur -la -base -de -la -durée -légale -du -travail -( -40 -heures -par -semaine -) -, -que -cette -garantie -mensuelle -soit -assurée -à -tous -les -salariés -, -en -cas -de -réduction -d -' -horaire -au -- -dessous -de -40 -heures -, -et -que -son -pouvoir -d -' -achat -soit -garanti -par -référence -à -un -indice -des -prix -rénové -et -établi -par -voie -de -négociation -. -§ -cette -garantie -minimale -mensuelle -devra -s -' -appliquer -à -l -' -ensemble -des -salariés -et -servir -de -référence -à -l -' -évolution -des -retraites -et -pensions -, -ainsi -que -des -diverses -allocations -sociales -. -cette -dernière -mesure -suppose -la -suppression -du -minimum -garanti -, -qui -sert -d -' -indexation -à -plusieurs -indemnités -et -ne -cesse -de -se -dévaloriser -depuis -1970 -. -§ -la -CGT -demande -que -la -loi -du -2 -janvier -1970 -, -portant -réforme -du -salaire -minimum -interprofessionnel -, -soit -modifiée -pour -que -la -commission -supérieure -des -conventions -collectives -procède -, -deux -fois -par -an -, -à -une -véritable -discussion -sur -la -progression -du -SMIC -, -dont -le -taux -doit -être -fixé -en -tenant -compte -de -l -' -avis -émis -par -la -commission -. -§ -la -CGT -estime -, -en -outre -, -qu -' -il -convient -de -rendre -au -SMIC -le -sens -qu -' -il -avait -à -son -origine -, -c -' -est -- -à -- -dire -qu -' -il -devrait -être -fixé -net -de -toutes -primes -ou -majorations -de -quelque -nature -que -ce -soit -. -§ -par -ailleurs -, -la -loi -doit -interdire -la -fixation -dans -les -conventions -collectives -de -salaires -garantis -inférieurs -au -SMIC -. -< -S10 -= -1 -> -mensualisation -et -statut -unique -. -. -< -S10 -= -0 -> -§ -la -CGT -considère -que -la -mensualisation -des -ouvriers -, -qui -ne -se -limite -pas -au -seul -paiement -au -mois -du -salaire -, -n -' -est -pas -encore -réalisée -. -§ -pour -que -cette -mensualisation -soit -réelle -, -elle -doit -apporter -les -mêmes -garanties -à -toutes -les -catégories -de -salariés -, -et -permettre -aux -ouvriers -de -chaque -branche -professionnelle -de -bénéficier -de -tous -les -droits -et -avantages -dont -ils -sont -encore -exclus -. -§ -cette -généralisation -sans -restriction -des -droits -, -leurs -améliorations -, -doivent -se -traduire -, -dans -chacun -des -secteurs -professionnels -, -par -l -' -élaboration -d -' -un -statut -unique -national -, -comportant -des -avantages -substantiels -, -applicable -à -toutes -les -catégories -de -travailleurs -et -trouver -place -dans -les -* -conventions -collectives -. -< -S10 -= -1 -> -prestations -, -allocations -, -rentes -, -pensions -. -. -< -S10 -= -0 -> -§ -la -politique -de -démantèlement -de -la -* -sécurité -sociale -engagée -par -le -* -pouvoir -et -le -* -patronat -particulièrement -depuis -1958 -se -poursuit -sans -relâche -. -après -les -* -ordonnances -de -1967 -la -loi -sur -la -compensation -et -l -' -harmonisation -des -régimes -de -* -sécurité -sociale -constitue -une -nouvelle -et -grave -atteinte -à -la -* -sécurité -sociale -. -le -plan -de -démantèlement -de -cette -institution -, -fondamentale -pour -les -travailleurs -, -est -progressivement -réalisé -. -§ -cette -politique -a -pour -conséquence -une -dévalorisation -continue -des -prestations -et -des -services -rendus -aux -assurés -, -allocataires -et -pensionnés -. -compte -tenu -de -l -' -inflation -ceux -- -ci -connaissent -une -dégradation -constante -de -leur -pouvoir -d -' -achat -. -§ -face -à -cette -situation -, -la -CGT -revendique -en -tout -premier -lieu -le -relèvement -automatique -et -périodique -des -allocations -, -rentes -, -pensions -et -retraites -, -en -fonction -de -la -hausse -des -prix -enregistrée -par -un -nouvel -indice -élaboré -en -accord -avec -les -organisations -syndicales -et -familiales -. -§ -la -CGT -exige -$ -: -pour -les -prestations -sociales -et -les -rentes -$ -: -_ -le -remboursement -à -80 -et -100 -% -des -dépenses -de -santé -, -y -compris -celles -résultant -de -l -' -interruption -de -grossesse -, -remboursement -garanti -par -une -* -convention -médicale -issue -d -' -une -véritable -négociation -entre -les -médecins -et -les -représentants -des -assurés -sociaux -; -_ -l -' -exonération -totale -du -ticket -modérateur -pour -la -longue -maladie -, -les -personnes -âgées -et -les -enfants -de -moins -de -six -ans -, -première -étape -vers -la -gratuité -des -soins -; -_ -l -' -extension -du -tiers -payant -supprimant -l -' -avance -d -' -argent -pour -l -' -hospitalisation -, -la -pharmacie -, -les -soins -dentaires -, -les -analyses -et -examens -de -laboratoire -; -_ -la -fixation -de -l -' -indemnité -journalière -maladie -et -de -la -pension -d -' -invalidité -2ème -catégorie -à -75 -% -du -salaire -avec -un -minimum -égal -à -80 -% -du -SMIC -. -s -' -agissant -de -l -' -indemnité -journalière -versée -à -la -suite -d -' -un -accident -du -travail -ou -d -' -une -maladie -professionnelle -, -elle -devrait -être -portée -à -100 -% -du -salaire -; -_ -l -' -établissement -d -' -un -minimum -de -ressources -égal -au -SMIC -pour -les -handicapés -qui -travaillent -et -à -80 -% -du -SMIC -pour -ceux -dans -l -' -incapacité -de -travailler -. -pour -les -prestations -familiales -$ -: -_ -afin -de -rattraper -les -retards -accumulés -par -les -* -allocations -familiales -, -la -CGT -demande -qu -' -elles -soient -revalorisées -immédiatement -de -30 -% -et -que -leur -progression -soit -assurée -en -fonction -de -l -' -évolution -des -salaires -; -_ -elle -exige -leur -versement -aux -travailleurs -immigrés -dans -les -mêmes -conditions -que -celles -requises -pour -les -nationaux -, -quel -que -soit -le -pays -de -résidence -des -familles -; -_ -elle -se -prononce -pour -une -refonte -du -système -des -prestations -familiales -, -notamment -par -$ -: -_ -la -fusion -du -salaire -unique -et -des -allocations -familiales -, -_ -l -' -attribution -de -la -prestation -dès -le -premier -enfant -sans -aucune -discrimination -et -sans -conditions -de -ressources -; -_ -elle -revendique -l -' -attribution -aux -femmes -salariés -d -' -une -indemnité -de -garde -pour -les -enfants -de -moins -de -trois -ans -quel -que -soit -le -mode -de -garde -adopté -. -§ -pour -les -pensions -et -retraites -$ -: -les -travailleurs -retraités -connaissent -des -conditions -de -vie -très -difficiles -résultant -du -trop -faible -niveau -des -retraites -et -de -leur -insuffisante -progression -face -à -l -' -évolution -du -coût -de -la -vie -. -pour -ces -raisons -et -aussi -parce -que -pour -la -CGT -il -est -fondamental -de -reconnaître -le -droit -à -la -retraite -dans -des -conditions -permettant -de -vivre -décemment -, -elle -exige -$ -: -_ -une -retraite -égale -à -75 -% -de -tous -les -éléments -de -la -rémunération -, -avec -un -montant -minimum -égal -au -SMIC -, -à -60 -ans -pour -les -hommes -et -55 -ans -pour -les -femmes -et -les -salariés -effectuant -des -travaux -pénibles -ou -insalubres -; -_ -une -pension -de -reversion -fixée -, -pour -tous -les -secteurs -, -à -75 -% -de -la -pension -principale -; -_ -la -suppression -des -restrictions -interdisant -le -cumul -d -' -une -pension -propre -et -d -' -une -pension -de -reversion -; -_ -la -revalorisation -des -pensions -et -retraites -en -fonction -de -l -' -évolution -réelle -du -coût -de -la -vie -et -de -la -progression -des -salaires -; -_ -le -paiement -mensuel -et -d -' -avance -des -pensions -et -retraites -; -_ -la -reconnaissance -pour -les -travailleurs -immigrés -de -droits -identiques -à -ceux -des -travailleurs -français -, -quels -que -soient -leur -origine -et -le -pays -de -résidence -des -familles -. -§ -l -' -amélioration -de -la -situation -des -retraités -passe -également -pour -un -très -grand -nombre -d -' -entre -eux -par -une -juste -progression -des -retraites -complémentaires -, -progression -qui -doit -tenir -compte -, -elle -aussi -, -de -l -' -évolution -du -coût -de -la -vie -et -de -celle -des -salaires -. -§ -la -satisfaction -de -ces -revendications -essentielles -qui -doit -permettre -d -' -accorder -à -tous -les -salariés -en -activité -ou -retraités -, -un -meilleur -système -de -protection -sociale -, -ne -peut -résulter -de -transferts -financiers -entre -catégories -. -elle -suppose -que -le -problème -du -financement -de -la -* -sécurité -sociale -fasse -l -' -objet -d -' -un -réexamen -d -' -ensemble -dans -le -respect -de -ce -principe -et -dans -le -cadre -d -' -une -négociation -avec -les -organisations -syndicales -. -la -réforme -du -financement -comporte -notamment -pour -la -CGT -$ -: -_ -la -suppression -des -charges -indues -et -des -transferts -effectués -au -détriment -de -la -sécurité -sociale -; -_ -le -déplafonnement -progressif -des -cotisations -; -_ -la -nationalisation -de -l -' -industrie -pharmaceutique -qui -permettrait -de -réduire -les -coûts -et -les -dépenses -de -l -' -assurancemaladie -en -supprimant -les -gaspillages -et -en -réduisant -le -nombre -des -produits -; -_ -la -suppression -et -la -réduction -du -taux -de -la -TVA -sur -les -biens -et -services -de -santé -ouvrant -droit -aux -prestations -de -* -sécurité -sociale -. -§ -de -telles -dispositions -doivent -s -' -inscrire -dans -le -cadre -d -' -une -véritable -réforme -démocratique -de -la -* -sécurité -sociale -restituant -aux -représentants -élus -des -assurés -la -gestion -de -leur -régime -, -fixant -de -façon -satisfaisante -la -participation -budgétaire -de -l -' -* -état -et -créant -les -conditions -d -' -une -harmonisation -concertée -des -différents -régimes -dans -l -' -intérêt -de -leurs -bénéficiaires -. -§ -s -' -agissant -des -retraites -complémentaires -, -la -CGT -réclame -$ -: -_ -un -réexamen -du -financement -des -régimes -permettant -à -ceux -- -ci -, -au -moyen -notamment -d -' -une -meilleure -participation -patronale -, -de -faire -face -aux -impératifs -d -' -évolution -des -retraites -en -liaison -avec -celle -du -coût -de -la -vie -et -aussi -de -l -' -abaissement -de -l -' -âge -de -la -retraite -; -_ -l -' -harmonisation -des -règlements -, -la -coordination -entre -les -différents -systèmes -en -vue -de -rendre -possible -leur -unification -dans -le -respect -intégral -des -droits -individuels -et -des -droits -collectifs -acquis -; -_ -la -démocratisation -des -* -institutions -de -retraites -complémentaires -à -la -gestion -desquelles -les -retraités -doivent -être -associés -. -< -S10 -= -1 -> -la -fiscalité -. -. -< -S10 -= -0 -> -§ -le -système -fiscal -actuel -représente -par -son -caractère -de -classe -une -des -injustices -les -plus -flagrantes -du -régime -. -les -exonérations -et -avantages -substantiels -, -accordés -au -cours -des -dix -dernières -années -aux -grandes -sociétés -et -aux -gros -porteurs -de -capitaux -, -ont -été -compensés -par -un -alourdissement -de -la -charge -fiscale -supportée -par -les -salariés -. -§ -très -durement -frappés -par -la -TVA -et -les -impôts -indirects -qui -atteignent -fréquemment -l -' -intégralité -des -ressources -familiales -, -converties -en -dépense -de -consommation -, -les -ménages -de -salariés -en -activité -ou -retraités -sont -en -nombre -croissant -assujettis -à -l -' -impôt -sur -le -revenu -, -celui -- -ci -évoluant -plus -rapidement -que -les -salaires -. -ainsi -, -les -foyers -d -' -ouvriers -et -de -retraités -sont -de -plus -en -plus -nombreux -à -acquitter -cet -impôt -. -les -familles -de -cadres -moyens -ou -supérieurs -, -et -plus -généralement -celles -où -les -femmes -travaillent -, -supportent -, -du -fait -de -sa -forte -augmentation -, -une -charge -fiscale -très -lourde -. -pour -une -grande -partie -des -salariés -, -le -poids -de -la -charge -fiscale -, -liée -à -la -stagnation -, -voire -à -la -diminution -, -des -prestations -familiales -et -sociales -, -aboutit -à -une -régression -de -leur -pouvoir -d -' -achat -global -. -§ -pour -ces -raisons -, -la -CGT -se -prononce -en -faveur -d -' -une -refonte -démocratique -de -l -' -ensemble -du -système -fiscal -. -cette -refonte -devrait -reposer -sur -quelques -grands -principes -essentiels -$ -: -_ -une -répartition -différente -entre -les -différents -impôts -afin -notamment -de -réduire -la -part -résultant -de -la -TVA -, -d -' -assurer -un -meilleur -rendement -de -l -' -impôt -sur -les -sociétés -et -une -imposition -du -capital -; -_ -une -plus -juste -connaissance -des -revenus -de -toutes -les -catégories -de -contribuables -; -_ -des -conditions -d -' -imposition -différentes -pour -les -revenus -du -travail -, -les -revenus -du -capital -et -les -revenus -mixtes -, -la -rémunération -de -la -force -de -travail -ne -pouvant -par -exemple -être -comparée -aux -revenus -du -patrimoine -foncier -acquis -sans -effort -. -§ -dans -ce -cadre -la -CGT -se -prononce -pour -substituer -au -système -du -quotient -familial -un -dispositif -de -réduction -fixe -étudié -de -manière -à -tenir -compte -des -charges -réelles -de -famille -. -§ -dans -l -' -immédiat -la -CGT -exige -l -' -adoption -des -mesures -qui -suivent -: -< -S10 -= -1 -> -impôt -sur -la -consommation -$ -: -< -S10 -= -0 -> -_ -la -réduction -ou -la -suppression -sur -les -produits -alimentaires -et -pharmaceutiques -, -les -biens -et -services -d -' -intérêt -social -. -la -répercussion -intégrale -dans -les -prix -de -ces -dispositions -fiscales -doit -être -assurée -par -des -mesures -de -contrôle -. -< -S10 -= -1 -> -impôt -sur -le -revenu -$ -: -< -S10 -= -0 -> -_ -une -refonte -complète -du -barème -assurant -l -' -exonération -des -revenus -inférieurs -au -SMIC -et -allégeant -l -' -imposition -pour -les -petits -et -moyens -salariés -; -_ -la -révision -annuelle -du -barème -en -fonction -de -l -' -indice -des -prix -reconnu -par -les -organisations -syndicales -; -_ -le -relèvement -de -la -déduction -pour -frais -professionnels -de -10 -à -15 -% -avec -plafonnement -. -cette -mesure -étant -justifiée -par -l -' -aggravation -et -la -multiplication -de -ces -frais -. -l -' -indexation -du -plancher -de -déduction -des -frais -professionnels -sur -les -prix -; -_ -l -' -institution -d -' -une -réduction -spéciale -de -15 -% -sur -les -revenus -des -retraités -avec -établissement -d -' -un -plafonnement -; -_ -dans -l -' -attente -de -l -' -attribution -aux -femmes -salariées -d -' -une -indemnité -, -prenant -en -compte -les -frais -résultant -de -la -garde -des -enfants -en -bas -âge -, -la -déduction -des -frais -des -revenus -imposables -; -_ -pour -les -jeunes -salariés -effectuant -leur -année -de -service -militaire -, -exonération -de -l -' -impôt -sur -les -revenus -de -l -' -année -précédant -celui -- -ci -; -possibilité -de -reporter -le -paiement -des -impôts -et -des -tiers -provisionnels -dûs -pour -l -' -année -suivant -le -service -militaire -; -possibilité -d -' -étalement -du -paiement -de -l -' -impôt -pour -certains -salariés -ayant -des -revenus -irréguliers -ou -intermittents -. -§ -la -CGT -rappelle -son -opposition -au -paiement -de -l -' -impôt -sur -le -revenu -par -le -système -de -la -retenue -à -la -source -, -que -le -* -gouvernement -essaie -d -' -introduire -en -partant -du -paiement -mensuel -de -l -' -impôt -. -ce -système -en -effet -, -ne -réglant -aucun -des -véritables -problèmes -( -poids -et -répartition -de -l -' -impôt -) -favoriserait -en -outre -de -nouveaux -transferts -de -charge -au -détriment -des -salariés -. -< -S10 -= -1 -> -impôts -locaux -. -. -< -S10 -= -0 -> -§ -la -fiscalité -locale -ne -cesse -de -s -' -alourdir -et -elle -frappe -de -plus -en -plus -durement -les -foyers -de -travailleurs -, -même -ceux -ne -disposant -que -de -ressources -modiques -. -§ -les -modifications -actuellement -en -cours -dans -ce -domaine -, -que -le -gouvernement -présente -comme -une -amélioration -, -se -traduisent -au -contraire -par -une -aggravation -des -impôts -payés -par -les -ménages -. -§ -il -est -nécessaire -de -limiter -la -pression -des -impôts -locaux -sur -les -ménages -par -une -réforme -démocratique -se -situant -dans -le -cadre -d -' -une -refonte -des -finances -locales -et -entrainant -une -répartition -plus -juste -, -notamment -entre -les -entreprises -et -les -particuliers -. -§ -en -contrepartie -des -allégements -demandés -, -la -CGT -propose -dans -le -but -d -' -aboutir -à -une -répartition -plus -équitable -de -la -charge -fiscale -et -d -' -assurer -des -recettes -nouvelles -, -les -mesures -suivantes -: -§ -imposition -des -sociétés -et -actionnaires -$ -: -_ -élargissement -de -la -base -de -l -' -impôt -sur -les -sociétés -par -l -' -abrogation -des -régimes -de -faveur -( -amortissements -dégressifs -, -provisions -injustifiées -, -régimes -spéciaux -d -' -imposition -$ -. -. -. -) -; -_ -abrogation -des -mesures -bénéficiant -aux -revenus -du -capital -( -suppression -du -prélèvement -libératoire -, -de -l -' -avoir -fiscal -, -de -l -' -abattement -, -applicable -aux -revenus -fixes -$ -. -. -. -) -. -§ -imposition -du -capital -$ -: -_ -création -d -' -un -impôt -progressif -sur -le -capital -et -l -' -actif -net -des -grandes -sociétés -. -§ -lutte -contre -la -fraude -fiscale -$ -: -la -CGT -demande -de -véritables -mesures -de -nature -à -mettre -fin -à -la -fraude -fiscale -qui -se -situe -essentiellement -au -niveau -des -grandes -sociétés -, -de -leurs -actionnaires -et -de -leurs -dirigeants -. -le -problème -déterminant -étant -celui -de -la -connaissance -exacte -des -revenus -de -toute -nature -, -il -est -indispensable -( -indépendamment -des -mesures -de -publicité -de -l -' -impôt -) -que -l -' -* -administration -dispose -de -moyens -suffisants -pour -exercer -sa -mission -de -contrôle -contre -la -véritable -fraude -. -< -S10 -= -1 -> -le -droit -au -travail -le -droit -à -l -' -emploi -, -sa -garantie -, -l -' -indemnisation -du -chômage -. -. -le -droit -à -l -' -emploi -. -. -< -S10 -= -0 -> -§ -la -politique -économique -et -sociale -actuelle -aggrave -l -' -insécurité -de -l -' -emploi -et -le -chômage -. -§ -les -moyens -fondamentaux -de -renverser -cette -tendance -sont -contenus -dans -l -' -ensemble -du -présent -programme -. -§ -dans -l -' -immédiat -, -la -CGT -se -prononce -à -nouveau -en -faveur -de -mesures -générales -efficaces -permettant -d -' -améliorer -sensiblement -la -situation -de -l -' -emploi -$ -: -_ -progression -du -pouvoir -d -' -achat -( -stimulant -pour -l -' -économie -) -; -_ -avancement -de -l -' -âge -ouvrant -droit -à -la -retraite -; -_ -réduction -du -temps -de -travail -sans -diminution -de -salaire -et -allègement -de -la -charge -de -travail -individuelle -devant -entraîner -l -' -embauche -d -' -effectifs -supplémentaires -. -§ -ces -mesures -sont -indissociables -de -la -mise -en -oeuvre -d -' -unevéritable -politique -de -développement -économique -qui -offrirait -les -débouchés -nécessaires -à -toutes -les -personnes -désirant -occuper -un -emploi -notamment -aux -jeunes -et -aux -femmes -. -§ -_ -les -textes -légaux -et -contractuels -sont -susceptibles -d -' -apporter -certaines -protections -appréciables -mais -ne -résolvent -pas -le -problème -décisif -de -la -garantie -de -l -' -emploi -et -ne -règlent -que -partiellement -celui -des -garanties -de -ressources -dont -de -nombreux -salariés -sont -exclus -. -§ -pour -atteindre -ces -deux -objectifs -, -la -CGT -formule -les -revendications -suivantes -, -pour -l -' -ensemble -des -salariés -des -secteurs -public -, -nationalisé -et -privé -, -quels -que -soient -leur -âge -, -leur -sexe -ou -leur -nationalité -. -< -S10 -= -1 -> -la -garantie -de -l -' -emploi -. -. -< -S10 -= -0 -> -§ -_ -droit -à -l -' -information -complète -et -contrôlable -faite -en -temps -utile -des -salariés -, -de -leurs -représentants -et -des -organisations -syndicales -sur -tous -les -problèmes -concernant -l -' -emploi -. -_ -droit -réel -de -discussion -pour -les -syndicats -et -les -représentants -du -personnel -sur -les -mesures -susceptibles -d -' -entraîner -des -compressions -d -' -effectifs -, -des -licenciements -ou -des -modifications -d -' -emploi -, -envisagées -par -les -employeurs -. -_ -droit -de -recours -, -pour -les -syndicats -et -les -représentants -du -personnel -, -à -des -instances -paritaires -et -à -des -instances -juridiques -habilitées -à -cet -effet -en -cas -de -difficultés -dans -l -' -entreprise -$ -: -le -recours -suspend -toute -décision -de -licenciement -. -_ -interdiction -de -tout -licenciement -non -accompagné -d -' -une -mesure -de -reclassement -préalable -, -garantissant -pleinement -les -droits -des -travailleurs -et -leur -assurant -une -situation -équivalente -. -_ -protections -équivalentes -des -salariés -licenciés -en -cas -de -faillite -( -liquidation -de -biens -, -règlement -judiciaire -) -par -la -mise -en -oeuvre -de -la -responsabilité -collective -du -patronat -. -_ -réemploi -obligatoire -des -femmes -dès -leur -retour -du -congé -légal -d -' -un -an -pour -élever -un -enfant -et -des -jeunes -à -l -' -issue -du -* -service -national -avec -maintien -des -avantages -acquis -. -_ -interdiction -de -tout -licenciement -prioritaire -basé -sur -l -' -âge -, -le -sexe -ou -la -nationalité -. -_ -application -intégrale -et -extension -à -l -' -ensemble -des -salariés -des -droits -découlant -des -accords -nationaux -interprofessionnels -, -lois -et -règlements -, -sur -la -sécurité -de -l -' -emploi -, -la -formation -et -le -perfectionnement -professionnels -. -_ -droit -de -contrôle -( -et -moyens -réels -de -l -' -assurer -) -, -sur -l -' -utilisation -des -fonds -publics -alloués -aux -entreprises -pour -création -ou -évolution -d -' -emplois -. -_ -suppression -des -contrats -à -durée -limitée -. -_ -personnel -permanent -en -nombre -suffisant -permettant -d -' -assurer -les -travaux -courants -de -l -' -entreprise -et -excluant -dans -ces -domaines -le -recours -à -des -entreprises -extérieures -de -main -d -' -oeuvre -intérimaire -ou -temporaire -. -_ -révision -profonde -des -conditions -d -' -introduction -de -séjour -et -d -' -emploi -de -la -main -- -d -' -oeuvre -immigrée -et -prise -en -compte -des -revendications -formulées -à -cet -égard -par -la -CGT -garanties -par -un -statut -à -caractère -social -et -démocratique -. -_ -protection -des -immigrés -contre -les -trafics -et -les -abus -dont -ils -sont -victimes -, -quels -qu -' -en -soient -les -auteurs -et -stricte -application -de -la -loi -du -6 -juillet -1973 -relative -à -la -répression -des -trafics -de -main -- -d -' -oeuvre -. -_ -l -' -* -office -national -d -' -immigration -doit -être -le -seul -organisme -compétent -chargé -du -recrutement -à -l -' -étranger -, -de -l -' -introduction -et -de -l -' -accueil -des -immigrés -et -de -leurs -familles -. -< -S10 -= -1 -> -garantie -des -ressources -. -. -< -S10 -= -0 -> -§ -lorsqu -' -un -emploi -ne -peut -être -donné -à -ceux -qui -veulent -travailler -, -il -faut -leur -garantir -des -ressources -décentes -sans -limitation -de -durée -: -_ -tout -salarié -privé -d -' -emploi -par -son -employeur -et -qui -est -inscrit -comme -demandeur -d -' -emploi -doit -bénéficier -de -ressources -égales -à -son -salaire -antérieur -. -_ -tous -les -autres -demandeurs -d -' -emploi -, -y -compris -ceux -qui -recherchent -un -premier -emploi -doivent -être -assurés -d -' -un -minimum -de -ressources -égal -au -SMIC -. -_ -garantie -des -ressources -sur -la -base -de -l -' -horaire -et -du -salaire -habituels -pour -les -salariés -touchés -par -des -réductions -d -' -horaires -. -_ -garantie -de -ressources -égales -au -salaire -antérieur -à -tous -les -salariés -dont -le -reclassement -dans -un -emploi -équivalent -n -' -a -pu -être -assuré -. -_ -revalorisation -des -allocations -d -' -aide -publique -en -matière -de -chômage -total -ou -partiel -au -taux -de -50 -% -du -SMIC -, -et -élévation -substantielle -des -plafonds -de -ressources -. -_ -généralisation -de -l -' -action -du -* -fonds -national -de -l -' -emploi -. -_ -généralisation -de -l -' -accord -national -interprofessionnel -du -14 -octobre -1974 -, -sur -l -' -allocation -supplémentaire -d -' -attenteà -tous -les -salariés -victimes -de -licenciement -. -_ -généralisation -et -amélioration -de -l -' -accord -national -interprofessionnel -du -27 -mars -1972 -sur -la -garantie -de -ressources -aux -salariés -privés -d -' -emploi -de -plus -de -60 -ans -. -_ -attribution -de -délais -de -paiement -et -aide -en -matière -d -' -impôts -, -de -loyer -, -de -dettes -et -crédits -pour -les -salariés -et -leurs -familles -pendant -la -période -où -ils -sont -sans -emploi -et -inscrits -comme -demandeurs -d -' -emplois -. -_ -suspension -immédiate -de -toutes -poursuites -saisies -et -voies -d -' -exécution -à -l -' -encontre -des -chômeurs -. -_ -cotisation -ASSEDIC -à -la -charge -exclusive -des -employeurs -. -< -S10 -= -1 -> -l -' -abaissement -de -l -' -âge -de -la -retraite -. -. -< -S10 -= -0 -> -§ -alors -que -des -centaines -de -milliers -de -travailleurs -connaissent -le -chômage -et -que -les -jeunes -sont -de -plus -en -plus -nombreux -à -ne -pouvoir -trouver -un -emploi -à -l -' -issue -de -leur -temps -de -scolarité -, -* -pouvoir -et -* -patronat -contraignent -des -salariés -âgés -de -plus -de -60 -ans -à -continuer -leur -activité -professionnelle -. -§ -l -' -abaissement -de -l -' -âge -de -la -retraite -se -justifie -pleinement -$ -: -_ -pour -des -raisons -humaines -$ -: -les -statistiques -font -clairement -apparaître -que -dans -leur -grande -masse -les -travailleurs -, -et -parmi -eux -tout -particulièrement -les -ouvriers -de -l -' -industrie -et -de -l -' -agriculture -, -ont -une -durée -moyenne -de -vie -plus -brève -que -les -autres -catégories -de -la -population -, -ceci -étant -dû -notamment -aux -conditions -de -travail -dont -la -CGT -demande -l -' -amélioration -. -le -droit -doit -leur -être -reconnu -de -pouvoir -bénéficier -véritablement -et -dans -des -conditions -décentes -de -leur -retraite -. -par -ailleurs -, -les -femmes -de -plus -en -plus -nombreuses -parmi -les -salariés -, -connaissent -dans -le -contexte -actuel -une -fatigue -accrue -du -fait -de -leur -double -fonction -de -travailleuse -et -de -mère -de -famille -, -et -de -l -' -insuffisance -notoire -des -équipements -sociaux -collectifs -qui -devraient -être -créés -afin -d -' -alléger -leurs -tâches -familiales -de -ménagères -. -dans -ces -conditions -, -la -possibilité -doit -leur -être -offerte -, -ainsi -qu -' -aux -travailleurs -des -professions -les -plus -pénibles -de -pouvoir -bénéficier -d -' -une -retraite -anticipée -. -_ -pour -des -raisons -économiques -et -sociales -$ -: -les -emplois -libérés -par -les -travailleurs -admis -à -faire -valoir -leurs -droits -à -la -retraite -au -taux -plein -pourraient -être -occupés -par -des -salariés -présentement -en -chômage -. -ceci -apparaît -plus -sain -sur -le -plan -économique -et -plus -juste -sur -le -plan -social -. -§ -pour -ces -deux -motifs -essentiels -, -la -CGT -entend -faire -aboutir -la -revendication -de -l -' -âge -de -la -retraite -au -taux -plein -à -60 -ans -pour -les -hommes -et -55 -ans -pour -les -femmes -et -les -salariés -effectuant -des -travaux -pénibles -ou -insalubres -, -en -garantissant -les -avantages -acquis -par -certaines -catégories -des -secteurs -public -et -nationalisé -. -< -S10 -= -1 -> -la -réduction -de -la -durée -du -travail -. -. -< -S10 -= -0 -> -§ -la -nécessité -d -' -un -allègement -de -la -charge -de -travail -, -élément -essentiel -de -l -' -amélioration -des -conditions -de -travail -, -les -besoins -croissants -de -temps -libre -pour -le -repos -, -les -loisirs -, -l -' -information -, -l -' -accès -à -la -culture -, -l -' -aggravation -de -la -situation -de -l -' -emploi -, -font -de -la -réduction -de -la -durée -du -travail -sans -diminution -des -salaires -une -revendication -qu -' -il -est -urgent -de -satisfaire -. -§ -elle -peut -s -' -appliquer -notamment -à -l -' -échelle -de -la -semaine -, -par -la -réduction -et -la -limitation -de -la -durée -hebdomadaire -, -et -à -l -' -échelle -de -l -' -année -, -par -l -' -allongement -des -congés -payés -. -§ -les -engagements -pris -par -le -patronat -en -mai -1968 -n -' -ont -pas -été -tenus -$ -: -le -retour -à -la -semaine -de -40 -heures -sans -diminution -des -salaires -n -' -a -été -rendu -effectif -que -pour -une -minorité -de -salariés -. -§ -la -durée -du -travail -demeure -très -élevée -dans -certains -secteurs -et -certaines -entreprises -, -alors -que -se -multiplient -les -licenciements -et -les -réductions -d -' -horaires -entrainant -d -' -importantes -diminutions -de -salaires -. -§ -la -durée -maximale -légale -du -travail -demeure -fixée -à -un -niveau -inadmissible -. -§ -en -conséquence -, -la -CGT -demande -$ -: -_ -retour -rapide -et -effectif -aux -40 -heures -dans -toutes -les -branches -et -pour -toutes -les -catégories -de -travailleurs -, -avec -compensation -intégrale -des -effets -de -la -diminution -des -horaires -sur -les -salaires -. -_ -attribution -à -tous -les -salariés -d -' -une -cinquième -semaine -de -congés -payés -, -pouvant -être -prise -en -dehors -de -la -période -légale -. -_ -augmentation -des -effectifs -pour -permettre -la -réduction -de -la -durée -du -travail -pour -toutes -les -catégories -de -travailleurs -, -sans -accroissement -de -l -' -intensité -du -travail -. -_ -semaine -de -travail -de -cinq -jours -suivis -de -deux -jours -de -repos -consécutifs -obligatoires -. -_ -abaissement -progressif -de -la -durée -du -travail -en -dessous -de -40 -heures -pour -les -salariés -dont -les -conditions -de -travail -sont -particulièrement -pénibles -. -_ -limitation -à -45 -heures -de -la -durée -hebdomadaire -maximale -du -travail -. -les -heures -supplémentaires -effectuées -dans -cette -limite -et -seulement -dans -des -cas -exceptionnels -seront -obligatoirement -rémunérées -comme -telles -et -récupérées -en -repos -compensateurs -. -_ -suppression -des -dérogations -permanentes -et -du -système -des -équivalences -. -_ -limitation -de -l -' -amplitude -de -la -journée -de -travail -. -< -S10 -= -1 -> -la -formation -et -le -perfectionnement -professionnels -. -. -< -S10 -= -0 -> -§ -la -rapidité -de -l -' -évolution -technologique -transforme -les -conditions -d -' -exercice -de -l -' -ensemble -des -professions -. -la -politique -de -concentration -des -entreprises -contraint -les -travailleurs -à -des -reconversions -profondes -. -la -crise -aggravée -du -système -capitaliste -et -la -détérioration -de -la -situation -de -l -' -emploi -rendent -ces -demandes -de -conversion -encore -plus -nombreuses -et -plus -difficiles -. -§ -les -travailleurs -formulent -l -' -exigence -légitime -$ -: -_ -d -' -acquérir -un -savoir -plus -large -, -plus -complet -correspondant -à -l -' -état -présent -des -connaissances -, -_ -de -pouvoir -se -perfectionner -afin -d -' -être -mieux -garantis -dans -leur -emploi -et -d -' -accéder -à -une -promotion -réelle -, -_ -de -pouvoir -se -reconvertir -à -d -' -autres -activités -professionnelles -, -avec -le -maintien -, -au -minimum -, -de -leur -niveau -de -qualification -antérieure -. -§ -résultat -des -luttes -, -l -' -* -accord -du -9 -juillet -1970 -a -ouvert -aux -travailleurs -le -droit -à -la -formation -. -il -a -donné -également -aux -apprentis -des -garanties -nouvelles -. -les -lois -du -16 -juillet -1971 -, -malgré -leurs -insuffisances -et -leurs -aspects -restrictifs -ont -dû -confirmer -ce -droit -et -ces -garanties -. -cependant -, -la -mise -en -application -se -heurte -à -l -' -attitude -négative -du -patronat -et -du -gouvernement -qui -entendent -faire -de -ces -textes -des -instruments -au -service -de -leurs -seuls -intérêts -. -§ -afin -de -permettre -aux -travailleurs -du -secteur -privé -et -du -secteur -public -d -' -exercer -ce -droit -et -aux -apprentis -de -disposer -des -nouvelles -garanties -, -la -CGT -préconise -les -revendications -suivantes -: -< -S10 -= -1 -> -apprentissage -. -. -< -S10 -= -0 -> -§ -la -situation -des -jeunes -sous -contrat -d -' -* -apprentissage -doit -être -améliorée -par -$ -: -_ -l -' -augmentation -du -minimum -légal -des -rémunérations -des -apprentis -avec -maintien -du -versement -des -allocations -familiales -aux -parents -( -rémunération -égale -à -40 -% -du -SMIC -pendant -la -durée -du -premier -tiers -de -l -' -apprentissage -, -60 -% -durant -le -deuxième -tiers -, -80 -% -pendant -le -troisième -) -; -_ -l -' -application -, -sans -dérogation -, -de -l -' -horaire -annuel -de -360 -heures -dans -les -* -centres -de -formation -d -' -apprentis -( -horaire -porté -progressivement -à -400 -heures -) -; -_ -la -garantie -de -recevoir -dans -l -' -entreprise -une -formation -pratique -complète -et -préalablement -définie -; -_ -la -reconnaissance -du -plein -droit -syndical -. -§ -les -* -centres -de -formation -d -' -apprentis -doivent -être -placés -sous -la -tutelle -et -le -contrôle -directs -de -l -' -éducation -* -nationale -. -< -S10 -= -1 -> -formation -professionnelle -continue -. -. -< -S10 -= -0 -> -§ -cette -formation -est -un -droit -ouvert -à -tous -les -travailleurs -des -secteurs -privé -, -public -et -nationalisé -. -§ -pour -assurer -la -formation -continue -des -travailleurs -, -la -CGT -pose -les -revendications -suivantes -: -_ -des -mesures -sociales -doivent -être -prises -concernant -$ -: -_ -la -généralisation -et -la -simplification -du -maintien -de -la -rémunération -des -travailleurs -en -congé -formation -ou -des -demandeurs -d -' -emploi -allant -en -stage -, -_ -une -protection -sociale -complète -des -stagiaires -$ -: -_ -le -remboursement -intégral -des -frais -de -transport -et -d -' -hébergement -, -_ -la -prise -en -charge -intégrale -par -l -' -état -ou -l -' -entreprise -du -coût -des -stages -, -_ -les -dispositions -particulières -permettant -aux -travailleuses -d -' -accéder -sans -discrimination -à -la -formation -et -au -perfectionnement -professionnels -. -_ -des -opérations -de -mise -à -niveau -sont -nécessaires -pour -certaines -catégories -dont -l -' -accès -à -une -formation -et -à -une -qualification -est -freiné -par -l -' -insuffisance -du -niveau -de -formation -générale -. -ces -opérations -doivent -relever -essentiellement -de -l -' -* -éducation -nationale -et -faire -l -' -objet -d -' -un -financement -particulier -. -§ -ces -actions -de -mise -à -niveau -sont -particulièrement -nécessaires -$ -: -_ -pour -les -femmes -désirant -prendre -un -emploi -ou -reprendre -une -activité -professionnelle -après -une -interruption -pour -raisons -familiales -; -ces -sessions -de -rattrapage -doivent -être -rémunérées -; -_ -pour -les -travailleurs -immigrés -, -afin -de -permettre -le -développement -de -leur -formation -professionnelle -et -leur -promotion -sociale -$ -: -les -cours -d -' -alphabétisation -et -d -' -apprentissagedu -français -doivent -être -généralisés -, -sur -le -temps -de -travail -et -rémunérés -comme -tel -. -ces -actions -doivent -être -à -la -charge -de -l -' -* -état -, -des -employeurs -et -des -pays -d -' -origine -, -sous -la -responsabilité -de -l -' -éducation -* -nationale -, -indépendamment -des -lois -et -des -accords -relatifs -à -la -formation -professionnelle -continue -; -_ -pour -les -jeunes -sans -formation -professionnelle -$ -: -_ -pour -ceux -qui -sont -sous -contrat -de -travail -, -doit -être -rendue -effective -l -' -application -des -dispositions -législatives -prévoyant -200 -heures -de -formation -pendant -le -temps -de -travail -et -avec -le -maintien -intégral -du -salaire -( -ces -200 -heures -devant -être -considérées -comme -un -minimum -) -, -_ -pour -ceux -qui -sont -sans -travail -, -il -faut -développer -et -améliorer -les -actions -de -préformation -de -l -' -* -éducation -nationale -et -de -l -' -AFPA -, -et -revaloriser -les -indemnités -des -stagiaires -. -_ -un -développement -important -de -l -' -AFPA -doit -être -réalisé -pour -lui -permettre -de -répondre -sans -délai -aux -besoins -de -formation -des -demandeurs -d -' -emploi -et -de -participer -à -la -mise -en -oeuvre -du -congé -formation -, -y -compris -par -la -création -de -sections -mobiles -opérant -hors -des -centres -, -au -plus -près -des -travailleurs -. -l -' -accès -des -femmes -et -des -travailleurs -immigrés -dans -toutes -les -spécialités -doit -être -rendu -possible -par -des -mesures -d -' -adaptation -des -* -centres -de -l -' -AFPA -. -le -libre -exercice -du -droit -syndical -doit -être -reconnu -aux -stagiaires -de -l -' -AFPA -. -_ -les -établissements -de -l -' -* -éducation -nationale -doivent -être -systématiquement -ouverts -à -la -formation -continue -, -ce -qui -implique -des -moyens -nouveaux -et -des -structures -appropriées -( -dotation -supplémentaire -de -crédits -de -fonctionnement -et -d -' -équipement -, -création -de -postes -d -' -enseignantset -d -' -autres -personnels -) -. -_ -la -reconnaissance -des -diplômes -, -des -connaissances -acquises -et -des -niveaux -de -qualification -atteints -, -doit -être -assurée -en -s -' -appuyant -sur -l -' -inscription -désormais -prévue -dans -les -clauses -obligatoires -des -conventions -collectives -. -_ -dans -le -secteur -public -, -le -droit -des -personnels -à -la -formation -doit -s -' -exercer -sans -entrave -. -_ -pour -les -non -- -titulaires -de -l -' -* -état -, -exclus -jusque -- -là -de -la -formation -continue -, -le -droit -doit -être -immédiatement -ouvert -et -les -stages -doivent -avoir -, -parmi -leurs -objectifs -, -de -contribuer -à -la -titularisation -. -< -S10 -= -1 -> -financement -. -. -< -S10 -= -0 -> -§ -en -ce -qui -concerne -le -financement -, -la -CGT -réaffirme -sa -proposition -d -' -un -* -fonds -national -de -formation -et -de -perfectionnement -, -alimenté -parallèlement -par -des -versements -des -employeurs -et -des -crédits -d -' -* -état -. -§ -ce -* -fonds -serait -soumis -au -contrôle -syndical -et -son -institution -est -le -seul -moyen -d -' -éviter -les -gaspillages -. -§ -dans -le -système -actuel -, -le -taux -de -la -participation -patronale -à -la -formation -continue -doit -être -portée -à -2 -% -du -montant -des -salaires -en -1976 -, -comme -le -prévoit -la -loi -du -16 -juillet -1971 -, -que -le -gouvernement -doit -appliquer -. -§ -la -taxe -d -' -apprentissage -doit -revenir -au -taux -, -antérieur -à -1972 -, -de -0 -- -6 -% -des -salaires -. -< -S10 -= -1 -> -contrôle -des -organisations -syndicales -des -travailleurs -. -. -< -S10 -= -0 -> -§ -le -contrôle -syndical -doit -être -accru -sur -toutes -les -actions -de -formation -, -aussi -bien -en -ce -qui -concerne -la -formation -initiale -que -la -formation -continue -. -cela -implique -le -renforcement -$ -: -_ -des -prérogatives -des -représentants -des -travailleurs -dans -toutes -les -instances -traitant -de -la -formation -; -_ -des -prérogatives -des -* -comités -d -' -entreprise -ainsi -que -des -délégués -du -personnel -en -l -' -absence -de -* -comité -d -' -entreprise -; -_ -des -moyens -donnés -à -leurs -membres -et -à -ceux -de -la -* -commission -d -' -emploi -et -* -formation -professionnelle -, -( -crédit -suffisant -d -' -heures -rémunérées -) -. -< -S10 -= -1 -> -faire -appliquer -et -élargir -. -. -< -S10 -= -0 -> -§ -la -CGT -engage -ses -organisations -et -l -' -ensemble -des -travailleurs -$ -: -_ -à -exiger -partout -l -' -application -intégrale -des -dispositions -contractuelles -et -légales -, -ce -qui -doit -permettre -actuellement -de -faire -bénéficier -, -au -minimum -, -un -travailleur -sur -cinq -d -' -un -mois -de -formation -, -chaque -année -; -_ -à -réclamer -l -' -élargissement -de -ces -dispositions -, -notamment -des -clauses -de -l -' -accord -interprofessionnel -du -9 -juillet -1970 -qui -peuvent -être -améliorées -à -tous -les -niveaux -, -notamment -au -plan -des -conventions -collectives -; -_ -à -faire -accélérer -l -' -établissement -des -listes -de -stages -paritairement -agréés -sur -des -critères -précis -; -_ -à -poursuivre -l -' -action -à -tous -les -niveaux -, -et -particulièrement -à -celui -des -entreprises -, -pour -obtenir -les -conditions -et -les -moyens -nécessaires -au -plein -exercice -du -droit -au -congé -formation -. -< -S10 -= -1 -> -le -respect -de -la -vie -des -travailleurs -. -. -l -' -amélioration -des -conditions -de -travail -. -. -< -S10 -= -0 -> -§ -l -' -aggravation -des -conditions -de -travail -se -généralise -. -elle -atteint -, -sous -des -formes -et -à -des -degrés -divers -, -toutes -les -catégories -de -salariés -$ -: -ouvriers -, -employés -, -techniciens -, -ingénieurs -, -cadres -. -§ -l -' -emploi -des -techniques -nouvelles -au -lieu -d -' -alléger -la -peine -des -hommes -s -' -accompagne -d -' -une -accélération -des -cadences -, -d -' -une -tendance -accentuée -à -la -déqualification -du -travail -et -à -la -parcellisation -des -tâches -, -du -développement -du -travail -en -continu -, -de -l -' -inadaptation -des -locaux -de -travail -, -de -l -' -absence -ou -de -l -' -insuffisance -des -moyens -de -protection -de -la -santé -et -de -la -sécurité -. -il -en -découle -une -usure -intensive -des -forces -des -travailleurs -, -une -augmentation -importante -du -nombre -et -de -la -gravité -des -accidents -et -maladies -, -situation -qui -contribue -à -aggraver -l -' -insécurité -de -l -' -emploi -, -de -la -classification -et -des -ressources -. -§ -les -28 -millions -de -journées -de -travail -perdues -annuellement -pour -incapacités -temporaires -traduisent -les -conséquences -extrêmement -graves -des -conditions -actuelles -de -travail -sur -la -santé -et -l -' -intégrité -physique -des -travailleurs -. -§ -les -revendications -de -la -CGT -ont -été -présentées -dans -le -document -adopté -le -2 -février -1972 -par -la -* -commission -exécutive -et -précisées -en -vue -des -négociations -avec -le -CNPF -. -elles -tendent -à -réduire -la -pénibilité -du -travail -, -à -prémunir -les -travailleurs -contre -les -exigences -de -rendement -accru -, -à -s -' -opposer -à -la -déqualification -et -à -la -parcellisation -extrême -du -travail -, -à -obtenir -une -protection -efficace -de -la -santé -et -de -la -sécurité -des -travailleurs -, -à -ouvrir -des -possibilités -de -promotion -professionnelle -. -§ -leur -satisfaction -exige -notamment -$ -: -_ -l -' -affectation -d -' -un -pourcentage -minimum -des -investissements -annuels -à -l -' -étude -et -à -la -réalisation -de -l -' -amélioration -des -conditions -de -travail -; -_ -la -mise -à -la -disposition -des -travailleurs -, -de -leurs -représentants -élus -, -des -syndicats -, -des -moyens -d -' -information -, -de -contrôle -, -d -' -expression -et -d -' -intervention -sur -tous -les -sujets -concernant -les -conditions -de -travail -, -lesquels -doivent -obligatoirement -, -sur -demande -des -syndicats -, -faire -l -' -objet -de -négociations -aux -différents -niveaux -. -§ -outre -la -réduction -de -la -durée -du -travail -et -l -' -augmentationdes -effectifs -, -éléments -essentiels -de -l -' -amélioration -des -conditions -de -travail -, -la -révision -des -classifications -, -le -droit -à -la -formation -et -au -perfectionnement -professionnels -, -qui -trouvent -sur -ce -plan -une -justification -particulière -, -la -CGT -défend -les -revendications -suivantes -: -< -S10 -= -1 -> -§ -charge -de -travail -. -. -< -S10 -= -0 -> -la -charge -de -travail -physique -ou -intellectuelle -doit -être -ramenée -ou -contenue -dans -des -limites -n -' -entrainant -pas -une -fatigue -excessive -pour -le -travailleur -. -les -cadences -de -travail -notamment -doivent -être -limitées -ou -réduites -en -conséquence -. -ce -résultat -peut -être -obtenu -par -$ -: -_ -l -' -accroissement -des -effectifs -, -lesquels -doivent -tenir -compte -notamment -des -absences -probables -, -_ -la -limitation -du -nombre -de -pièces -à -produire -ou -d -' -opérations -à -réaliser -, -_ -la -réduction -du -nombre -de -machines -ou -d -' -appareils -à -conduire -ou -à -surveiller -, -_ -la -réduction -de -la -vitesse -de -la -chaîne -, -_ -l -' -affichage -dans -les -ateliers -ou -services -des -temps -alloués -, -de -la -vitesse -de -la -chaîne -, -des -effectifs -occupés -, -de -la -définition -des -opérations -à -effectuer -sur -chaque -poste -de -travail -ou -du -nombre -de -machines -ou -d -' -appareils -à -conduire -ou -à -surveiller -doit -être -rendu -obligatoire -; -_ -toute -modification -ayant -pour -effet -d -' -accroître -la -charge -de -travail -individuelle -doit -être -interdite -; -_ -les -délégués -syndicaux -, -du -personnel -et -du -CE -, -les -travailleurs -concernés -, -doivent -être -informés -au -préalable -et -consultés -sur -toutes -modifications -du -processus -de -travail -. -< -S10 -= -1 -> -§ -organisation -du -temps -de -travail -. -. -< -S10 -= -0 -> -_ -temps -de -repos -payés -en -cours -de -journée -, -avec -arrêt -effectif -, -le -cas -échéant -, -de -la -machine -ou -des -appareils -ou -de -la -chaîne -; -_ -mise -en -place -, -pour -les -travaux -sur -chaîne -, -de -remplaçants -en -nombre -suffisant -pour -permettre -des -arrêts -individuels -; -_ -temps -de -repos -supplémentaires -pour -les -femmes -enceintes -et -allongement -à -18 -semaines -du -congé -légal -de -maternité -; -_ -installation -de -salles -de -repos -à -proximité -des -lieux -de -travail -; -_ -pour -les -travailleurs -en -équipes -$ -: -allongement -du -temps -de -pause -payé -et -paiement -, -comme -temps -de -travail -, -du -temps -total -de -présence -dans -l -' -entreprise -; -_ -limitation -du -travail -en -continu -et -en -semi -- -continu -aux -seuls -postes -de -travail -où -existent -réellement -des -impératifs -techniques -; -_ -compensation -pour -les -travailleurs -postés -en -continu -ou -semi -- -continu -, -des -conséquences -de -cette -forme -de -travail -par -$ -: -l -' -abaissement -de -la -durée -du -travail -en -dessous -de -40 -heures -par -$ -: -l -' -introduction -d -' -une -cinquième -équipe -( -continu -) -ou -d -' -unequatrième -équipe -( -semi -- -continu -) -, -l -' -avancement -de -l -' -âge -de -la -retraite -, -l -' -allongement -des -congés -payés -; -_ -organisation -des -systèmes -de -rotation -des -postes -par -discussion -entre -la -direction -et -les -organisations -syndicales -et -avec -l -' -accord -des -intéressés -; -_ -pour -les -travaux -particulièrement -éprouvants -ou -comportant -des -risques -pour -la -santé -, -changement -de -poste -en -cours -de -journée -, -avec -maintien -du -salaire -et -renforcement -de -la -surveillance -médicale -; -_ -préalablement -à -toute -application -des -horaires -variables -ou -du -travail -à -temps -partiel -, -établissement -de -garanties -portant -notamment -sur -les -avantages -acquis -et -l -' -exercice -des -droits -syndicaux -, -ces -garanties -devant -faire -l -' -objet -de -négociations -avec -les -organisations -syndicales -. -< -S10 -= -1 -> -formation -et -promotion -professionnelles -. -. -< -S10 -= -0 -> -§ -la -lutte -contre -les -effets -du -caractère -épuisant -et -asservissant -du -travail -comporte -l -' -exigence -du -droit -à -la -formation -et -à -la -promotion -pour -tout -travailleur -, -du -manoeuvre -à -l -' -ingénieur -, -selon -les -aptitudes -et -capacités -de -chacun -. -§ -ce -qui -implique -$ -: -_ -la -modification -de -l -' -organisation -du -travail -de -façon -à -en -diminuer -la -pénibilité -, -à -en -réduire -la -parcellisation -et -à -en -augmenter -l -' -intérêt -et -le -degré -de -qualification -; -_ -la -possibilité -pour -tous -les -ouvriers -spécialisés -qui -en -feront -la -demande -de -changer -de -poste -de -travail -, -après -un -an -d -' -ancienneté -, -afin -d -' -étendre -leur -expérience -ou -d -' -acquérir -une -polyvalence -donnant -accès -à -une -qualification -supérieure -; -_ -des -dispositions -particulières -pour -favoriser -l -' -accès -à -une -formation -de -base -des -travailleurs -et -travailleuses -n -' -en -ayant -pas -reçue -; -_ -la -garantie -pour -tous -les -travailleurs -de -pouvoir -franchir -, -au -bénéfice -de -l -' -expérience -et -de -l -' -enrichissement -de -leurs -connaissances -, -les -échelons -dans -la -hiérarchie -des -classifications -et -des -salaires -, -leur -assurant -ainsi -une -carrière -normale -. -< -S10 -= -1 -> -rôle -de -l -' -encadrement -. -. -< -S10 -= -0 -> -§ -il -importe -qu -' -en -matière -de -conditions -de -travail -, -les -ingénieurs -, -cadres -, -techniciens -et -agents -de -maîtrise -aient -toutes -possibilités -de -donner -leur -avis -sur -le -plan -professionnel -, -même -lorsqu -' -il -est -en -opposition -avec -l -' -orientation -officielle -de -l -' -entreprise -, -ce -qui -suppose -$ -: -d -' -une -part -, -les -modalités -d -' -application -des -garanties -collectives -, -les -protégeant -contre -les -pressions -de -leurs -employeurs -, -d -' -autre -part -, -les -garanties -liées -à -leurs -responsabilités -sur -les -conditions -de -travail -des -autres -salariés -et -d -' -en -fixer -les -limites -. -< -S10 -= -1 -> -sécurité -des -personnes -. -. -< -S10 -= -0 -> -§ -sécurité -des -travailleurs -assurant -les -paiements -, -encaissements -et -transports -de -fonds -. -§ -toutes -dispositions -matérielles -doivent -être -prises -pour -prémunir -les -travailleurs -concernés -contre -les -risques -d -' -agressions -. -§ -les -effectifs -de -personnel -, -en -particulier -, -doivent -être -en -nombre -suffisant -. -< -S10 -= -1 -> -l -' -hygiène -et -la -sécurité -du -travail -. -. -< -S10 -= -0 -> -§ -liée -étroitement -aux -problèmes -posés -par -les -conditions -de -travail -, -l -' -amélioration -des -conditions -d -' -hygiène -et -de -sécurité -implique -en -tout -premier -lieu -que -la -réglementation -existante -soit -strictement -appliquée -sur -tous -les -lieux -de -travail -, -qu -' -elle -soit -adaptée -aux -conditions -et -exigences -actuelles -et -qu -' -elle -évolue -constamment -en -fonction -des -conditions -et -exigences -nouvelles -. -§ -les -dispositions -et -l -' -action -, -en -matière -d -' -hygiène -et -sécurité -, -doivent -avoir -avant -tout -un -caractère -préventif -, -ce -qui -suppose -notamment -que -la -sécurité -soit -intégrée -dès -le -stade -de -l -' -élaboration -des -projets -de -construction -, -de -la -mise -au -point -des -méthodes -de -travail -, -de -la -conception -et -des -études -de -machines -, -locaux -, -produits -et -processus -de -fabrication -. -§ -les -organisations -syndicales -, -les -comités -d -' -entreprises -, -les -délégués -du -personnel -ont -pleine -compétence -pour -l -' -ensemble -de -ces -problèmes -touchant -aux -conditions -de -travail -. -les -* -comités -d -' -hygiène -et -de -sécurité -ont -un -rôle -particulièrement -important -. -< -S10 -= -1 -> -comité -hygiène -et -sécurité -. -. -< -S10 -= -0 -> -§ -à -cet -égard -, -leur -efficacité -doit -être -renforcée -par -les -dispositions -suivantes -: -§ -_ -institution -de -* -comités -d -' -hygiène -et -de -sécurité -dans -toutes -les -entreprises -et -établissements -industriels -et -commerciaux -du -secteur -privé -, -comme -des -secteurs -public -et -nationalisé -. -leurs -membres -doivent -disposer -de -pouvoirs -réels -, -notamment -celui -d -' -obtenir -l -' -interruption -du -travail -dans -tous -les -cas -où -celui -- -ci -présente -un -caractère -dangereux -et -de -saisir -les -juridictions -compétentes -. -§ -la -liberté -de -circulation -doit -leur -être -garantie -dans -tous -les -lieux -de -travail -. -ils -doivent -disposer -du -temps -nécessaire -pour -l -' -accomplissement -de -leur -mission -et -en -toute -hypothèse -d -' -un -minimum -au -moins -égal -au -crédit -d -' -heures -des -délégués -du -personnel -. -§ -_ -les -membres -des -* -comités -d -' -hygiène -et -de -sécurité -doivent -être -élus -par -l -' -ensemble -des -salariés -concernés -. -ils -doivent -bénéficier -d -' -une -protection -identique -à -celle -des -délégués -du -personnel -dans -toutes -les -entreprises -. -le -secrétaire -du -* -comité -d -' -hygiène -et -de -sécurité -doit -être -un -représentant -des -travailleurs -désigné -par -les -membres -élus -du -* -comité -d -' -hygiène -et -de -sécurité -. -§ -_ -le -* -comité -d -' -hygiène -et -de -sécurité -a -compétence -pour -l -' -ensemble -du -personnel -travaillant -dans -l -' -entreprise -qui -comprend -également -le -personnel -intérimaire -et -intermittent -. -§ -la -responsabilité -juridique -en -matière -d -' -accidents -du -travail -ou -de -maladies -professionnelles -incombe -exclusivement -à -l -' -employeur -. -elle -ne -peut -en -aucun -cas -être -imputée -au -personnel -d -' -encadrement -. -§ -outre -les -conditions -qui -leur -sont -faites -, -les -ingénieurs -, -cadres -, -techniciens -et -agents -de -maîtrise -jouent -un -rôle -important -dans -le -développement -de -la -sécurité -au -sein -de -l -' -entreprise -. -ils -doivent -pouvoir -travailler -en -liaison -avec -le -médecin -du -travail -et -l -' -ingénieur -de -sécurité -et -avoir -connaissance -de -toutes -les -remarques -des -CHS -, -ainsi -que -des -autres -représentants -des -salariés -et -des -organisations -syndicales -. -§ -toutes -dispositions -, -telles -que -le -contrôle -médical -organisé -à -l -' -initiative -des -employeurs -, -tendant -à -exercer -une -pression -sur -les -salariés -malades -ou -accidentés -, -en -vue -de -leur -imposer -une -reprise -prématurée -du -travail -, -sont -vigoureusement -combattues -par -la -CGT -et -doivent -être -interdites -. -§ -les -consignes -de -sécurité -doivent -être -adaptées -et -traduites -dans -leur -langue -maternelle -pour -les -travailleurs -immigrés -. -§ -des -stages -d -' -information -sur -les -questions -relatives -à -la -sécurité -doivent -être -organisés -pour -les -travailleurs -nouvellement -embauchés -, -le -temps -passé -à -ces -stages -étant -considéré -comme -temps -de -travail -et -payé -comme -tel -, -sans -imputation -sur -le -temps -du -congé -formation -professionnelle -ni -sur -les -fonds -dévolus -à -celle -- -ci -. -§ -la -compétence -du -* -comité -d -' -hygiène -et -sécurité -doit -s -' -étendre -sans -restriction -aux -problèmes -de -la -pollution -$ -: -toutes -dispositions -seront -prises -pour -qu -' -il -puisse -veiller -au -respect -des -normes -nationales -ou -internationales -concernant -le -bruit -et -la -teneur -en -produits -nocifs -non -seulement -de -l -' -atmosphère -des -ateliers -mais -aussi -des -gaz -, -liquides -et -solides -rejetés -par -l -' -entreprise -. -§ -dans -ce -domaine -, -la -CGT -dénonce -vigoureusement -le -chantage -exercé -sous -la -forme -des -faux -dilemnes -$ -: -usine -insalubre -( -ou -polluante -) -ou -fermeture -( -ou -non -installation -) -. -< -S10 -= -1 -> -médecine -du -travail -. -. -< -S10 -= -0 -> -§ -la -médecine -du -travail -est -un -élément -important -du -système -de -protection -de -l -' -homme -sur -le -lieu -de -travail -. -§ -il -convient -d -' -établir -avec -l -' -ensemble -des -parties -intéressées -un -statut -du -médecin -du -travail -. -§ -ce -statut -devra -notamment -fixer -les -conditions -de -rémunération -et -définir -une -protection -qui -assurent -au -médecin -du -travail -une -indépendance -totale -à -l -' -égard -de -l -' -employeur -. -_ -détermination -du -nombre -des -vacations -du -médecin -du -travail -de -telle -sorte -que -le -tiers -de -son -temps -lui -permette -réellement -de -remplir -les -tâches -qui -sont -les -siennes -en -matière -de -prévention -de -la -pathologie -du -travail -, -connaissance -des -conditions -concrètes -de -réalisation -du -travail -, -recherche -des -moyens -d -' -améliorer -l -' -hygiène -et -la -sécurité -. -_ -modification -du -décret -du -13 -juin -1969 -, -notamment -en -ce -qui -concerne -la -gestion -des -services -médicaux -interentreprises -. -les -représentants -élus -des -établissements -concernés -, -ainsi -que -ceux -des -organisations -syndicales -représentatives -doivent -participer -de -plein -droit -à -la -gestion -des -centres -médicaux -interentreprises -, -ce -qui -implique -$ -: -_ -que -leur -représentation -au -sein -du -* -conseil -d -' -administration -soit -assurée -dans -des -conditions -leur -permettant -une -intervention -effective -dans -les -décisions -et -sur -l -' -activité -des -centres -; -_ -qu -' -ils -disposent -du -temps -, -des -possibilités -de -déplacement -et -des -moyens -d -' -information -nécessaires -à -l -' -accomplissement -de -leur -mandat -, -l -' -indemnisation -du -temps -passé -étant -assumée -par -les -employeurs -. -§ -le -médecin -du -travail -sera -obligatoirement -consulté -pour -toutes -les -questions -relevant -des -conditions -de -travail -, -de -la -prévention -, -de -l -' -hygiène -et -de -la -sécurité -du -travail -. -< -S10 -= -1 -> -les -comités -techniques -régionaux -et -nationaux -. -. -< -S10 -= -0 -> -§ -de -par -leurs -attributions -, -les -* -comités -techniques -régionaux -et -nationaux -peuvent -prendre -des -mesures -comblant -le -retard -de -la -réglementation -sur -le -développement -des -sciences -et -des -techniques -influençant -les -conditions -de -travail -, -de -prévention -, -d -' -hygiène -et -de -sécurité -. -§ -les -conditions -actuelles -de -composition -et -de -fonctionnement -des -* -comités -techniques -régionaux -ne -leur -permettent -pas -de -jouer -correctement -et -pleinement -leur -rôle -. -il -est -nécessaire -d -' -imposer -$ -: -_ -l -' -augmentation -du -nombre -de -* -comités -techniques -régionaux -et -le -regroupement -des -activités -professionnelles -tout -en -assurant -aux -représentants -salariés -le -temps -et -les -moyens -d -' -assurer -leur -mandat -. -< -S10 -= -1 -> -dispositions -législatives -. -. -< -S10 -= -0 -> -§ -la -CGT -demande -que -tous -les -produits -présentant -un -danger -de -quelque -nature -que -ce -soit -avant -d -' -être -utilisés -dans -l -' -industrie -, -soient -subordonnés -à -un -visa -délivré -par -un -organisme -national -compétent -dont -il -convient -de -débattre -avec -les -* -pouvoirs -publics -. -le -même -organisme -devrait -être -chargé -de -déterminer -des -normes -nationales -fixant -la -teneur -maximale -tolérable -de -l -' -atmosphère -des -lieux -de -travail -en -substances -nuisibles -, -ainsi -que -les -limites -du -bruit -et -de -la -radioactivité -. -§ -ces -dispositions -s -' -appliquent -aux -produits -actuellement -en -usage -qui -entraînent -des -conséquences -nuisibles -pour -la -santé -. -_ -création -d -' -une -sous -- -commission -au -sein -de -la -* -commission -d -' -hygiène -industrielle -chargée -d -' -établir -, -de -tenir -à -jour -et -de -communiquer -les -listes -de -substances -et -agents -cancérigènes -à -interdire -dans -la -production -, -à -contrôler -ou -à -soumettre -à -autorisation -avant -utilisation -. -_ -établir -pour -chaque -travailleur -exposé -à -des -substances -et -agents -cancérigènes -ou -autres -substances -nocives -, -un -livret -médical -mentionnant -les -produits -dangereux -avec -lesquels -il -est -en -contact -durant -sa -carrière -. -_ -la -CGT -demande -, -en -outre -, -le -renforcement -du -corps -de -l -' -* -inspection -du -travail -et -de -l -' -* -inspection -médicale -qui -devraient -être -dotés -de -pouvoirs -accrus -en -matière -de -contrôle -et -de -sanction -à -l -' -encontre -des -employeurs -violant -les -règles -de -sécurité -. -< -S10 -= -1 -> -les -droits -et -libertés -des -travailleurs -. -. -les -droits -. -. -< -S10 -= -0 -> -§ -l -' -action -de -classe -a -libéré -le -travailleur -d -' -un -certain -nombre -de -contraintes -imposées -par -le -patronat -dans -l -' -entreprise -capitaliste -, -et -lui -a -permis -de -conquérir -certains -droits -. -§ -sans -perdre -de -vue -que -ces -contraintes -ont -leur -origine -dans -l -' -exploitation -capitaliste -et -que -seule -la -suppression -de -celle -- -ci -permettra -leur -disparition -complète -, -sans -perdre -de -vue -également -que -des -prétendus -nouveaux -" -droits -" -suggérés -ou -offerts -( -telle -" -la -participation -" -sous -ses -diverses -formes -) -, -visent -en -fait -à -l -' -intégration -du -travailleur -dans -le -système -et -constituent -par -là -même -une -duperie -, -il -est -possible -et -nécessaire -d -' -élargir -les -droits -existants -. -§ -la -CGT -entend -promouvoir -aussi -bien -les -droits -des -travailleurs -pris -individuellement -que -les -droits -de -la -collectivité -des -travailleurs -, -représentés -par -le -syndicat -et -les -diverses -institutions -existantes -ou -à -créer -, -y -compris -dans -les -petites -entreprises -. -§ -dans -cet -esprit -, -elle -oeuvre -pour -une -législation -interdisant -aux -employeurs -de -demander -au -personnel -d -' -encadrementd -' -exercer -sur -les -travailleurs -des -pressions -directes -ou -indirectes -non -relatives -à -l -' -accomplissement -de -l -' -activité -professionnelle -. -< -S10 -= -1 -> -§ -la -CGT -réclame -concernant -. -. -information -. -. -< -S10 -= -0 -> -_ -droit -pour -le -travailleur -d -' -être -préalablement -informé -, -avant -toute -décision -, -de -toute -mesure -le -concernant -( -qu -' -il -s -' -agisse -de -la -détermination -de -ses -conditions -de -travail -, -de -modification -à -son -contrat -de -travail -, -de -sanctions -, -y -compris -le -licenciement -$ -. -. -. -) -; -_ -droit -de -débattre -( -assisté -s -' -il -le -désire -d -' -un -délégué -syndical -ou -d -' -un -délégué -du -personnel -) -avec -la -direction -des -intentions -de -cette -dernière -à -son -égard -; -_ -toute -mesure -prise -en -violation -de -ces -droits -, -comme -toute -disposition -dont -les -motivations -seraient -reconnues -inexactes -, -doivent -entraîner -leur -annulation -. -< -S10 -= -1 -> -promotion -. -. -< -S10 -= -0 -> -_ -droit -effectif -à -la -promotion -par -la -priorité -absolue -donnée -aux -travailleurs -de -l -' -entreprise -en -cas -de -poste -d -' -une -qualification -à -pourvoir -. -< -S10 -= -1 -> -rémunérations -. -. -< -S10 -= -0 -> -_ -droit -pour -chacun -à -la -connaissance -des -salaires -de -tous -les -membres -du -personnel -de -l -' -entreprise -. -< -S10 -= -1 -> -règlement -intérieur -. -. -< -S10 -= -0 -> -_ -suppression -du -règlement -intérieur -dans -sa -conception -actuelle -qui -permet -à -l -' -employeur -d -' -édicter -souverainement -des -sanctions -et -de -se -rendre -ainsi -justice -à -lui -- -même -par -la -voie -de -décisions -unilatérales -. -< -S10 -= -1 -> -information -économique -, -consultation -, -contrôle -. -. -< -S10 -= -0 -> -_ -droit -à -l -' -information -à -la -consultation -et -au -contrôle -sur -tout -ce -qui -concerne -l -' -activité -de -l -' -entreprise -, -en -priorité -absolue -par -le -canal -des -représentants -du -personnel -. -cette -pratique -permettant -d -' -analyser -l -' -information -et -de -combattre -, -le -cas -échéant -, -tout -caractère -de -mise -en -condition -. -_ -mise -en -place -des -* -comités -d -' -entreprise -de -tous -les -éléments -d -' -informations -économiques -, -en -particulier -$ -: -_ -tous -les -documents -permettant -une -connaissance -approfondie -et -véridique -des -éléments -comptables -de -la -gestion -passée -et -d -' -avenir -au -niveau -de -l -' -entreprise -, -du -groupe -, -de -la -branche -d -' -industrie -sur -le -plan -national -et -international -. -ces -documents -doivent -être -fournis -dans -toutes -les -sociétés -quelle -qu -' -en -soit -leur -forme -juridique -. -_ -toutes -les -informations -relatives -au -travail -et -la -gestion -du -personnel -. -_ -suppression -de -toute -obligation -de -discrétion -dans -l -' -information -économique -. -_ -droit -à -l -' -assistance -d -' -un -expert -- -comptable -dans -toutes -les -sociétés -et -pouvant -être -choisi -en -tout -lieu -. -_ -dotation -des -* -comités -d -' -entreprise -en -moyens -matériels -et -financiers -leur -permettant -l -' -étude -des -questions -économiques -. -_ -mise -en -place -de -* -comités -centraux -de -groupes -. -< -S10 -= -1 -> -information -syndicale -. -. -< -S10 -= -0 -> -_ -droit -à -un -temps -suffisant -selon -les -besoins -constatés -dans -chaque -entreprise -_ -et -en -aucun -cas -, -inférieur -à -une -heure -par -mois -_ -pris -sur -le -temps -de -travail -et -payé -comme -tel -, -pour -participer -à -des -réunions -organisées -par -les -syndicats -, -dans -des -locaux -mis -à -leur -disposition -par -l -' -entreprise -. -< -S10 -= -1 -> -représentation -. -. -< -S10 -= -0 -> -_ -dans -les -grandes -entreprises -et -dans -celles -où -la -nature -du -travail -aboutit -à -la -dispersion -des -salariés -ou -à -leur -rotation -en -équipes -successives -, -augmentation -du -nombre -des -délégués -du -personnel -, -des -membres -du -* -comité -d -' -entreprise -et -du -nombre -des -délégués -au -CHS -. -§ -la -CGT -combat -les -tentatives -répétées -du -patronat -et -du -pouvoir -, -de -mettre -en -place -des -organisations -de -collaboration -de -classe -n -' -ayant -de -syndicales -que -le -nom -telle -par -exemple -la -CFT -. -§ -elle -rappelle -que -l -' -une -des -garanties -essentielles -de -la -liberté -syndicale -réside -dans -le -droit -pour -les -seules -organisations -syndicales -représentatives -de -présenter -des -candidatures -au -premier -tour -des -élections -professionnelles -. -afin -de -renforcer -ce -droit -et -pour -déjouer -les -manoeuvres -patronales -la -CGT -réclame -$ -: -_ -un -contrôle -plus -strict -et -une -aggravation -des -pénalités -encourues -par -les -employeurs -portant -atteinte -à -la -liberté -de -vote -; -_ -l -' -abrogation -des -dispositions -légales -, -telles -celles -relatives -aux -* -comités -centraux -d -' -entreprises -, -qui -déforment -la -représentation -proportionnelle -à -l -' -entreprise -; -_ -que -seules -les -organisations -syndicales -représentatives -soient -habilitées -à -présenter -des -candidatures -y -compris -au -deuxième -tour -des -élections -quand -celui -- -ci -s -' -avère -nécessaire -; -_ -que -les -candidats -soient -élus -dans -l -' -ordre -de -présentation -de -la -liste -. -§ -la -CGT -demande -également -que -la -représentation -des -organisations -syndicales -dans -les -organismes -paritaires -, -tripartites -ou -de -caractère -officiel -, -soit -établie -proportionnellement -à -l -' -influence -réelle -de -chacune -d -' -elle -, -et -soit -réservée -aux -seules -organisations -représentatives -à -l -' -exclusion -de -toute -autre -; -qu -' -en -conséquence -il -soit -procédé -à -l -' -éviction -des -organisations -telles -que -la -CFT -. -< -S10 -= -1 -> -les -libertés -. -. -libertés -syndicales -. -. -< -S10 -= -0 -> -§ -amélioration -et -extension -des -dispositions -de -la -loi -du -27 -décembre -1968 -, -soit -$ -: -_ -reconnaissance -de -l -' -organisation -syndicale -et -des -conséquences -légales -de -cette -reconnaissance -dans -tous -les -établissements -et -entreprises -quel -que -soit -l -' -effectif -du -personnel -; -_ -reconnaissance -de -la -représentation -spécifique -de -toutes -les -organisations -représentatives -d -' -ingénieurs -, -cadres -et -techniciens -; -_ -révision -des -textes -législatifs -ou -réglementaires -restreignant -le -rôle -des -organisations -syndicales -de -salariés -; -_ -libre -accès -et -liberté -de -circulation -en -tout -lieu -de -l -' -entreprise -et -à -tout -moment -, -aux -délégués -élus -, -aux -délégués -et -représentants -syndicaux -; -_ -possibilité -pour -les -délégués -représentants -locaux -régionaux -ou -nationaux -des -organisations -syndicales -représentatives -d -' -avoir -accès -dans -les -entreprises -pour -y -rencontrer -les -travailleurs -, -y -compris -là -où -n -' -existe -pas -d -' -organisation -syndicale -; -_ -collecte -des -cotisations -et -diffusion -des -publications -syndicales -sur -les -lieux -et -pendant -les -heures -de -travail -. -§ -mise -à -la -disposition -des -organisations -syndicales -d -' -un -contingent -d -' -heures -nécessaires -à -leur -fonctionnement -attribué -proportionnellement -à -leur -influence -telle -qu -' -elle -ressort -des -élections -professionnelles -. -< -S10 -= -1 -> -protection -. -. -< -S10 -= -0 -> -§ -interdiction -et -nullité -du -licenciement -et -de -toutes -les -formes -de -répression -patronale -visant -les -élus -et -représentants -du -personnel -, -les -salariés -exerçant -un -mandat -ou -une -fonction -confiés -par -l -' -organisation -syndicale -ou -exercé -en -son -nom -, -et -, -tout -salarié -en -raison -de -ses -opinions -, -croyances -ou -appartenance -à -une -organisation -syndicale -ou -à -un -parti -ou -prononcé -en -violation -des -droits -et -libertés -syndicales -. -< -S10 -= -1 -> -mandat -syndical -. -. -< -S10 -= -0 -> -§ -droit -inconditionnel -pour -tout -salarié -à -l -' -exercice -d -' -un -mandat -électif -et -de -délégué -syndical -, -cela -exige -que -la -charge -de -travail -de -l -' -intéressé -soit -diminuée -dans -la -même -proportion -que -le -temps -qu -' -il -doit -consacrer -à -son -travail -ou -qu -' -il -soit -remplacé -pendant -l -' -exercice -de -ses -fonctions -. -cela -exige -également -que -les -dispositions -soient -prises -pour -que -l -' -élu -des -travailleurs -puisse -continuer -à -exercer -son -activité -professionnelle -. -§ -éligibilité -pour -les -travailleurs -immigrés -dans -les -mêmes -conditions -que -celles -s -' -appliquant -aux -travailleurs -français -, -et -levée -de -toutes -restrictions -concernant -leur -accès -aux -responsabilités -de -représentation -, -de -direction -et -d -' -administration -des -organisations -syndicales -. -< -S10 -= -1 -> -grève -. -. -< -S10 -= -0 -> -§ -abrogation -de -toutes -les -restrictions -à -l -' -exercice -du -droit -de -grève -, -y -compris -celle -résultant -de -l -' -utilisation -abusive -de -la -notion -de -" -liberté -du -travail -" -. -§ -interdiction -de -toute -retenue -sur -le -salaire -ou -les -primes -excédant -le -prorata -de -la -durée -de -la -grève -. -§ -interdiction -du -lock -- -out -, -qu -' -il -soit -ou -non -camouflé -sous -l -' -appellation -de -chômage -technique -. -< -S10 -= -1 -> -libertés -et -informatique -. -. -< -S10 -= -0 -> -§ -en -cas -d -' -établissement -de -fichiers -de -renseignements -, -notamment -informatisés -par -des -services -administratifs -publics -ou -privés -, -qu -' -il -soit -interdit -de -recueillir -et -de -mémoriser -des -informations -sans -rapport -direct -avec -l -' -objet -spécifique -du -fichier -, -et -en -particulier -des -données -ou -appréciations -susceptibles -de -nuire -au -travailleur -dans -sa -vie -professionnelle -ou -de -porter -entrave -à -l -' -exercice -des -libertés -individuelles -ou -collectives -dont -il -est -en -droit -de -se -réclamer -. -§ -institution -de -système -de -contrôle -permettant -de -veiller -à -la -stricte -application -et -au -respect -du -principe -énoncé -ci -- -dessus -. -< -S10 -= -1 -> -l -' -éducation -syndicale -. -. -< -S10 -= -0 -> -§ -étant -donné -le -rôle -et -les -responsabilités -des -syndicats -dans -la -société -moderne -, -l -' -éducation -syndicale -est -un -élément -de -l -' -éducation -dans -son -ensemble -. -§ -son -développement -pose -de -nombreux -problèmes -au -premier -rang -desquels -le -financement -de -ces -activités -et -l -' -amélioration -du -congé -éducation -. -§ -s -' -agissant -du -financement -, -la -CGT -estime -qu -' -en -premier -lieu -le -patronat -doit -prendre -en -charge -le -paiement -de -la -perte -de -salaire -qu -' -entraîne -l -' -utilisation -des -congés -éducation -. -les -comités -d -' -entreprise -versant -, -quant -à -eux -, -des -bourses -d -' -études -aux -bénéficiaires -des -congés -éducation -, -bourses -d -' -un -montant -suffisant -pour -couvrir -les -frais -de -séjour -et -les -voyages -des -intéressés -. -plus -globalement -enfin -, -la -subvention -annuelle -du -* -ministère -du -travail -doit -connaître -une -augmentation -notable -pour -tenir -compte -de -l -' -augmentation -des -charges -, -du -développement -important -de -l -' -ensemble -des -réalisations -éducatives -de -la -CGT -, -ainsi -que -de -sa -représentativité -réelle -. -§ -s -' -agissant -du -congé -éducation -, -des -modifications -réglementaires -doivent -intervenir -pour -le -fractionnement -de -ce -congé -, -pour -l -' -augmentation -du -nombre -des -bénéficiaires -, -notamment -dans -les -grandes -entreprises -, -et -, -enfin -, -pour -l -' -octroi -aux -centrales -syndicales -les -plus -représentatives -et -proportionnellement -à -leur -représentativité -, -d -' -un -contingent -annuel -de -congés -éducation -de -longue -durée -pour -répondre -aux -besoins -des -éducateurs -et -à -la -nécessité -de -renforcer -les -stages -de -niveau -supérieur -. -< -S10 -= -1 -> -la -législation -du -travail -. -. -< -S10 -= -0 -> -§ -l -' -application -et -le -respect -des -droits -des -travailleurs -à -l -' -entreprise -nécessitent -que -les -instances -responsables -de -la -législation -sociale -disposent -de -moyens -de -contrôle -et -de -réparation -suffisants -et -adaptés -. -§ -en -effet -, -les -violations -des -droits -des -travailleurs -prennent -un -aspect -intolérable -, -du -fait -même -de -leur -fréquence -et -de -leur -gravité -, -et -appellent -un -certain -nombre -de -réformes -qui -, -au -jugement -de -la -CGT -, -devraient -comporter -les -points -suivants -: -< -S10 -= -1 -> -§ -inspection -du -travail -. -. -< -S10 -= -0 -> -_ -augmentation -sensible -du -nombre -des -inspecteurs -et -contrôleurs -du -travail -qui -devrait -être -doublé -. -_ -accroissement -de -leurs -pouvoirs -d -' -intervention -, -de -contrôle -et -de -sanction -à -l -' -encontre -des -employeurs -, -notamment -par -la -possibilité -d -' -intervenir -devant -toutes -les -instances -compétentes -, -le -droit -de -faire -arrêter -les -machines -en -cas -de -danger -flagrant -et -le -droit -de -convoquer -tout -témoin -. -_ -extension -de -leur -compétence -à -toutes -les -professions -et -à -tous -les -secteurs -d -' -activité -. -_ -institution -de -délégués -salariés -à -l -' -inspection -du -travail -, -élus -par -les -travailleurs -et -dotés -des -attributions -et -des -pouvoirs -nécessaires -à -l -' -accomplissement -de -leur -tâche -de -contrôle -dans -les -entreprises -, -de -répression -et -de -sanction -des -violations -de -la -loi -. -< -S10 -= -1 -> -§ -juridiction -prudhomale -. -. -< -S10 -= -0 -> -_ -création -obligatoire -de -* -conseils -de -prudhommes -dans -tous -les -centres -importants -et -couvrant -tout -le -territoire -national -. -_ -extension -sans -exception -de -la -juridiction -prudhomale -à -tous -les -travailleurs -ne -relevant -pas -de -la -fonction -publique -. -_ -accès -à -l -' -électorat -et -à -l -' -éligibilité -de -tous -les -travailleurs -sans -distinction -de -nationalité -. -_ -élection -des -conseillers -prudhommes -un -jour -ouvrable -, -pendant -le -temps -de -travail -, -au -scrutin -proportionnel -sur -des -listes -présentées -par -les -organisations -syndicales -les -plus -représentatives -. -_ -suppression -des -sections -et -catégories -en -tant -que -telles -, -et -liberté -d -' -organisation -interne -des -conseils -en -sections -professionnelles -ou -chambres -selon -leurs -besoins -particuliers -. -_ -gratuité -, -accélération -et -simplification -de -la -procédure -prudhomale -. -_ -prise -en -charge -par -l -' -* -état -, -au -titre -du -* -ministère -de -la -justice -, -de -la -création -et -du -fonctionnement -des -* -conseils -de -prudhommes -et -de -l -' -attribution -d -' -une -subvention -spéciale -aux -organisations -syndicales -pour -la -formation -de -leurs -conseillers -prudhommes -. -_ -élargissement -de -la -compétence -des -* -conseils -de -prudhommes -aux -conflits -collectifs -d -' -ordre -juridique -; -institution -d -' -un -véritable -référé -prudhomal -. -_ -établissement -d -' -un -statut -de -conseiller -prudhomme -garantissant -le -libre -exercice -de -son -activité -et -sa -couverture -contre -tout -préjudice -, -de -quelque -ordre -qu -' -il -puisse -être -. -< -S10 -= -1 -> -code -du -travail -. -. -< -S10 -= -0 -> -§ -une -réforme -profonde -de -la -législation -sociale -s -' -impose -pour -la -débarrasser -des -conceptions -antisociales -héritées -du -* -code -Napoléon -. -un -* -code -du -travail -moderne -doit -élargir -et -garantir -efficacement -les -droits -des -travailleurs -dans -les -conditions -actuelles -de -l -' -exploitationcapitaliste -. -< -S10 -= -1 -> -les -conventions -collectives -. -. -< -S10 -= -0 -> -§ -la -garantie -des -droits -collectifs -et -des -revendications -, -imposée -par -l -' -action -syndicale -, -nécessite -des -* -conventions -collectives -efficaces -. -§ -trop -souvent -, -ces -conventions -sont -vidées -de -leur -contenu -, -notamment -en -ce -qui -concerne -les -salaires -. -dans -de -nombreux -cas -, -elles -sont -même -inexistantes -. -§ -la -CGT -lutte -pour -de -véritables -conventions -collectives -$ -: -_ -la -négociation -des -conventions -collectives -, -avenants -et -accords -paritaires -, -doit -être -ouverte -obligatoirement -à -toutes -les -* -organisations -syndicales -représentatives -; -_ -les -conventions -collectives -, -avenants -et -accords -paritaires -ne -doivent -s -' -appliquer -que -s -' -ils -sont -signés -par -des -organisations -syndicales -représentatives -représentant -ensemble -la -majorité -des -travailleurs -concernés -; -_ -tous -les -travailleurs -d -' -une -même -branche -du -manoeuvre -à -l -' -ingénieur -doivent -être -couverts -par -une -convention -collective -unique -, -comportant -des -avenants -traitant -les -questions -spécifiques -qui -concernent -les -diverses -catégories -. -cela -implique -l -' -extension -automatique -de -chaque -convention -à -toutes -les -entreprises -d -' -une -profession -déterminée -; -_ -les -problèmes -généraux -intéressant -l -' -ensemble -des -salariés -doivent -être -réglés -par -des -accords -interprofessionnels -. -des -conventions -collectives -nationales -doivent -couvrir -toutes -les -branches -et -régler -les -problèmes -d -' -ensemble -du -secteur -professionnel -; -_ -les -accords -et -conventions -d -' -entreprises -doivent -être -considérés -comme -des -compléments -aux -accords -nationaux -ou -aux -conventions -collectives -nationales -, -leur -objet -étant -de -les -adapter -et -de -les -améliorer -; -_ -accélération -de -la -procédure -d -' -extension -des -conventions -collectives -et -accords -, -la -décision -devant -être -rendue -dans -un -délai -maximum -de -trois -mois -à -dater -du -dépôt -de -la -demande -d -' -extension -. -§ -pour -répondre -pleinement -à -la -protection -qu -' -elle -doit -apporter -aux -travailleurs -, -toute -convention -collective -doit -couvrir -dans -ses -dispositions -l -' -ensemble -des -problèmes -soulevés -par -l -' -exercice -de -la -profession -, -dans -le -sens -des -revendications -définies -par -le -présent -programme -. -tout -particulièrement -, -elle -doit -assurer -une -véritable -garantie -des -salaires -. -§ -la -CGT -s -' -oppose -à -toute -disposition -visant -à -limiter -les -droits -syndicaux -et -le -droit -de -grève -, -et -refuse -toute -clause -se -référant -à -des -conceptions -de -collaboration -de -classes -. -§ -conclue -à -la -fois -en -fonction -des -conditions -économiques -sociales -et -politiques -et -du -rapport -des -forces -entre -les -salariés -et -le -patronat -existant -au -moment -de -la -signature -, -la -convention -collective -représente -un -avantage -minimum -pour -tous -, -qui -ne -saurait -être -considéré -comme -immuable -. -§ -son -contenu -doit -être -amélioré -en -tenant -compte -des -besoins -nouveaux -et -de -l -' -évolution -du -rapport -des -forces -en -présence -. -§ -aussi -une -action -de -caractère -permanent -est -elle -nécessaire -pour -assurer -l -' -application -correcte -des -avantages -acquis -et -les -préserver -de -toute -atteinte -, -et -conquérir -des -avantages -et -des -droits -nouveaux -. -§ -sur -la -base -des -principes -énoncés -ci -- -dessus -, -la -CGT -réclame -l -' -ouverture -rapide -, -dans -toutes -les -branches -, -de -négociations -aux -fins -de -conclure -des -conventions -collectives -nationales -, -ou -, -le -cas -échéant -, -de -mettre -à -jour -et -d -' -améliorer -celles -qui -existent -. -< -S10 -= -1 -> -les -statuts -. -. -< -S10 -= -0 -> -§ -les -statuts -des -personnels -sont -le -résultat -des -luttes -nombreuses -des -organisations -syndicales -pour -obtenir -l -' -établissement -de -garanties -. -ils -ont -été -acquis -ou -améliorés -à -l -' -occasion -d -' -un -rapport -de -forces -favorable -à -l -' -ensemble -de -la -classe -ouvrière -, -notamment -lors -de -la -libération -de -notre -pays -avec -le -progrès -du -mouvement -démocratique -. -§ -la -prise -en -considération -des -revendications -générales -de -la -CGT -constitue -un -élément -important -de -la -lutte -pour -la -sauvegarde -et -l -' -amélioration -des -garanties -statutaires -mises -en -cause -par -la -politique -du -pouvoir -visant -à -favoriser -les -monopoles -. -§ -cette -politique -a -les -plus -lourdes -conséquences -dans -le -secteur -public -$ -: -_ -compression -maximum -des -dépenses -de -fonctionnement -au -détriment -des -conditions -de -vie -et -de -travail -des -personnels -et -de -la -qualité -de -service -rendu -aux -usagers -; -_ -transferts -de -plus -en -plus -nombreux -et -variés -des -activités -publiques -rentables -vers -le -secteur -privé -et -démantèlement -des -services -publics -, -utilisation -de -personnels -hors -statuts -pour -certains -secteurs -d -' -activité -. -§ -cela -s -' -accompagne -d -' -attaques -constantes -, -ouvertes -ou -insidieuses -contre -les -statuts -des -personnels -. -sous -couvert -de -réformes -, -d -' -adaptation -ou -de -réorganisation -, -l -' -objectif -final -est -de -remettre -en -cause -les -avantages -acquis -dans -tous -les -domaines -. -§ -ainsi -, -défense -du -service -public -, -défense -et -amélioration -des -garanties -statutaires -sont -étroitement -liées -. -§ -cette -action -reste -une -préoccupation -importante -de -la -CGT -. -< -S10 -= -1 -> -respect -des -garanties -acquises -. -. -< -S10 -= -0 -> -§ -la -CGT -lutte -pour -le -respect -intégral -des -garanties -acquises -et -le -rétablissement -de -celles -qui -ont -été -remises -en -cause -. -elle -exige -notamment -$ -: -_ -l -' -extension -du -rôle -et -de -la -compétence -des -organismes -paritaires -de -la -* -fonction -publique -( -commissions -administratives -, -comités -techniques -, -* -conseil -supérieur -de -la -* -fonction -publique -) -et -des -* -comités -mixtes -du -secteur -nationalisé -; -_ -leur -consultation -obligatoire -; -_ -l -' -amélioration -de -leur -fonctionnement -dans -le -sens -d -' -un -développement -de -prérogatives -des -représentants -des -personnels -et -des -facilités -nécessaires -à -l -' -exercice -de -leur -mandat -. -§ -la -CGT -exige -que -soit -mis -un -terme -au -recrutement -de -personnel -auxiliaire -ou -hors -statut -$ -: -_ -les -auxiliaires -doivent -être -titularisés -; -_ -les -personnels -écartés -du -bénéfice -des -droits -statutaires -doivent -être -intégrés -dans -le -cadre -du -statut -; -_ -les -situations -particulières -pouvant -justifier -le -recrutement -de -personnel -sous -contrat -doivent -être -déterminées -en -accord -avec -les -organisations -syndicales -. -dans -ce -cas -, -des -garanties -équivalentes -à -celles -des -personnels -à -statut -doivent -être -accordées -à -ces -personnels -. -des -règles -similaires -seront -appliquées -aux -personnels -des -entreprises -assurant -une -concession -de -service -public -. -< -S10 -= -1 -> -garanties -nouvelles -. -. -< -S10 -= -0 -> -§ -des -garanties -fondamentales -nouvelles -doivent -être -obtenues -, -notamment -en -ce -qui -concerne -$ -: -_ -les -modalités -de -négociations -afin -de -respecter -les -prérogatives -syndicales -. -à -ce -sujet -$ -: -_ -les -représentants -du -gouvernement -ou -des -directions -nationales -doivent -avoir -réellement -le -pouvoir -de -négocier -et -de -traiter -sans -être -enfermés -dans -les -limites -de -décisions -prises -au -préalable -et -arbitrairement -; -_ -la -référence -à -des -instruments -dont -le -gouvernement -possède -le -contrôle -exclusif -( -indice -officiel -des -prix -) -ou -à -des -formules -liées -à -la -productivité -, -à -l -' -évolution -des -recettes -, -ou -à -la -production -doit -être -exclue -; -_ -les -réformes -de -caractère -fondamental -, -ou -les -mesures -de -caractère -pluriannuel -doivent -être -négociées -en -dehors -des -discussions -salariales -annuelles -; -_ -les -organisations -syndicales -représentatives -doivent -être -associées -à -toutes -les -discussions -intéressant -les -travailleurs -dont -elles -ont -mission -de -défendre -les -intérêts -, -qu -' -elles -soient -ou -non -signataires -des -accords -. -§ -les -droits -syndicaux -, -les -prérogatives -des -organisations -syndicales -dans -l -' -entreprise -, -l -' -établissement -ou -le -service -, -en -particulier -pour -ce -qui -concerne -le -temps -et -les -moyens -des -élus -, -doivent -être -respectés -et -étendus -. -§ -les -comités -d -' -entreprise -ou -organismes -similaires -financés -par -les -administrations -ou -les -directions -et -gérés -par -les -représentants -élus -du -personnel -doivent -être -créés -dans -tous -les -secteurs -. -là -où -ils -existent -, -les -droits -des -travailleurs -dans -la -gestion -doivent -être -étendus -. -< -S10 -= -1 -> -la -formation -et -le -développement -de -l -' -homme -. -. -l -' -enseignement -et -l -' -éducation -permanente -. -. -< -S10 -= -0 -> -§ -la -CGT -attache -la -plus -grande -importance -à -la -formation -des -hommes -. -l -' -acquisition -des -connaissances -pour -tous -et -au -niveau -le -plus -élevé -, -en -fonction -des -aptitudes -de -chacun -, -commande -largement -le -développement -du -progrès -scientifique -, -technique -, -économique -, -social -et -culturel -. -§ -il -est -un -facteur -important -du -développement -de -la -démocratie -. -§ -l -' -éducation -des -enfants -et -des -jeunes -doit -viser -tout -à -la -fois -à -l -' -épanouissement -de -l -' -individu -, -à -son -insertion -dans -la -société -pour -qu -' -il -soit -utile -à -la -collectivité -nationale -, -à -sa -préparation -au -rôle -de -citoyen -responsable -. -§ -une -telle -formation -étalée -de -l -' -école -maternelle -à -l -' -enseignement -du -second -degré -et -à -l -' -enseignement -supérieur -, -doit -se -prolonger -au -cours -de -la -vie -active -par -le -moyen -d -' -une -éducation -permanente -ouverte -à -tous -les -champs -de -la -connaissance -. -§ -le -* -pouvoir -en -place -ne -permet -pas -la -réalisation -d -' -un -tel -objectif -. -§ -le -système -éducatif -actuel -est -conçu -à -partir -des -besoins -des -couches -dominantes -. -il -limite -les -connaissances -au -minimum -requis -pour -assurer -le -profit -. -il -freine -la -recherche -scientifique -et -l -' -asservit -au -patronat -. -il -perpétue -la -ségrégation -sociale -. -il -diffuse -largement -l -' -idéologie -de -la -classe -au -pouvoir -. -§ -les -réformes -successives -entreprises -depuis -15 -ans -_ -même -si -elles -doivent -tenir -compte -de -la -pression -populaire -_ -recherchent -les -adaptations -que -nécessitent -l -' -évolutiondes -techniques -et -surtout -la -crise -du -capitalisme -. -§ -la -crise -de -l -' -école -française -, -la -pauvreté -de -ses -moyens -, -les -jeunes -, -les -étudiants -diplômés -sans -emploi -, -sont -des -reflets -de -la -crise -du -capitalisme -dans -notre -pays -. -§ -la -CGT -estime -qu -' -un -autre -système -éducatif -réaliste -, -progressiste -, -inspiré -de -la -réforme -Langevin -- -Wallon -doit -être -mis -en -place -. -§ -il -donnerait -aux -jeunes -tout -à -la -fois -la -possibilité -de -s -' -instruire -sans -autre -limitation -que -celle -des -aptitudes -et -celle -d -' -utiliser -leur -savoir -dans -des -emplois -rendus -disponibles -par -le -renouveau -économique -. -§ -il -effacerait -largement -les -discriminations -nées -des -différences -de -situation -de -fortune -et -aussi -de -race -en -permettant -notamment -aux -immigrés -et -à -leurs -enfants -d -' -apprendre -leur -langue -maternelle -et -de -mieux -connaître -la -culture -du -pays -d -' -origine -et -du -pays -de -travail -. -§ -il -rétablirait -l -' -égalité -entre -la -formation -des -hommes -et -des -femmes -. -§ -il -se -prolongerait -dans -une -véritable -formation -continue -, -assurant -notamment -l -' -entretien -et -le -perfectionnement -professionnels -, -qu -' -un -enseignement -technique -rénové -et -développé -rendrait -possible -et -efficace -. -§ -ainsi -serait -assuré -, -dans -le -cadre -d -' -une -éducation -nationale -laïque -, -unifiée -associant -les -maîtres -et -les -utilisateurs -, -un -développement -réel -d -' -un -enseignement -de -qualité -, -effectué -par -des -maîtres -qualifiés -et -rémunérés -en -conséquence -. -§ -la -CGT -continuera -de -se -battre -pour -un -tel -projet -, -solution -réaliste -et -globale -à -la -crise -de -l -' -enseignement -. -§ -d -' -ores -et -déjà -, -sans -attendre -une -réforme -complète -du -système -éducatif -, -un -certain -nombre -de -revendications -peuvent -être -satisfaites -. -§ -le -développement -à -l -' -école -maternelle -pour -tous -en -milieu -rural -et -urbain -, -en -s -' -opposant -à -tout -" -plan -" -qui -tendrait -à -dénaturer -le -caractère -éducatif -et -social -de -cet -enseignement -. -§ -la -rénovation -de -l -' -école -élémentaire -dans -son -contenu -et -son -fonctionnement -et -assurant -notamment -la -réduction -des -effectifs -par -classe -et -la -formation -élevée -et -le -perfectionnement -des -maîtres -. -§ -le -respect -intégral -de -la -loi -sur -la -scolarisation -obligatoire -jusqu -' -à -16 -ans -en -garantissant -à -chaque -jeune -une -formation -complète -dans -les -structures -de -l -' -éducation -* -nationale -. -une -telle -exigence -implique -l -' -abrogation -des -articles -56 -et -57 -de -la -* -loi -Royer -, -l -' -abandon -des -formules -de -cloisonnement -structurel -ou -pédagogique -conduisant -des -élèves -à -des -impasses -dramatiques -. -elle -implique -également -des -actions -de -rattrapage -des -retards -scolaires -. -§ -la -mise -en -oeuvre -d -' -un -enseignement -secondaire -de -valeur -, -associant -aux -connaissances -scientifiques -et -littéraires -fondamentales -, -l -' -éducation -civique -et -morale -, -l -' -initiation -à -la -technologie -et -à -l -' -économie -, -l -' -éducation -artistique -et -la -formation -physique -. -§ -un -tel -enseignement -, -sanctionné -par -un -baccalauréat -doit -s -' -ouvrir -librement -et -sans -discrimination -vers -les -enseignements -supérieurs -, -ou -vers -l -' -exercice -d -' -un -métier -. -§ -l -' -expansion -sans -précédent -d -' -un -enseignement -technique -public -, -ouvert -également -aux -garçons -et -aux -filles -, -rénové -, -moderne -, -diversifié -, -favorisant -l -' -épanouissement -des -jeunes -, -leur -donnant -les -bases -fondamentales -des -adaptations -ultérieures -, -les -préparant -concrètement -à -l -' -emploi -. -cela -implique -$ -: -_ -d -' -assurer -le -développement -des -moyens -d -' -accueil -, -de -fonctionnement -, -d -' -orientation -et -d -' -enseignement -des -jeunes -, -garçons -et -filles -, -en -fonction -des -besoins -réels -de -l -' -économie -et -de -la -société -; -_ -de -supprimer -tous -les -moyens -et -toutes -les -structures -ségrégatives -, -empêchant -un -recrutement -normal -dans -les -collèges -d -' -enseignement -technique -; -_ -de -procéder -à -l -' -aménagement -des -structures -de -l -' -enseignementtechnologique -pour -permettre -$ -: -_ -la -mise -à -niveau -des -jeunes -, -garçons -et -filles -, -victimes -de -handicaps -scolaires -, -_ -la -diversification -des -formations -, -_ -l -' -accès -facilité -vers -des -formations -supérieures -; -_ -de -prendre -des -mesures -incitatives -pour -faire -venir -vers -l -' -enseignement -technologique -un -grand -nombre -de -jeunes -; -_ -de -réaliser -une -rénovation -totale -de -l -' -enseignement -technique -, -la -promotion -de -ses -enseignants -et -leur -perfectionnement -continu -. -§ -la -suppression -des -barrages -ségrégatifs -et -l -' -accès -des -étudiants -à -un -enseignement -supérieur -de -haut -niveau -, -en -assurant -la -liaison -entre -l -' -enseignement -et -la -recherche -dans -les -* -universités -, -et -en -étendant -les -moyens -de -la -recherche -. -§ -en -conquérant -le -droit -à -la -formation -et -le -congé -éducation -les -travailleurs -ont -réalisé -un -important -progrès -. -la -CGT -exige -que -ce -droit -soit -pleinement -respecté -et -que -la -formation -continue -s -' -élargisse -à -tous -les -besoins -professionnels -et -culturels -des -salariés -. -§ -elle -estime -que -l -' -* -éducation -nationale -doit -être -le -maître -d -' -oeuvre -principal -d -' -une -telle -politique -, -notamment -en -créant -auprès -de -chaque -établissement -public -des -départements -de -formation -continue -animés -par -des -enseignants -préparés -en -conséquence -. -§ -pour -la -réalisation -de -ces -mesures -, -la -CGT -demande -la -mise -à -la -disposition -de -l -' -* -éducation -nationale -des -moyens -nécessaires -permettant -$ -: -_ -de -construire -et -d -' -équiper -convenablement -, -et -en -toute -sécurité -, -les -écoles -de -tous -niveaux -; -_ -de -recruter -, -de -former -et -de -perfectionner -les -maîtres -, -de -résorber -l -' -auxilariat -; -_ -d -' -assurer -aux -familles -et -aux -jeunes -l -' -aide -sociale -nécessaire -sous -forme -de -bourses -, -de -primes -de -scolarité -ou -d -' -allocations -d -' -études -indexées -sur -l -' -indice -des -prix -accepté -par -les -organisations -syndicales -; -_ -de -mettre -en -place -un -véritable -service -de -protection -sociale -et -médicale -, -relevant -de -l -' -* -éducation -nationale -, -ainsi -qu -' -un -véritable -service -d -' -orientation -scolaire -et -professionnelle -. -§ -enfin -la -CGT -réaffirme -son -attachement -à -l -' -école -laïque -. -elle -dénonce -l -' -augmentation -constante -des -subventions -et -des -aides -aux -écoles -privées -, -confessionnelles -ou -patronales -. -elle -confirme -sa -volonté -de -voir -regrouper -au -sein -d -' -un -grand -service -public -de -l -' -* -éducation -nationale -tous -les -enseignements -et -services -actuellement -dispersés -comme -l -' -enseignement -agricole -par -exemple -. -§ -elle -appelle -toutes -ses -organisations -, -ses -militants -, -les -travailleurs -à -agir -, -aux -côtés -des -enseignants -, -des -organisations -et -partis -démocratiques -pour -promouvoir -toutes -les -mesures -conformes -à -l -' -intérêt -d -' -un -enseignement -national -et -pour -s -' -opposer -à -toutes -les -attaques -contre -l -' -école -. -< -S10 -= -1 -> -la -culture -, -les -sports -, -les -loisirs -. -. -< -S10 -= -0 -> -§ -le -développement -harmonieux -de -l -' -individu -sur -le -plan -culturel -, -sportif -et -des -loisirs -, -est -un -droit -qui -depuis -longtemps -est -partie -intégrante -des -revendications -de -la -classe -ouvrière -. -§ -consciente -que -la -possibilité -pour -les -travailleurs -d -' -accéder -à -une -véritable -vie -culturelle -, -sportive -ou -de -loisirs -est -largement -déterminée -par -leurs -conditions -générales -de -vie -, -la -CGT -agit -pour -l -' -amélioration -des -conditions -de -travail -, -la -réduction -de -la -durée -du -travail -, -la -garantie -et -la -progression -du -pouvoir -d -' -achat -. -§ -afin -de -permettre -aux -travailleurs -d -' -accéder -massivement -à -la -culture -, -aux -sports -et -aux -loisirs -, -la -CGT -définit -ses -revendications -$ -: -_ -au -niveau -de -la -collectivité -nationale -pour -exiger -une -véritable -politique -de -crédits -, -d -' -investissements -, -d -' -infrastructure -et -d -' -équipement -pour -l -' -ensemble -de -ces -activités -; -_ -au -niveau -des -entreprises -pour -obtenir -$ -: -_ -la -gestion -pleine -et -entière -de -ces -activités -par -les -représentants -élus -du -personnel -au -sein -des -* -comités -d -' -entreprise -et -organismes -assimilés -, -dans -toutes -les -entreprises -, -y -compris -dans -les -secteurs -public -et -nationalisé -, -sans -ingérence -du -patronat -et -du -gouvernement -. -§ -le -financement -par -l -' -employeur -$ -: -_ -de -l -' -ensemble -des -activités -sociales -par -une -contribution -au -* -comité -d -' -entreprise -qui -ne -saurait -être -inférieure -à -3 -% -de -la -masse -globale -des -salaires -et -appointements -, -ce -qui -permettrait -notamment -le -développement -des -réalisations -culturelles -, -sportives -et -de -loisirs -au -bénéfice -des -travailleurs -et -de -leur -famille -, -_ -des -investissements -pour -la -réalisation -d -' -installations -sportives -, -culturelles -, -de -loisirs -et -de -vacances -; -_ -l -' -octroi -par -l -' -* -état -de -subventions -et -de -crédits -sans -intérêt -aux -* -comités -d -' -entreprise -et -organismes -équivalents -pour -le -développement -des -activités -sociales -; -_ -la -mise -à -disposition -de -locaux -convenables -et -d -' -un -accès -facile -; -_ -la -suppression -de -la -TVA -pour -les -infrastructures -et -les -équipements -culturels -, -sportifs -, -de -loisirs -et -de -vacances -. -§ -la -CGT -appuie -l -' -activité -des -associations -démocratiques -culturelles -sportives -et -de -tourisme -, -des -organisations -d -' -éducation -populaire -et -de -jeunesse -et -appelle -les -organisations -confédérées -et -leurs -élus -dans -les -CE -et -équivalents -à -renforcer -leur -coopération -avec -elles -. -§ -l -' -essor -sans -précédent -des -sciences -et -des -techniques -, -la -multiplication -des -contacts -entre -les -peuples -et -des -échanges -économiques -, -la -prolifération -des -grands -moyens -d -' -information -, -la -prolongation -de -la -scolarité -, -les -nécessités -du -recyclage -professionnel -font -que -le -droit -à -la -culture -, -dans -le -prolongement -du -droit -à -l -' -instruction -, -à -la -formation -et -au -perfectionnement -professionnels -, -est -devenu -un -phénomène -social -de -notre -époque -et -une -revendication -primordiale -des -travailleurs -. -ils -développent -chez -les -travailleurs -le -besoin -d -' -approfondir -leurs -connaissances -, -leur -capacité -de -réflexion -, -de -discussion -sur -tous -les -sujets -de -la -vie -quotidienne -et -sociale -. -§ -les -besoins -croissants -des -travailleurs -, -donnent -une -acuité -plus -grande -à -ces -revendications -que -le -grand -capital -tente -de -détourner -à -des -fins -mercantiles -, -de -rabaisser -à -des -évasions -illusoires -, -individualistes -ou -primaires -, -de -canaliser -à -son -profit -pour -faire -pénétrer -son -idéologie -de -collaboration -de -classes -. -le -pouvoir -porte -atteinte -à -la -liberté -de -création -, -d -' -expression -, -et -de -diffusion -culturelle -. -les -mesures -prises -, -concernant -les -activités -de -l -' -audiovisuel -visent -à -renforcer -sa -pression -idéologique -sur -les -masses -. -il -en -est -de -même -de -certaines -opérations -de -prestige -qui -risquent -d -' -aboutirà -la -définition -d -' -une -culture -officielle -alors -même -que -sévit -la -censure -, -que -des -subventions -sont -supprimées -et -des -animateurs -licenciés -. -§ -pour -répondre -à -la -volonté -d -' -accéder -et -de -participer -à -la -culture -, -mettre -un -terme -à -la -dégradation -du -patrimoine -artistique -de -notre -pays -et -pour -l -' -enrichir -, -la -CGT -agit -pour -obtenir -$ -: -_ -l -' -augmentation -des -crédits -d -' -* -état -accordés -à -toutes -les -branches -des -activités -culturelles -, -afin -de -permettre -notamment -de -développer -le -réseau -des -théâtres -populaires -des -maisons -de -la -culture -et -des -conservatoires -et -de -donner -à -l -' -art -cinématographique -les -moyens -financiers -qui -lui -font -défaut -; -_ -la -liberté -de -création -, -d -' -expression -, -de -diffusion -des -oeuvres -artistiques -et -littéraires -; -_ -une -radio -- -télévision -répondant -à -l -' -intérêt -national -et -non -aux -impératifs -de -conditionnement -idéologique -et -de -profit -. -§ -la -CGT -soutient -la -revendication -des -artistes -, -écrivains -et -interprètes -pour -un -statut -social -élaboré -avec -eux -, -leurs -représentants -et -leurs -organisations -syndicales -. -§ -elle -considère -indispensable -d -' -associer -les -travailleurs -y -compris -les -travailleurs -immigrés -à -toutes -les -formes -de -la -vie -culturelle -et -à -toutes -les -réalisations -culturelles -existantes -$ -: -maisons -de -la -culture -, -maisons -de -jeunes -, -en -les -intéressant -également -à -la -gestion -. -§ -elle -participe -au -développement -de -ces -activités -à -divers -niveaux -par -la -mise -en -oeuvre -d -' -initiatives -prises -par -les -organisations -confédérées -, -par -l -' -impulsion -que -donnent -ses -militants -aux -multiples -réalisations -culturelles -des -comités -d -' -entreprise -ou -organismes -équivalents -des -secteurs -public -et -nationalisé -. -< -S10 -= -1 -> -les -activités -sportives -de -masse -. -. -< -S10 -= -0 -> -§ -le -sport -n -' -est -pas -seulement -le -moyen -le -plus -sûr -de -garantir -la -santé -et -l -' -équilibre -psychique -des -individus -, -c -' -est -aussi -un -des -éléments -de -la -culture -générale -et -de -l -' -éducation -. -§ -les -conditions -de -notre -temps -, -conditions -aggravées -des -travailleurs -menacent -gravement -leur -santé -et -celle -de -leur -famille -, -interdisent -l -' -épanouissement -de -leur -personnalité -. -la -pratique -des -activités -physiques -et -sportives -devient -un -besoin -social -indispensable -de -plus -en -plus -ressenti -par -les -travailleuses -et -les -travailleurs -. -§ -la -CGT -agit -pour -l -' -attribution -de -crédits -permettant -le -développement -de -la -pratique -du -sport -de -masse -, -et -également -pour -que -les -activités -sportives -occupent -toute -leur -place -dans -l -' -éducation -des -enfants -sur -la -base -de -la -gratuité -et -dans -des -établissements -scolaires -dotés -d -' -installations -modernes -et -d -' -éducateurs -qualifiés -. -§ -l -' -organisation -des -activités -physiques -et -sportives -sur -la -base -de -l -' -entreprise -doit -permettre -à -chaque -travailleuse -et -à -chaque -travailleur -qui -le -désire -de -pratiquer -le -sport -de -son -choix -. -§ -c -' -est -pourquoi -la -CGT -demande -que -des -dispositions -soient -prises -dans -les -statuts -, -accords -nationaux -et -conventions -collectives -. -§ -elle -demande -$ -: -_ -des -mesures -particulières -concernant -les -jeunes -sous -la -forme -de -cinq -heures -rétribuées -prises -sur -le -temps -de -travail -légal -, -leur -permettant -de -fréquenter -une -école -d -' -initiation -sportive -omnisports -; -_ -des -installations -à -l -' -intérieur -ou -à -proximité -immédiate -de -l -' -entreprise -; -_ -la -formation -d -' -animateurs -et -de -moniteurs -choisis -parmi -les -travailleurs -. -< -S10 -= -1 -> -les -activités -touristiques -, -les -loisirs -. -. -< -S10 -= -0 -> -§ -les -conditions -de -la -vie -moderne -et -les -servitudes -qu -' -elle -impose -, -la -pollution -qui -corrompt -l -' -atmosphère -et -le -milieu -de -vie -, -les -nuisances -de -toutes -sortes -, -atteignent -le -travailleur -sur -le -plan -physique -et -moral -. -§ -tous -ces -facteurs -contribuent -à -faire -des -loisirs -, -des -vacances -et -du -tourisme -un -phénomène -social -, -économique -et -culturel -de -notre -temps -. -§ -alors -que -les -vacances -et -le -tourisme -sont -conçus -par -le -patronat -et -le -pouvoir -comme -éléments -d -' -évasion -et -source -de -profits -, -qu -' -ils -sont -l -' -objet -d -' -opérations -spéculatives -, -la -CGT -lutte -pour -que -les -travailleurs -puissent -exercer -pleinement -le -droit -aux -congés -, -aux -loisirs -et -à -la -détente -. -§ -la -CGT -entend -susciter -et -favoriser -tout -ce -qui -conduit -à -l -' -enrichissement -culturel -, -à -la -découverte -des -sites -et -des -modes -de -vie -, -à -la -connaissance -des -réalités -socio -- -économiques -y -compris -dans -les -autres -pays -. -§ -attachant -une -très -grande -importance -au -tourisme -social -et -aux -activités -de -loisirs -, -elle -agit -pour -$ -: -_ -étendre -le -réseau -de -centres -de -vacances -familiales -et -de -parcs -de -loisirs -; -_ -réaliser -une -véritable -politique -de -crédits -et -d -' -investissements -pour -le -tourisme -social -, -ses -infrastructures -et -ses -équipements -; -_ -obtenir -la -réservation -par -l -' -* -état -et -les -collectivités -locales -de -sites -privilégiés -au -profit -du -tourisme -social -avec -bail -de -longue -durée -; -_ -exiger -la -réduction -de -50 -% -pour -les -billets -de -congés -payés -quel -que -soit -le -moyen -de -transport -ainsi -que -l -' -octroi -d -' -un -second -billet -; -_ -supprimer -toutes -les -restrictions -concernant -l -' -utilisation -de -certains -moyens -de -transport -ainsi -que -les -péages -sur -les -autoroutes -pour -les -salariés -en -congés -. -< -S10 -= -1 -> -les -conditions -de -vie -. -. -les -équipements -collectifs -, -sanitaires -et -sociaux -. -. -le -logement -. -. -< -S10 -= -0 -> -§ -la -politique -de -l -' -habitat -aboutit -à -l -' -accentuation -de -la -crise -du -logement -dont -les -travailleurs -et -leur -famille -sont -les -principales -victimes -. -cette -crise -est -à -la -fois -quantitative -et -qualitative -. -tout -d -' -abord -la -pénurie -de -logements -accessibles -persiste -( -particulièrement -dans -les -agglomérations -urbaines -) -; -la -charge -logement -ponctionne -lourdement -le -pouvoir -d -' -achat -, -égalant -et -souvent -même -dépassant -les -25 -% -du -budget -familial -. -les -logements -existants -ou -réalisés -ne -sont -ni -assez -spacieux -, -ni -suffisamment -équipés -, -ni -correctement -implantés -. -§ -tandis -que -des -menaces -de -plus -en -plus -lourdes -pèsent -sur -l -' -institution -HLM -, -et -que -la -spéculation -immobilière -est -source -de -profits -scandaleux -, -le -prétexte -de -la -lutte -contre -l -' -inflation -aboutit -à -réduire -le -nombre -des -logements -sociaux -construits -. -§ -la -CGT -considère -que -la -politique -sociale -du -logement -ne -peut -s -' -insérer -dans -la -pratique -d -' -un -urbanisme -fondé -sur -la -réalisation -du -profit -. -§ -pour -ce -qui -la -concerne -, -une -véritable -politique -sociale -du -logement -comporte -$ -: -_ -la -définition -d -' -un -urbanisme -d -' -ensemble -procédant -de -la -volonté -de -satisfaire -des -besoins -réels -. -cela -implique -d -' -une -part -, -d -' -assurer -des -liaisons -correctes -entre -l -' -habitat -et -l -' -emploi -, -des -transports -collectifs -rapides -et -confortables -et -financés -principalement -par -les -entreprises -, -d -' -autre -part -, -la -réalisation -d -' -un -cadre -de -vie -agréable -permettant -la -détente -et -la -satisfaction -correcte -des -besoins -sociaux -et -culturels -; -_ -la -reconnaissance -du -droit -au -logement -, -assurée -par -un -service -public -basé -sur -l -' -institution -HLM -, -ce -qui -suppose -une -gestion -démocratique -des -organismes -d -' -HLM -, -celle -- -ci -étant -assurée -majoritairement -par -les -élus -locaux -et -les -représentants -des -usagers -( -locataires -, -syndicats -) -, -ainsi -qu -' -un -ensemble -de -mesures -leur -permettant -de -remplir -efficacement -leur -rôle -; -_ -la -maîtrise -de -l -' -usage -des -sols -avec -droit -de -préemption -public -sur -les -transactions -de -terrains -bâtis -ou -non -bâtis -à -l -' -intérieur -des -zones -d -' -urbanisation -et -fixation -de -prix -de -référence -stables -pour -éliminer -la -spéculation -; -_ -le -financement -des -programmes -par -l -' -* -état -, -à -l -' -aide -de -prêts -de -longue -durée -à -faible -taux -d -' -intérêt -; -_ -l -' -octroi -de -subventions -permettant -aux -collectivités -locales -et -aux -offices -HLM -de -réaliser -les -réserves -financières -nécessaires -; -_ -l -' -exonération -totale -de -la -TVA -et -diminution -du -taux -de -celle -- -ci -sur -les -fournitures -et -travaux -d -' -entretien -; -_ -la -réalisation -de -programmes -annuels -permettant -de -faire -face -aux -besoins -; -_ -la -réglementation -des -loyers -et -charges -. -suppression -du -surloyer -, -garantie -du -droit -au -maintien -dans -les -lieux -, -abrogation -de -la -loi -permettant -la -vente -des -HLM -locatives -; -_ -la -refonte -complète -et -la -réforme -du -financement -de -l -' -allocation -logement -; -_ -l -' -affectation -prioritaire -, -sous -le -contrôle -des -* -comités -d -' -entreprise -, -de -la -cotisation -du -1 -% -des -entreprises -au -financement -du -logement -social -. -cette -cotisation -doit -s -' -appliquer -à -l -' -* -état -et -aux -collectivités -publiques -pour -les -personnels -qu -' -ils -emploient -; -elle -doit -être -portée -à -2 -% -pour -les -grandes -entreprises -; -_ -le -développement -de -la -construction -de -logements -sociaux -pour -les -travailleurs -immigrés -et -les -retraités -, -ainsi -que -des -foyers -pour -les -jeunes -travailleuses -et -travailleurs -; -résorption -de -l -' -habitat -insalubre -; -_ -la -mise -en -oeuvre -d -' -une -véritable -politique -de -rénovation -urbaine -et -d -' -amélioration -de -l -' -habitat -ancien -, -à -l -' -initiativedes -collectivités -locales -, -avec -dotations -budgétaires -convenables -permettant -l -' -intervention -prioritaire -des -organismes -d -' -HLM -et -le -respect -du -droit -au -relogement -sur -place -des -habitants -concernés -. -< -S10 -= -1 -> -transports -et -circulation -. -. -< -S10 -= -0 -> -§ -c -' -est -une -même -politique -monopoliste -qui -conduit -aux -déséquilibres -régionaux -de -l -' -économie -, -au -développement -incohérent -des -grandes -concentrations -urbaines -, -qui -dégrade -des -secteurs -entiers -de -l -' -équipement -ferroviaire -, -routier -, -de -l -' -aviation -civile -et -de -la -marine -marchande -. -elle -utilise -le -secteur -nationalisé -des -transports -dans -l -' -intérêt -des -grands -financiers -, -domine -par -la -sous -- -traitance -les -transports -routiers -, -détériore -gravement -les -services -publics -urbains -, -liquide -des -trafics -maritimes -ou -aériens -. -confrontée -avec -le -problème -du -développement -de -la -circulation -automobile -elle -accumule -les -retards -dans -les -infrastructures -de -circulation -. -elle -dilapide -le -potentiel -humain -et -matériel -de -construction -des -moyens -de -transports -( -aéronautique -, -automobile -, -etc -) -. -enfin -, -elle -mène -une -politique -énergétique -portant -préjudice -aux -transports -et -déplacements -. -§ -cette -politique -atteint -la -vie -quotidienne -de -la -population -laborieuse -, -le -développement -de -l -' -économie -nationale -et -les -échanges -internationaux -favorables -à -notre -pays -. -§ -l -' -insuffisance -notoire -et -grandissante -des -moyens -de -transports -collectifs -, -leur -manque -de -rapidité -et -leur -inconfort -portent -atteinte -à -la -santé -et -à -la -vie -familiale -, -sociale -et -culturelle -des -travailleurs -. -§ -la -politique -des -monopoles -tend -de -plus -en -plus -à -faire -peser -sur -les -travailleurs -les -frais -de -l -' -équipement -en -moyen -de -transports -et -de -circulation -remettant -en -cause -leur -rôle -de -services -publics -. -§ -pour -la -CGT -, -les -transports -de -marchandises -et -de -personnes -au -niveau -national -et -international -doivent -être -adaptés -aux -besoins -sociaux -et -culturels -, -au -développement -équilibré -de -l -' -économie -, -à -l -' -aménagement -cohérent -du -territoire -, -à -l -' -intérêt -national -. -§ -loin -de -s -' -opposer -, -les -différentes -techniques -de -transports -( -terrestres -, -aériens -, -maritimes -ou -fluviaux -) -les -différents -moyens -individuels -ou -collectifs -doivent -répondre -à -des -besoins -, -à -des -conditions -, -à -des -domaines -spécifiques -permettant -de -faire -face -à -la -complexité -, -à -la -diversité -et -à -la -mouvance -des -nécessités -de -la -vie -économique -et -sociale -, -tout -en -assurant -une -cohérence -et -une -efficacité -de -l -' -ensemble -. -§ -sachant -l -' -importance -que -représentent -les -conditionsde -transports -et -de -circulation -pour -l -' -existence -quotidienne -des -travailleurs -, -la -CGT -demande -$ -: -_ -une -politique -coordonnée -de -l -' -emploi -, -du -logement -et -des -équipements -sociaux -et -culturels -( -ce -qui -supposerait -la -suppression -de -la -spéculation -foncière -) -; -_ -un -véritable -service -public -de -transports -en -commun -, -desservant -l -' -ensemble -des -agglomérations -et -assurant -les -services -rapides -, -confortables -, -peu -coûteux -et -fonctionnant -aux -heures -permettant -l -' -activité -économique -, -sociale -et -culturelle -de -la -population -; -_ -l -' -amélioration -des -conditions -de -circulation -dans -les -agglomérations -permettant -d -' -élargir -l -' -accès -aux -transports -collectifs -notamment -par -l -' -adaptation -des -voieries -, -des -constructions -de -parkings -à -proximité -des -gares -ou -stations -; -_ -le -développement -de -l -' -équipement -en -transports -et -en -voies -de -circulation -entre -les -communes -isolées -et -les -agglomérations -. -ce -qui -implique -par -conséquent -, -de -cesser -le -démantèlement -des -réseaux -de -transports -existants -, -tels -la -SNCF -et -la -RATP -; -_ -la -prise -en -charge -de -l -' -essentiel -des -équipements -, -de -leur -renouvellement -et -de -leur -extension -par -des -investissements -de -l -' -* -état -. -des -taxes -progressives -étant -prélevées -sur -les -grosses -entreprises -commerciales -, -industrielles -et -la -grosse -propriété -foncière -; -_ -le -paiement -des -frais -de -transports -des -travailleurs -( -cartes -hebdomadaires -ou -autres -) -par -les -employeurs -; -_ -la -création -de -cartes -de -réduction -pour -les -chômeurs -, -les -retraités -et -vieux -travailleurs -, -sur -l -' -ensemble -des -transports -publics -; -_ -la -gratuité -des -transports -pour -les -jeunes -soldats -; -_ -l -' -extension -des -réductions -de -transports -accordées -aux -familles -nombreuses -, -aux -familles -de -travailleurs -immigrés -; -_ -l -' -amélioration -des -transports -scolaires -, -la -sécurité -des -enfants -devant -être -rigoureusement -assurée -et -les -frais -en -résultant -pris -en -charge -par -l -' -* -état -; -_ -la -création -ou -le -développement -des -moyens -de -transports -en -rapport -avec -les -besoins -en -loisirs -. -extension -des -billets -congés -payés -sur -les -transports -aériens -et -maritimes -, -création -de -navires -de -croisières -, -etc -; -_ -une -politique -de -développement -des -différents -modes -de -transports -sur -la -base -de -leur -qualité -complémentaire -, -associée -à -une -politique -nationale -de -la -construction -des -moyens -de -transports -. -< -S10 -= -1 -> -la -santé -. -. -< -S10 -= -0 -> -§ -la -santé -constitue -un -besoin -humain -essentiel -en -même -temps -qu -' -un -impératif -de -progrès -économique -, -social -et -culturel -. -elle -suppose -d -' -abord -des -conditions -de -vie -et -de -travail -correctes -pour -lesquelles -lutte -la -CGT -. -§ -il -appartient -avant -tout -à -l -' -* -état -de -fournir -les -moyens -nécessaires -à -la -satisfaction -de -ces -besoins -. -§ -le -droit -à -la -santé -doit -comporter -pour -toute -la -population -l -' -accès -aux -méthodes -de -prévention -, -d -' -investigation -, -de -traitement -, -de -rééducation -et -de -réadaptation -. -cet -accès -devrait -se -réaliser -dans -le -cadre -d -' -une -véritable -sectorisation -sanitaire -mettant -, -au -service -de -tous -, -les -progrès -des -techniques -médicales -et -des -sciences -biologiques -. -§ -pour -cela -la -CGT -exige -$ -: -_ -la -mise -en -oeuvre -d -' -une -véritable -réforme -de -la -santé -reposant -sur -le -principe -du -service -public -; -_ -la -reconnaissance -du -rôle -de -premier -plan -occupé -par -l -' -hôpital -public -; -_ -la -création -de -nouveaux -hopitaux -et -la -modernisation -de -ceux -qui -existent -; -l -' -implantation -des -unités -hospitalières -au -plus -près -des -lieux -d -' -activité -de -la -population -avec -des -équipements -permettant -de -prévenir -et -de -traiter -les -maladies -telles -que -notamment -le -cancer -, -les -affections -nerveuses -et -cardiaques -, -les -maladies -mentales -et -pulmonaires -; -_ -la -formation -d -' -urgence -, -et -en -nombre -suffisant -, -des -personnels -qualifiés -notamment -au -niveau -des -infirmiers -et -des -médecins -et -le -renforcement -massif -des -effectifs -des -hopitaux -, -les -personnels -bénéficiant -de -plus -justes -salaires -et -de -meilleures -conditions -de -travail -; -_ -un -statut -pour -le -secteur -privé -de -l -' -hospitalisation -garantissant -les -malades -et -les -personnels -; -_ -la -multiplication -des -centres -de -secours -hospitaliers -d -' -urgence -; -_ -le -développement -de -la -recherche -médicale -; -_ -la -promotion -de -formes -nouvelles -d -' -exercice -de -la -médecine -dans -le -respect -de -ses -principes -fondamentaux -$ -: -secret -professionnel -, -liberté -de -prescription -, -indépendance -technique -et -professionnelle -. -§ -dans -ce -but -, -il -convient -que -les -moyens -financiers -soient -assurés -permettant -le -développement -et -le -fonctionnement -des -* -centres -de -santé -, -des -* -collectivités -locales -, -de -la -* -sécurité -sociale -, -des -organisations -mutualistes -, -de -maisons -médicales -permettant -l -' -exercice -d -' -une -véritable -médecine -d -' -équipe -. -§ -la -mise -en -oeuvre -de -ces -mesures -devrait -s -' -effectuer -après -une -large -concertation -avec -les -organisations -syndicales -et -mutualistes -, -le -corps -médical -et -les -représentants -des -collectivités -locales -, -et -dans -le -cadre -d -' -une -véritable -carte -sanitaire -. -§ -ainsi -seraient -créées -les -conditions -d -' -une -réelle -humanisation -de -l -' -hôpital -, -de -la -continuité -des -soins -et -de -la -permanence -du -service -de -santé -. -< -S10 -= -1 -> -les -équipements -sociaux -et -l -' -action -sociale -. -. -< -S10 -= -0 -> -§ -la -CGT -attache -une -très -grande -importance -aux -différents -aspects -de -" -l -' -action -sociale -" -maintenue -, -malgré -les -déclarations -officielles -, -dans -la -plus -grande -indigence -. -§ -pour -une -politique -d -' -action -sociale -conforme -aux -exigences -actuelles -la -CGT -revendique -$ -: -_ -des -équipements -et -des -mesures -de -protection -de -l -' -enfance -et -en -tout -premier -lieu -$ -: -_ -des -crèches -$ -: -compte -tenu -des -graves -carences -qui -existent -dans -ce -domaine -il -convient -de -mettre -en -oeuvre -un -programme -d -' -urgence -. -pour -assurer -le -financement -de -la -construction -et -le -fonctionnement -des -crèches -, -il -importe -qu -' -à -la -participation -des -caisses -d -' -allocations -familiales -et -des -collectivités -locales -, -vienne -s -' -ajouter -un -versement -de -0 -- -5 -% -de -toutes -les -sommes -payées -au -titre -des -traitements -et -salaires -et -la -contribution -de -l -' -* -état -; -_ -une -véritable -médecine -scolaire -; -_ -des -maisons -et -hôtels -maternels -; -_ -des -foyers -de -l -' -enfance -; -_ -des -maisons -d -' -enfants -à -caractère -social -; -_ -l -' -ouverture -de -centres -d -' -orthogénie -et -de -consultations -spécialisées -permettant -la -connaissance -et -l -' -accès -aux -problèmes -de -la -sexualité -et -de -la -contraception -; -_ -des -équipements -et -des -mesures -spéciales -pour -les -personnes -âgées -et -en -particulier -$ -: -_ -la -création -de -centres -de -gériatrie -et -de -gérontologie -; -_ -l -' -augmentation -des -effectifs -des -aides -- -ménagères -; -_ -la -construction -de -foyers -d -' -habitation -comportant -les -équipements -sociaux -et -le -personnel -médical -nécessaire -; -_ -la -rénovation -des -" -hospices -" -existants -et -l -' -édification -d -' -établissements -chargés -d -' -accueillir -tous -ceux -qui -nécessitent -des -soins -constants -et -une -assistance -permanente -; -_ -le -développement -du -réseau -d -' -accueil -pour -les -travailleurs -immigrés -, -qui -doit -être -placé -sous -la -seule -responsabilité -de -l -' -* -office -national -d -' -immigration -, -avec -le -contrôle -syndical -et -financement -par -le -gouvernement -et -le -patronat -; -_ -la -mise -en -oeuvre -d -' -une -politique -conséquente -en -faveur -des -handicapés -qui -implique -un -effort -budgétaire -particulier -de -l -' -* -état -et -comporte -en -tout -premier -lieu -$ -: -_ -la -reconnaissance -du -droit -à -la -santé -permettant -de -mieux -prévenir -les -handicaps -et -de -mieux -les -soigner -; -_ -l -' -intégration -des -enfants -handicapés -dans -le -système -scolaire -de -l -' -* -éducation -nationale -, -en -créant -un -éventail -complet -d -' -établissements -offrant -tous -les -moyens -d -' -éducation -correspondant -aux -différents -handicaps -; -_ -la -reconnaissance -du -droit -à -l -' -emploi -sur -la -base -du -principe -de -l -' -insertion -du -travailleur -handicapé -dans -le -cadre -normal -des -entreprises -, -et -de -la -garantie -des -dispositions -légales -et -de -celles -définies -dans -les -conventions -collectives -; -_ -la -juste -rétribution -de -la -force -de -travail -du -travailleur -handicapé -qui -doit -au -minimum -percevoir -le -SMIC -et -l -' -attribution -d -' -une -allocation -égale -à -80 -% -du -SMIC -pour -ceux -qui -sont -dans -l -' -incapacité -de -travailler -; -_ -la -refonte -des -prestations -familiales -versées -aux -familles -ayant -à -leur -charge -un -enfant -handicapé -. -< -S10 -= -1 -> -le -cadre -de -vie -. -. -< -S10 -= -0 -> -§ -aujourdhui -, -ce -que -l -' -on -appelle -les -" -nuisances -" -atteignent -un -niveau -insupportable -pour -la -population -etspécialement -pour -les -travailleurs -, -ce -sont -$ -: -le -bruit -, -l -' -air -vicié -l -' -eau -polluée -, -les -forêts -détruites -, -le -paysage -enlaidi -, -les -cités -dortoirs -inadaptées -. -§ -mais -ce -n -' -est -pas -la -" -vie -moderne -" -qui -en -est -responsable -. -le -grand -responsable -c -' -est -l -' -anarchie -d -' -un -système -basé -sur -le -profit -qui -gaspille -les -biens -naturels -et -néglige -les -besoins -fondamentaux -de -l -' -homme -; -c -' -est -l -' -anarchiede -l -' -urbanisation -qui -se -fait -en -fonction -de -la -spéculation -foncière -et -du -profit -immobilier -; -c -' -est -l -' -anarchie -de -l -' -industrialisation -qui -se -fait -en -fonction -de -calculs -de -rentabilité -à -court -terme -; -c -' -est -l -' -anarchie -de -la -production -qui -consomme -des -biens -comme -l -' -eau -et -l -' -air -et -les -restitue -sous -forme -de -déchets -pollués -, -sans -que -personne -ne -limite -cette -consommation -ni -oblige -les -vrais -pollueurs -à -empêcher -cette -dégradation -. -§ -les -salariés -, -exploités -dans -leur -travail -, -ne -veulent -pas -, -à -leur -sortie -du -travail -, -que -ce -soit -dans -leur -localité -ou -dans -leur -lieu -de -vacances -, -retrouver -le -même -univers -inhumain -, -souillé -par -la -recherche -du -profit -immédiat -. -§ -la -CGT -demande -$ -: -_ -que -l -' -urbanisation -et -l -' -industrialisation -se -fassent -en -fonction -d -' -un -plan -élaboré -démocratiquement -; -_ -que -soit -mis -en -oeuvre -un -urbanisme -respectant -les -besoins -et -aspirations -de -la -population -tant -en -matière -esthétique -qu -' -en -matière -sociale -; -_ -qu -' -aucune -construction -d -' -ensembles -immobiliers -n -' -ait -lieu -sans -que -soient -, -en -même -temps -, -édifiées -les -installations -sociales -, -culturelles -, -sportives -nécessaires -à -la -population -; -_ -que -les -syndicats -aient -leur -mot -à -dire -, -à -l -' -échelon -local -, -départemental -ou -régional -sur -les -équipements -collectifs -nécessaires -à -la -population -; -_ -que -les -mesures -nécessaires -soient -imposées -aux -industriels -pour -que -leurs -activités -préservent -les -conditions -de -vie -de -la -population -et -les -sites -de -repos -et -qu -' -elles -respectent -des -normes -antipollution -efficaces -; -_ -que -toute -nouvelle -installation -ou -fabrication -fasse -l -' -objetd -' -un -examen -, -notamment -des -* -comités -d -' -hygiène -et -de -sécurité -, -en -liaison -avec -les -représentants -de -la -population -concernée -; -_ -qu -' -une -contribution -financière -, -prélevée -sur -le -chiffre -d -' -affaires -des -grandes -entreprises -en -fonction -des -atteintes -au -cadre -de -vie -, -soit -affectée -à -la -réparation -des -préjudices -causés -. -< -S00 -= -02 -> -< -S01 -= -003 -> -< -S02 -= -001 -> -< -S03 -= -003 -> -< -Sda -= -1975 -> -< -Sdm -= -06 -> -< -Sat -= -0 -> -< -S10 -= -1 -> -la -CGT -définit -son -action -face -à -la -situation -générale -du -pays -. -. -< -S10 -= -0 -> -§ -la -crise -du -système -capitaliste -s -' -est -aggravée -. -elle -engendre -un -niveau -élevé -et -permanent -d -' -inflation -et -un -chômage -massif -. -elle -s -' -accompagne -d -' -un -ralentissement -de -l -' -activité -économique -, -de -difficultés -croissantes -de -débouchés -. -§ -la -France -est -profondément -affectée -par -le -développement -de -la -crise -qui -entraîne -des -atteintes -sérieuses -au -pouvoir -d -' -achat -et -approfondit -et -généralise -l -' -insécurité -. -§ -mais -la -crise -n -' -est -pas -fatale -. -le -dérèglement -de -l -' -économie -capitaliste -a -pour -cause -l -' -accumulation -de -profits -extraordinaires -par -les -grandes -sociétés -capitalistes -et -en -particulier -par -les -sociétés -multinationales -avec -le -soutien -de -l -' -* -état -. -§ -la -politique -du -pouvoir -vise -à -faire -supporter -la -crise -aux -travailleurs -et -au -peuple -. -l -' -austérité -n -' -est -pas -un -remède -permettant -de -sortir -de -la -crise -. -elle -l -' -accentue -. -elle -accélère -le -gâchis -des -forces -productives -humaines -et -matérielles -, -entraînant -la -destruction -et -l -' -abandon -de -secteurs -décisifs -, -aggravant -les -déséquilibres -de -l -' -appareil -productif -et -des -économies -régionales -. -le -" -redéploiement -" -que -met -en -oeuvre -le -pouvoir -pour -renforcer -les -monopoles -va -encore -les -accélérer -. -il -vise -à -soutenir -l -' -expansion -multinationale -des -groupes -monopolistes -basés -en -France -et -il -accélère -la -pénétration -de -l -' -économie -française -par -les -multinationales -étrangères -. -§ -les -orientations -du -* -7ème -plan -visent -à -prolonger -et -à -accentuer -la -politique -d -' -austérité -. -§ -cette -politique -est -profondément -nocive -, -contraire -à -l -' -intérêt -national -et -à -l -' -établissement -d -' -une -coopération -et -d -' -échanges -économiques -internationaux -sur -une -base -saine -. -§ -concentrant -toutes -les -forces -de -conservation -sociale -, -la -politique -du -pouvoir -renforce -l -' -autoritarisme -du -système -et -en -accentue -toutes -les -contraintes -majeures -. -§ -en -s -' -appuyant -sur -la -montée -de -la -volonté -populaire -de -changement -, -il -est -nécessaire -de -développer -les -luttes -sociales -pour -assurer -la -défense -des -conditions -de -travail -et -de -vie -des -travailleurs -. -en -même -temps -l -' -action -est -indispensable -pour -imposer -des -mesures -économiques -, -s -' -attaquant -à -l -' -inflation -, -assainissant -l -' -économie -et -assurant -son -développement -. -elle -est -intimement -liée -à -la -défense -des -intérêts -des -travailleurs -. -< -S10 -= -1 -> -la -politique -économique -. -. -< -S10 -= -0 -> -§ -pour -faire -face -à -la -crise -, -des -mesures -essentiellement -différentes -de -celles -adoptées -par -le -patronat -et -le -gouvernement -, -dont -la -responsabilité -dans -la -situation -actuelle -est -écrasante -, -sont -à -mettre -en -oeuvre -. -§ -il -est -indispensable -d -' -assurer -le -développement -prioritaire -du -marché -intérieur -et -d -' -élever -la -consommation -populaire -pour -répondre -aux -besoins -des -travailleurs -et -des -grandes -masses -de -la -population -. -pour -assurer -un -développement -économique -plus -sain -, -fondé -sur -l -' -élargissement -de -la -consommation -populaire -et -du -marché -intérieur -, -sauvegarder -l -' -emploi -et -rééquilibrer -nos -échanges -, -il -faut -promouvoir -une -politique -industrielle -s -' -appuyant -sur -le -secteur -public -. -il -faut -utiliser -toutes -les -ressources -et -potentialités -du -pays -. -il -faut -s -' -attaquer -aux -sources -de -l -' -inflation -. -§ -à -cet -effet -il -est -nécessaire -$ -: -_ -de -réduire -la -TVA -sur -les -produits -de -première -nécessité -; -_ -de -bloquer -les -prix -de -certains -produits -de -grande -consommation -, -des -produits -industriels -les -plus -importants -à -la -production -ainsi -que -les -tarifs -publics -, -les -loyers -et -les -charges -; -_ -de -réduire -et -de -contrôler -les -marges -bénéficiaires -des -grandes -sociétés -; -_ -de -mettre -en -oeuvre -une -politique -sélective -du -crédit -s -' -attaquant -aux -facilités -inflationnistes -de -crédit -offertes -aux -grandes -entreprises -, -sans -porter -atteinte -au -fonctionnement -normal -des -PME -ni -à -l -' -emploi -; -_ -de -défendre -l -' -épargne -populaire -contre -l -' -inflation -et -d -' -indexer -le -montant -des -livrets -A -- -de -* -caisse -d -' -épargne -sur -l -' -évolution -réelle -des -prix -. -§ -pour -s -' -opposer -à -la -dégradation -de -l -' -emploi -et -assurer -son -développement -, -sont -nécessaires -des -mesures -de -réduction -de -la -durée -du -travail -, -d -' -abaissement -d -' -âge -de -la -retraite -, -la -garantie -des -ressources -, -l -' -interdiction -des -décisions -de -licenciement -sans -reclassement -préalable -, -le -droit -et -les -moyens -de -discuter -du -bien -fondé -des -décisions -de -licenciement -et -de -fermeture -d -' -entreprises -. -conjointement -, -il -est -indispensable -de -mettre -en -oeuvre -une -politique -économique -et -sociale -assurant -le -développement -économique -et -qui -soit -créatrice -d -' -emplois -. -ceci -exige -notamment -le -développement -des -services -et -activités -directement -utiles -à -l -' -économie -ou -indispensables -à -l -' -amélioration -des -conditions -de -vie -( -enseignement -, -santé -, -services -sociaux -, -etc -) -. -§ -il -faut -stopper -l -' -abandon -, -la -liquidation -et -la -subordination -au -capital -étranger -de -secteurs -ou -d -' -entreprisesindispensables -au -développement -de -l -' -économie -française -qu -' -entraîne -la -politique -actuelle -, -assurer -leur -maintien -et -leur -développement -, -notamment -dans -les -secteurs -de -pointe -, -vitaux -pour -la -souveraineté -nationale -et -la -définition -de -la -place -de -notre -pays -dans -la -civilisation -internationale -du -travail -. -§ -la -politique -industrielle -doit -s -' -appuyer -sur -l -' -extension -du -secteur -public -pour -assurer -le -développement -de -productions -nationales -nécessaires -au -développement -de -l -' -économie -, -indispensables -à -son -équilibre -interne -et -à -celui -de -ses -échanges -extérieurs -. -§ -indépendamment -des -mesures -visant -à -une -réforme -de -la -fiscalité -qui -aurait -une -portée -économique -positive -, -les -subventions -et -autres -transferts -effectués -au -bénéfice -du -grand -capital -doivent -être -supprimés -. -un -impôt -sur -le -capital -des -grandes -firmes -françaises -doit -être -instauré -. -§ -les -ressources -dégagées -doivent -être -, -en -priorité -, -affectées -aux -équipements -sociaux -. -le -budget -de -l -' -* -état -doit -être -équilibré -. -il -convient -de -réduire -substantiellement -les -dépenses -militaires -avant -tout -par -la -suppression -de -la -force -de -frappe -nucléaire -et -en -prévoyant -la -reconversion -des -industries -d -' -armement -et -des -activités -qui -leur -sont -liées -vers -des -fabrications -civiles -en -utilisant -pleinement -le -potentiel -scientifique -technologique -devenu -ainsi -disponible -. -§ -une -nouvelle -orientation -de -la -fiscalité -et -du -budget -et -des -fonds -publics -ou -parapublics -( -conjugués -avec -le -contrôle -des -prix -et -du -crédit -) -est -indispensable -pour -s -' -attaquer -à -l -' -inflation -qui -pèse -lourdement -sur -les -travailleurs -et -les -titulaires -de -petits -revenus -et -qui -a -également -des -effets -négatifs -sur -les -échanges -extérieurs -. -§ -il -est -immédiatement -nécessaire -d -' -augmenter -rythme -et -réalisation -des -équipements -sociaux -et -collectifs -afin -de -combler -les -retards -considérables -accumulés -dans -ce -domaine -. -§ -ces -mesures -sont -de -nature -à -impulser -l -' -activité -dans -de -nombreux -secteurs -de -production -et -à -favoriser -la -mise -en -oeuvre -de -techniques -nouvelles -. -§ -un -changement -radical -de -la -politique -énergétique -de -la -France -est -urgent -. -il -faut -en -finir -avec -le -pillage -et -la -domination -des -sociétés -multinationales -sur -la -politique -énergétique -. -§ -une -politique -nouvelle -fondée -sur -la -diversification -et -la -coordination -des -sources -d -' -énergie -doit -être -appliquée -. -elle -doit -comporter -$ -: -_ -l -' -arrêt -immédiat -des -fermetures -de -puits -dans -les -mines -de -charbon -encore -en -exploitation -et -l -' -utilisation -à -plein -des -capacités -actuelles -d -' -extraction -; -_ -un -plan -d -' -augmentation -de -la -production -charbonnière -utilisant -pleinement -les -ressources -nationales -; -_ -l -' -utilisation -des -potentialités -nationales -pour -la -production -hydraulique -d -' -électricité -, -notamment -par -l -' -énergie -marémotrice -; -_ -le -développement -de -la -production -d -' -électricité -d -' -origine -nucléaire -en -orientant -le -choix -entre -les -différentes -techniques -de -réacteurs -, -dans -le -but -d -' -assurer -une -meilleure -utilisation -possible -des -réserves -naturelles -en -matériaux -fissiles -pour -la -production -d -' -électricité -; -_ -" -aucune -considération -de -rentabilité -économique -ne -doit -être -opposée -aux -mesures -indispensables -pour -assurer -la -sécurité -de -la -population -et -du -personnel -" -; -_ -la -suppression -des -privilèges -des -sociétés -pétrolières -et -l -' -abaissement -des -taxes -à -la -consommation -sur -les -produits -pétroliers -; -_ -l -' -établissement -avec -les -pays -producteurs -de -pétrole -et -de -gaz -naturel -de -contrats -sur -la -base -de -l -' -intérêt -mutuel -des -peuples -, -en -bannissant -toute -pratique -néo -- -coloniale -et -sans -interférence -des -compagnies -; -_ -la -nationalisation -de -l -' -ensemble -du -secteur -pétrolier -et -, -dans -l -' -immédiat -, -la -nationalisation -des -groupes -pétroliers -français -Elf -- -Erap -CFP -- -Total -; -_ -le -développement -de -la -recherche -, -par -le -secteur -public -et -nationalisé -, -sur -les -sources -d -' -énergie -de -l -' -avenir -$ -: -hydrogène -, -énergie -solaire -, -géothermie -, -fusion -thermonucléaire -contrôlée -. -§ -la -remise -en -cause -généralisée -du -rôle -du -service -public -, -le -démantèlement -de -certaines -activités -des -administrations -et -entreprises -nationalisées -par -leur -transfert -, -soit -pour -les -faire -effectuer -par -des -personnels -hors -statut -, -soit -pour -faire -bénéficier -les -monopoles -de -leur -rentabilité -, -la -pénétration -accélérée -de -ces -administrations -et -entreprises -par -les -capitaux -privés -doivent -être -stoppés -. -au -contraire -, -il -convient -de -développer -le -secteur -public -et -nationalisé -et -de -le -mettre -au -service -de -l -' -intérêt -national -, -ce -qui -implique -une -politique -de -tarifs -mettant -fin -aux -transferts -considérables -opérés -au -bénéfice -des -monopoles -et -au -détriment -de -la -grande -masse -des -usagers -et -qui -pèsent -sur -les -prix -à -la -consommation -. -§ -une -politique -coordonnée -des -transports -, -combinant -le -développement -des -infrastructures -nouvelles -et -l -' -utilisation -des -capacités -existantes -répondant -aux -besoins -des -usagers -, -des -régions -, -du -développement -économique -national -et -des -échanges -internationaux -de -la -France -, -est -à -mettre -en -oeuvre -. -§ -cette -politique -doit -s -' -insérer -dans -un -plan -de -développement -à -long -terme -des -infrastructures -nécessaires -pour -satisfaire -au -mieux -et -au -moindre -coût -économique -et -social -les -besoins -prévisibles -. -il -est -urgent -de -développer -les -transports -collectifs -d -' -usagers -, -notamment -les -transports -urbains -. -§ -il -est -nécessaire -d -' -organiser -une -recherche -scientifique -dégagée -de -la -pression -matérielle -et -morale -des -intérêts -privés -qui -s -' -efforcent -d -' -en -monopoliser -les -résultats -et -compromettent -son -avenir -à -long -terme -. -§ -l -' -enseignement -supérieur -et -les -établissements -publics -de -recherche -scientifique -doivent -recevoir -les -moyens -nécessaires -au -développement -des -différents -secteurs -de -la -recherche -, -conformément -à -l -' -intérêt -national -. -§ -en -ce -qui -concerne -l -' -aménagement -du -territoire -, -il -faut -en -premier -lieu -assurer -un -niveau -d -' -activité -permettant -de -réaliser -le -plein -emploi -, -s -' -attaquer -aux -facteurs -de -régression -que -sont -les -disparités -en -matière -de -salaires -, -d -' -équipements -collectifs -et -sociaux -. -§ -les -investissements -publics -, -ceux -du -secteur -nationalisé -, -doivent -être -orientés -en -vue -de -rééquilibrer -les -économies -régionales -. -il -est -urgent -de -prendre -des -mesures -pour -arrêter -le -dépérissement -des -régions -du -Centre -de -la -France -, -de -l -' -Ouest -- -Sud -- -Ouest -. -des -mesures -spécifiques -doivent -être -adoptées -à -cet -effet -. -§ -les -objectifs -généraux -suivants -doivent -être -assignés -à -la -politique -d -' -aménagement -du -territoire -. -§ -infrastructures -$ -: -_ -accélération -des -liaisons -de -désenclavement -des -régions -et -de -jonctions -radiales -interrégions -, -notamment -autoroutières -sous -le -contrôle -et -avec -le -financement -de -l -' -* -état -; -_ -arrêt -des -fermetures -de -liaisons -ferroviaires -et -accélération -des -programmes -d -' -investissements -; -_ -participation -accrue -de -l -' -* -état -et -du -FDES -( -* -fonds -développement -économique -et -social -) -à -la -modernisation -des -installations -portuaires -et -fluviales -; -_ -modernisation -et -extension -prioritaire -du -réseau -de -télécommunications -. -§ -industrie -$ -: -_ -développement -diversifié -des -activités -économiques -régionales -prenant -appui -sur -les -ressources -propres -de -chaque -région -et -leur -vocation -; -_ -utilisation -de -l -' -ensemble -des -ressources -industrielles -, -énergétiques -, -minières -, -agricoles -et -humaines -de -chaque -région -. -§ -dans -le -domaine -législatif -et -réglementaire -, -il -est -nécessaire -de -prendre -les -mesures -suivantes -$ -: -_ -élection -au -suffrage -universel -direct -et -à -la -proportionnelle -des -* -conseils -régionaux -et -accroissement -des -ressources -des -régions -par -transfert -du -budget -de -l -' -* -état -et -suppression -de -la -fiscalité -supplémentaire -prévue -par -la -loi -du -5 -juillet -1972 -; -_ -augmentation -de -la -représentation -des -organisations -représentatives -des -salariés -dans -les -CESR -( -* -conseils -économiques -et -sociaux -régionaux -) -et -répartition -des -sièges -attribués -à -ces -organisations -proportionnellement -à -leur -influence -respective -; -_ -suppression -des -sièges -attribués -aux -organisations -non -représentatives -. -§ -il -est -indispensable -de -cesser -les -encouragements -sous -des -formes -diverses -visant -à -favoriser -les -exportations -de -capitaux -et -il -faut -viser -à -se -prémunir -contre -leurs -effets -inflationnistes -et -à -contrôler -les -mouvements -de -capitaux -pour -défendre -la -monnaie -. -les -investissements -de -capitaux -étrangers -doivent -faire -l -' -objet -d -' -un -strict -contrôle -et -être -interdits -dans -tous -les -cas -où -ils -mettent -en -cause -la -maîtrise -de -l -' -économie -du -pays -et -la -souveraineté -nationale -. -§ -il -est -nécessaire -de -procéder -, -progressivement -, -à -une -diversification -de -nos -relations -économiques -extérieures -tant -en -ce -qui -concerne -le -commerce -extérieur -que -la -coopération -technique -et -scientifique -en -les -fondant -sur -l -' -intérêt -mutuel -et -en -les -étendant -à -un -nombre -plus -grand -de -pays -, -notamment -les -pays -socialistes -et -les -pays -en -voie -de -développement -. -§ -ces -mesures -ne -peuvent -être -imposées -que -par -les -luttes -des -salariés -et -des -grandes -masses -de -la -population -. -elles -s -' -inscrivent -en -opposition -avec -la -politique -réactionnaire -du -pouvoir -dont -les -effets -néfastes -s -' -expriment -dans -la -crise -actuelle -. -< -S10 -= -1 -> -les -libertés -. -. -< -S10 -= -0 -> -§ -luttant -pour -l -' -instauration -d -' -un -véritable -régime -démocratique -, -la -CGT -s -' -oppose -au -caractère -de -plus -en -plus -autoritaire -du -pouvoir -qui -tente -de -le -dissimuler -dans -un -libéralisme -de -façade -. -§ -elle -dénonce -la -propagande -antisyndicale -du -patronat -et -des -hommes -du -pouvoir -et -les -campagnes -racistes -de -leurs -officines -. -§ -la -CGT -s -' -élève -contre -l -' -accroissement -des -contraintes -, -directes -et -indirectes -du -pouvoir -et -du -patronat -dirigées -contre -les -libertés -individuelles -et -publiques -et -mettant -en -cause -les -droits -syndicaux -, -notamment -le -droit -de -grève -et -les -autres -droits -des -travailleurs -. -< -S10 -= -1 -> -libertés -collectives -et -individuelles -. -. -< -S10 -= -0 -> -§ -elle -juge -que -le -respect -des -libertés -fondamentales -dans -notre -pays -exige -, -dans -l -' -immédiat -, -l -' -ensemble -des -mesures -suivantes -$ -: -_ -respect -absolu -du -droit -de -pétition -et -de -manifestation -; -_ -abrogation -de -la -loi -du -8 -juin -1970 -, -dite -loi -" -anticasseur -" -; -_ -droit -d -' -expression -des -syndicats -sur -les -antennes -de -la -radio -et -de -la -télévision -; -_ -abrogation -de -la -loi -du -7 -août -1974 -portant -suppression -de -l -' -ORTF -et -remplacement -de -cette -loi -par -un -ensemble -législatif -garantissant -l -' -indépendance -, -la -démocratisation -et -la -qualité -de -la -radio -et -de -la -télévision -française -; -_ -mise -en -oeuvre -d -' -un -statut -démocratique -du -jeune -soldat -assurant -le -droit -d -' -association -de -libertés -d -' -expression -, -de -respect -de -la -dignité -de -l -' -homme -citoyen -et -l -' -arrêt -de -toutes -sanctions -prises -arbitrairement -; -_ -suppression -des -juridictions -d -' -exception -telle -la -* -cour -de -sûreté -de -l -' -* -état -; -_ -modification -profonde -de -la -loi -1963 -pour -aboutir -à -un -véritable -statut -des -objecteurs -de -conscience -; -_ -rattachement -de -la -police -judiciaire -au -ministère -de -la -justice -; -_ -démocratisation -de -la -police -dans -son -recrutement -sa -formation -et -son -utilisation -; -_ -suppression -des -polices -parallèles -; -_ -rétablissement -et -respect -des -franchises -universitaires -; -_ -réforme -de -la -procédure -de -flagrant -délit -; -_ -abrogation -de -la -garde -à -vue -; -_ -droit -immédiat -et -gratuit -, -en -cas -d -' -arrestation -, -à -l -' -assistance -d -' -un -avocat -; -_ -droit -pour -tout -inculpé -de -connaître -son -dossier -aussi -bien -que -le -procureur -; -_ -réforme -des -règles -d -' -enquête -judiciaire -; -_ -levée -du -secret -de -l -' -instruction -judiciaire -; -_ -abolition -du -pouvoir -discrétionnaire -du -* -ministre -de -l -' -intérieur -en -matière -d -' -expulsion -, -de -refoulement -et -d -' -assignation -à -résidence -; -_ -garantie -des -libertés -individuelles -et -collectives -des -travailleurs -immigrés -, -de -leur -dignité -, -de -leurs -droits -d -' -expression -, -d -' -association -et -de -leurs -droits -politiques -; -_ -réforme -du -système -pénitentiaire -dans -le -sens -d -' -une -véritable -humanisation -des -conditions -de -détention -et -de -la -garantie -de -la -sécurité -des -gardiens -; -_ -répression -sévère -des -attentats -, -violences -et -campagnes -racistes -et -stricte -application -de -la -loi -antiraciste -du -1er -juillet -1972 -. -< -S10 -= -1 -> -liberté -de -la -presse -et -des -autres -moyens -d -' -information -. -. -< -S10 -= -0 -> -§ -la -crise -que -connaît -actuellement -la -presse -écrite -a -son -origine -dans -l -' -entreprise -délibérée -du -pouvoir -et -des -quelques -journaux -à -grand -tirage -, -propriété -de -groupes -industriels -et -financiers -, -pour -s -' -assurer -le -monopole -de -l -' -information -. -§ -c -' -est -le -même -objectif -que -poursuit -le -pouvoir -en -démantelant -l -' -ORTF -et -en -s -' -assurant -plus -complètement -le -contrôle -des -radios -périphériques -. -§ -il -s -' -agit -de -la -volonté -délibérée -de -mettre -en -cause -une -liberté -essentielle -$ -: -la -liberté -d -' -expression -. -§ -le -droit -à -l -' -information -est -une -donnée -essentielle -et -permanente -de -la -démocratie -. -§ -la -CGT -demande -une -discussion -générale -de -toutes -les -parties -intéressées -_ -y -compris -les -représentants -des -organisations -syndicales -de -travailleurs -en -vue -de -rechercher -une -solution -d -' -ensemble -pour -assurer -l -' -existence -de -l -' -indépendance -des -moyens -d -' -information -. -§ -en -outre -, -elle -réclame -$ -: -_ -une -industrie -nationale -du -papier -de -presse -; -_ -l -' -abrogation -des -mesures -fiscales -et -postales -amputant -les -aides -consenties -à -la -presse -à -la -* -libération -; -_ -une -réglementation -des -ressources -publicitaires -; -_ -des -garanties -pour -le -libre -exercice -de -la -fonction -de -journaliste -aussi -bien -à -la -radio -, -à -la -télévision -que -dans -la -presse -écrite -. -< -S00 -= -02 -> -< -S01 -= -003 -> -< -S02 -= -001 -> -< -S03 -= -004 -> -< -Sda -= -1975 -> -< -Sdm -= -06 -> -< -Sat -= -0 -> -< -S10 -= -1 -> -la -CGT -définit -son -action -face -aux -grands -problèmes -internationaux -et -au -marché -commun -. -. -la -solidarité -internationale -, -la -paix -, -l -' -indépendance -nationale -. -. -< -S10 -= -0 -> -§ -l -' -accentuation -de -la -crise -générale -du -capitalisme -fait -obligation -au -mouvement -syndical -de -lier -étroitement -la -lutte -pour -les -revendications -économiques -et -sociales -des -travailleurs -aux -niveaux -national -et -international -ainsi -qu -' -au -combat -plus -général -pour -le -maintien -de -la -paix -, -pour -le -développement -de -rapports -internationaux -permettant -l -' -établissement -d -' -un -climat -mondial -de -coopération -entre -les -peuples -. -§ -notre -époque -est -caractérisée -par -des -grandes -luttes -des -travailleurs -et -des -peuples -pour -l -' -indépendance -nationale -et -la -démocratie -, -le -progrès -social -et -la -paix -, -pour -le -socialisme -. -la -solidarité -internationale -acquiert -des -dimensions -inconnues -jusqu -' -ici -. -§ -d -' -importants -succès -ont -été -obtenus -dans -ces -domaines -. -après -avoir -été -contraint -de -signer -les -accords -de -Paris -, -l -' -impérialisme -US -a -été -chassé -du -Viêt -- -Nam -et -du -Cambodge -qui -ont -été -définitivement -libérés -. -des -pays -anciennement -colonisés -ont -acquis -leur -indépendance -politique -, -certains -acquièrent -ou -consolident -leur -indépendance -économique -, -au -Portugal -et -en -Grèce -le -fascisme -a -subi -un -échec -; -des -progrès -sont -enregistrés -pour -l -' -établissement -de -la -coexistence -pacifique -dans -le -* -monde -, -pour -la -détente -et -la -coopération -européenne -. -§ -l -' -impérialisme -est -en -crise -profonde -et -s -' -affaiblit -. -il -est -contraint -à -des -reculs -. -mais -, -en -vue -de -maintenir -et -si -possible -de -renforcer -sa -domination -et -son -exploitation -sur -les -travailleurs -et -les -peuples -, -il -intervient -de -plus -en -plus -contre -la -liberté -des -peuples -, -emploie -la -violence -la -plus -bestiale -comme -au -Chili -pour -s -' -opposer -au -développement -de -la -démocratie -. -il -relance -l -' -alliance -atlantique -, -dangereuse -pour -la -paix -mondiale -et -l -' -indépendance -des -peuples -, -il -fomente -complots -et -agressions -. -§ -de -plus -, -il -favorise -le -développement -des -sociétés -multinationales -et -l -' -internationalisation -de -l -' -exploitation -des -travailleurs -, -il -organise -l -' -intégration -monopoliste -comme -dans -le -* -marché -commun -. -§ -la -CGT -considère -que -la -lutte -anti -- -impérialiste -et -antimonopoliste -est -un -impératif -pour -la -défense -des -intérêts -des -travailleurs -. -§ -en -se -félicitant -qu -' -en -France -des -actions -unitaires -se -manifestent -pour -l -' -affirmation -de -la -solidarité -internationale -des -travailleurs -et -la -défense -de -la -paix -, -la -CGT -s -' -efforce -de -faire -progresser -l -' -action -unie -de -la -classe -ouvrière -et -des -organisations -syndicales -dans -le -monde -et -plus -spécialement -en -Europe -. -§ -constatant -que -la -politique -extérieure -du -* -pouvoir -en -France -s -' -efforce -d -' -enchaîner -notre -pays -à -la -stratégie -planétaire -de -l -' -impérialisme -US -, -la -CGT -exige -le -respect -et -la -défense -de -l -' -indépendance -et -de -la -souveraineté -nationale -, -que -soient -prises -par -notre -pays -des -initiatives -pour -la -coexistence -pacifique -, -pour -le -désarmement -général -et -contrôlé -, -pour -l -' -établissement -d -' -une -action -et -durable -entente -entre -les -peuples -du -monde -. -§ -la -CGT -se -prononce -et -déploie -son -action -$ -: -_ -pour -la -participation -active -de -la -France -à -la -détente -internationale -, -aux -règlements -par -voie -de -négociations -des -litiges -internationaux -, -à -l -' -organisation -de -la -coexistence -pacifique -et -du -désarmement -général -; -_ -pour -la -suppression -de -toute -force -de -frappe -atomique -, -qu -' -elle -soit -nationale -, -multinationale -ou -européenne -et -des -armes -de -destruction -massive -, -pour -la -réduction -des -dépenses -d -' -armement -et -l -' -utilisation -des -fonds -ainsi -disponibles -à -la -solution -des -grands -problèmes -de -notre -temps -( -aide -aux -pays -sous -- -développés -, -lutte -contre -le -chômage -et -pour -l -' -emploi -, -contre -la -pollution -, -etc -) -; -_ -pour -la -dissolution -simultanée -de -tous -les -blocs -militaires -. -la -France -ne -doit -pas -participer -à -un -bloc -militaire -quel -qu -' -il -soit -, -ce -qui -implique -son -désengagement -du -* -pacte -atlantique -; -_ -pour -le -respect -de -l -' -indépendance -des -peuples -, -la -non -- -ingérence -dans -leurs -affaires -intérieures -et -l -' -établissement -sur -un -pied -d -' -égalité -d -' -une -véritable -politique -de -coopération -avec -les -peuples -nouvellement -indépendants -; -_ -après -la -victoire -historique -des -peuples -du -Viêt -- -Nam -et -du -Cambodge -, -la -CGT -exigera -que -ces -peuples -qui -ont -eu -à -supporter -durant -de -longues -années -une -guerre -de -destruction -massive -puissent -faire -valoir -leurs -droitsà -de -justes -réparations -et -pour -une -reconstruction -rapide -des -régions -dévastées -. -la -France -doit -élargir -et -développer -ses -rapports -, -avec -la -* -république -démocratique -du -Viêt -- -Nam -, -avec -le -GRP -du -Sud -- -Viêt -- -Nam -, -avec -le -Laos -et -le -GRUNC -du -Cambodge -; -_ -pour -le -règlement -politique -du -conflit -au -Moyen -- -Orient -sur -la -base -des -résolutions -de -l -' -ONU -prévoyant -, -en -premier -lieu -, -l -' -évacuation -des -territoires -occupés -par -l -' -armée -israélienne -, -la -reconnaissance -des -droits -nationaux -du -peuple -arabe -de -Palestine -, -le -droit -à -l -' -existence -de -tous -les -états -de -la -région -y -compris -l -' -* -état -d -' -Israël -. -la -CGT -souhaite -que -la -* -conférence -de -Genève -permette -un -tel -règlement -écartant -à -l -' -avenir -toute -ingérence -impérialiste -et -que -s -' -instaure -un -climat -de -détente -et -de -coopération -entre -les -* -états -et -les -* -communautés -du -Moyen -- -Orient -; -_ -pour -l -' -organisation -d -' -une -véritable -sécurité -collective -entre -tous -les -* -états -d -' -Europe -sans -distinction -de -régime -politique -. -la -CGT -soutient -les -diverses -initiatives -qui -tendent -à -créer -sur -notre -continent -un -véritable -climat -de -coexistence -pacifique -. -elle -souhaite -que -rapidement -soient -menés -à -bien -les -travaux -de -la -* -conférence -européenne -de -sécurité -et -de -coopération -; -_ -pour -la -liquidation -totale -du -colonialisme -et -pour -la -condamnation -de -toute -politique -néo -- -colonialiste -tendant -à -maintenir -sous -la -dépendance -du -système -capitaliste -de -nombreux -pays -, -particulièrement -en -ce -qui -concerne -l -' -exploitation -de -leur -richesse -nationale -. -la -CGT -soutient -l -' -action -des -peuples -concernés -pour -la -libre -disposition -et -la -mise -en -valeur -de -leurs -richesses -naturelles -, -leur -commercialisation -et -leur -utilisation -. -elle -dénonce -la -politique -de -l -' -impérialisme -qui -vise -à -maintenir -de -nombreux -pays -dans -des -zones -de -dépendance -économique -et -politique -portant -ainsi -entrave -à -la -lutte -pour -une -véritable -indépendance -nationale -. -§ -la -CGT -s -' -est -félicitée -et -a -salué -les -succès -des -forces -démocratiques -au -Portugal -et -la -liquidation -du -régime -fasciste -en -Grèce -. -elle -est -solidaire -et -apporte -un -appui -sans -réserve -à -la -lutte -des -travailleurs -et -du -* -peuple -d -' -Espagne -pour -un -changement -radical -de -régime -, -pour -l -' -amnistie -, -pour -la -démocratie -et -la -liquidation -du -franquisme -. -§ -de -même -, -elle -continuera -d -' -être -aux -côtés -des -peuples -d -' -Afrique -du -Sud -, -de -Zimbabwe -, -de -Namibie -dont -l -' -action -est -renforcée -par -les -succès -anticolonialistes -arrachés -par -les -peuples -de -Guinée -- -Bissau -, -d -' -Angola -et -du -Mozambique -. -§ -la -CGT -, -en -dénonçant -les -interventions -répétées -des -USA -et -, -plus -précisément -d -' -organismes -comme -la -CIA -en -Amérique -latine -, -affirme -sa -solidarité -aux -travailleurs -et -aux -peuples -de -cette -région -du -monde -. -elle -développera -avec -plus -de -force -le -soutien -et -l -' -aide -aux -travailleurs -et -au -peuple -du -Chili -, -dans -leur -détermination -pour -la -liquidation -de -la -junte -fasciste -et -le -rétablissement -des -libertés -démocratiques -dans -leur -pays -. -§ -les -récentes -luttes -dans -les -pays -dits -départements -d -' -Outre -- -Mer -ont -posé -avec -force -la -nécessité -du -changement -des -rapports -entre -la -France -et -ces -pays -. -la -CGT -soutient -leurs -revendications -nationales -et -leur -demande -légitime -d -' -accéder -à -un -statut -d -' -autonomie -. -§ -face -au -développement -des -sociétés -multinationales -la -CGT -considère -que -chaque -pays -a -le -droit -$ -: -_ -de -prendre -des -mesures -pour -que -les -sociétés -multinationales -investissent -leurs -bénéfices -dans -le -pays -où -ils -ont -été -obtenus -; -_ -d -' -orienter -les -investissements -d -' -origine -extérieure -vers -tel -ou -tel -secteur -ou -vers -telle -ou -telle -région -, -suivant -les -nécessités -de -son -développement -; -_ -d -' -instaurer -un -contrôle -public -et -démocratique -des -importations -et -exportations -de -capitaux -; -_ -de -nationaliser -les -entreprises -implantées -sur -son -territoire -et -de -disposer -librement -de -ses -ressources -nationales -afin -de -créer -ou -d -' -assurer -les -bases -d -' -un -développement -indépendant -et -d -' -une -coopération -internationale -fondée -sur -les -avantages -mutuels -. -§ -s -' -appuyant -sur -le -soutien -des -travailleurs -, -la -CGT -agit -pour -la -reconnaissance -et -la -pleine -application -de -ces -principes -par -les -gouvernements -, -les -groupements -interétatiques -et -les -organisations -internationales -( -ONU -, -OIT -, -etc -) -. -elle -considère -que -les -politiques -communes -et -les -mesures -arrêtées -au -niveau -de -la -CEE -doivent -respecter -les -principes -énoncés -ci -- -dessus -. -§ -pour -assurer -la -défense -des -intérêts -des -travailleurs -, -face -à -l -' -internationalisation -du -capital -et -de -la -production -, -la -CGT -exige -également -des -mesures -économiques -, -à -savoir -$ -: -_ -les -organisations -syndicales -doivent -avoir -le -droit -et -les -moyens -de -discuter -avec -la -direction -des -entreprises -multinationales -des -problèmes -qui -se -posent -à -l -' -ensemble -des -travailleurs -d -' -une -même -société -( -ou -d -' -un -groupe -) -. -le -droit -de -négociations -collectives -internationales -pour -les -travailleurs -appartenant -à -des -groupes -économiques -multinationaux -, -sans -que -cela -affecte -le -plein -exercice -des -droits -syndicaux -au -niveau -de -chaque -entreprise -et -de -chaque -état -. -il -est -nécessaire -de -promouvoir -en -ce -domaine -, -une -réglementation -communautaire -. -aucune -négociation -, -à -un -niveau -international -, -ne -saurait -remettre -en -cause -les -avantages -acquis -, -ni -porter -atteinte -au -droit -de -négociations -des -syndicats -au -niveau -de -chaque -pays -. -_ -les -travailleurs -doivent -avoir -le -droit -effectif -et -les -moyens -de -participer -pleinement -aux -activités -syndicales -, -nationales -et -internationales -. -ils -doivent -disposer -pleinement -du -droit -de -grève -sans -restriction -d -' -aucune -sorte -. -les -organisations -internationales -et -groupements -interétatiques -( -OIT -, -CEE -, -etc -) -doivent -promouvoir -les -instruments -nécessaires -à -un -libre -exercice -du -droit -syndical -et -des -droits -sociaux -et -veiller -à -leur -application -. -_ -des -organismes -représentatifs -doivent -être -constitués -au -niveau -des -sociétés -multinationales -avec -droit -d -' -information -et -de -consultation -des -représentants -élus -des -travailleurs -et -des -organisations -syndicales -de -chaque -pays -, -sur -la -politique -sociale -, -la -gestion -économique -et -notamment -les -résultats -économiques -, -financiers -et -la -politique -d -' -investissement -menée -par -la -société -. -_ -pour -assurer -des -garanties -minimales -aux -travailleurs -en -relation -avec -les -problèmes -nouveaux -posés -par -le -développement -accéléré -des -sociétés -multinationales -, -il -est -nécessaire -de -donner -une -portée -plus -effective -et -un -champ -plus -large -aux -normes -internationales -du -travail -élaborées -par -l -' -OIT -. -_ -les -organisations -internationales -et -groupements -interétatiques -( -OIT -, -CEE -, -etc -) -doivent -promouvoir -les -instruments -nécessaires -à -un -libre -exercice -du -droit -syndical -à -l -' -extension -des -droits -sociaux -rendus -indispensables -par -le -développement -des -sociétés -multinationales -et -veiller -à -leur -application -. -< -S10 -= -1 -> -le -marché -commun -. -. -< -S10 -= -0 -> -§ -favorable -à -une -coopération -englobant -tous -les -pays -européens -, -y -compris -les -pays -socialistes -, -la -CGT -réaffirme -son -opposition -à -la -division -actuelle -de -l -' -Europe -. -§ -la -CGT -tient -compte -de -la -réalité -que -représente -le -* -marché -commun -, -mais -elle -considère -que -l -' -intérêt -national -est -d -' -assurer -un -meilleur -équilibre -et -une -croissance -plus -saine -de -ses -échanges -, -ce -qui -exige -que -ses -relations -économiques -, -techniques -et -scientifiques -s -' -établissent -avec -tous -les -pays -et -soient -réellement -fondées -sur -la -base -de -l -' -avantage -réciproque -. -§ -assujetties -aux -plus -puissants -monopoles -, -les -politiques -communautaires -visent -au -renforcement -de -la -domination -des -grandes -féodalités -économiques -et -financières -, -s -' -opposent -à -la -maîtrise -de -l -' -économie -nationale -et -comportent -des -atteintes -et -des -risques -pour -l -' -indépendance -nationale -. -§ -face -au -* -marché -commun -qui -a -favorisé -un -tel -renforcement -et -accentué -les -déséquilibres -sectoriels -et -régionaux -mais -s -' -est -avéré -incapable -d -' -instaurer -une -politique -sociale -prenant -en -compte -les -intérêts -des -travailleurs -, -la -CGT -agit -pour -l -' -action -commune -des -travailleurs -et -des -organisations -syndicales -d -' -Europe -. -§ -les -revendications -et -les -réformes -à -partir -desquelles -l -' -unité -d -' -action -doit -se -réaliser -sont -nombreuses -. -elles -concernent -notamment -$ -: -_ -s -' -agissant -des -revendications -à -avancer -$ -: -_ -la -garantie -et -la -progression -du -pouvoir -d -' -achat -des -salaires -, -retraites -, -pensions -et -allocations -; -ce -qui -suppose -des -mesures -concrètes -de -nature -à -juguler -la -hausse -des -prix -et -l -' -inflation -; -_ -la -sécurité -de -l -' -emploi -et -la -garantie -des -revenus -; -_ -la -réduction -de -la -durée -du -travail -; -_ -l -' -allongement -du -temps -de -congés -payés -; -_ -l -' -amélioration -des -conditions -de -travail -, -de -la -protection -de -l -' -hygiène -et -de -la -sécurité -du -travail -, -en -général -de -la -qualité -de -la -vie -essentiellement -dans -les -grandes -concentrations -urbaines -et -industrielles -; -_ -l -' -extension -des -libertés -syndicales -et -des -droits -démocratiques -des -travailleurs -dans -les -entreprises -ou -dans -la -vie -publique -; -_ -l -' -abolition -de -toute -forme -de -discrimination -entre -femmes -et -hommes -, -jeunes -et -adultes -; -_ -l -' -égalité -des -droits -dans -tous -les -domaines -pour -les -travailleurs -immigrés -des -pays -membres -et -des -pays -tiers -; -_ -une -véritable -formation -professionnelle -et -continue -en -rapport -avec -les -conditions -actuelles -; -_ -la -mise -en -oeuvre -d -' -une -politique -progressiste -dans -les -domaines -de -la -sécurité -sociale -, -de -la -santé -, -des -prestations -familiales -, -de -la -retraite -( -sous -le -double -aspect -de -l -' -âge -et -des -ressources -garanties -) -. -_ -s -' -agissant -des -réformes -à -proposer -$ -: -_ -de -convenir -d -' -objectifs -communs -à -atteindre -dans -le -domaine -de -la -démocratisation -des -* -institutions -communautaires -; -_ -de -présenter -et -de -soutenir -ensemble -des -propositions -concrètes -de -nature -à -faire -échec -à -l -' -activité -dominatrice -des -firmes -multinationales -et -dans -l -' -immédiat -, -compte -tenu -de -la -situation -énergétique -, -de -soumettre -le -cartel -international -du -pétrole -à -de -strictes -mesures -de -contrôle -conformément -à -l -' -intérêt -général -; -_ -de -favoriser -les -échanges -commerciaux -, -économiques -, -scientifiques -et -culturels -entre -* -états -; -_ -de -stimuler -la -coopération -, -notamment -dans -l -' -informatique -, -l -' -aéronautique -et -le -nucléaire -, -de -telle -façon -que -prédominent -les -intérêts -généraux -, -ce -qui -implique -la -mise -en -cause -de -l -' -utilisation -des -fonds -publics -pour -le -financement -de -sociétés -privées -; -_ -de -soutenir -d -' -un -commun -accord -l -' -idée -de -nouvelles -relations -entre -les -pays -de -l -' -Europe -et -les -pays -en -voie -de -développement -sans -que -ces -relations -puissent -gêner -en -aucune -façon -les -relations -bilatérales -; -_ -de -contribuer -ensemble -à -la -détente -, -à -la -sécurité -collective -et -à -la -coexistence -pacifique -des -pays -d -' -Europe -de -systèmes -économiques -et -sociaux -différents -. -§ -il -s -' -agit -d -' -un -ensemble -de -revendications -urgentes -et -cohérentes -qui -peuvent -être -prises -en -compte -par -le -mouvement -syndical -au -niveau -de -la -CEE -et -qui -s -' -inscriventdans -le -développement -des -luttes -de -la -classe -ouvrière -en -Europe -occidentale -. -la -défense -de -ces -revendications -exige -une -coopération -accrue -et -l -' -action -unie -des -syndicats -de -l -' -ensemble -des -pays -de -la -* -communauté -. -< -S00 -= -02 -> -< -S01 -= -003 -> -< -S02 -= -001 -> -< -S03 -= -005 -> -< -Sda -= -1975 -> -< -Sdm -= -06 -> -< -Sat -= -0 -> -< -S10 -= -1 -> -la -CGT -poursuit -son -action -pour -une -démocratie -économique -et -politique -et -pour -le -socialisme -. -. -< -S10 -= -0 -> -§ -accentuant -tous -ses -effets -nocifs -, -la -crise -qui -s -' -approfondit -rend -plus -que -jamais -nécessaire -de -promouvoir -un -type -de -développement -économique -et -social -reposant -sur -une -large -participation -des -travailleurs -et -des -masses -populaires -et -apportant -une -réponse -véritable -à -leurs -besoins -. -§ -pour -réaliser -des -changements -réellement -novateurs -dans -le -domaine -économique -, -politique -et -social -correspondant -à -l -' -intérêt -national -, -à -celui -des -travailleurs -et -des -grandes -masses -de -la -population -, -il -est -urgent -et -indispensable -d -' -imposer -des -solutions -d -' -un -contenu -fermement -dirigé -contre -la -domination -des -monopoles -. -§ -la -CGT -a -longuement -déployé -tous -ses -efforts -pour -que -se -réalise -l -' -alliance -des -forces -de -gauche -sur -une -telle -base -. -§ -elle -s -' -est -félicitée -de -la -conclusion -du -* -programme -commun -de -gouvernement -entre -le -PCF -, -le -PS -et -le -mouvement -des -* -radicaux -de -gauche -qui -a -ouvert -les -perspectives -d -' -une -démocratie -économique -et -politique -réellement -nouvelle -, -permettant -de -retirer -aux -monopoles -les -moyens -de -leur -puissance -, -de -maîtriser -des -leviers -de -commande -essentiels -de -l -' -économie -et -de -les -remettre -à -la -* -nation -et -d -' -assurer -ainsi -la -mise -en -oeuvre -des -mesures -sociales -hardies -répondant -aux -revendications -des -travailleurs -. -§ -la -CGT -a -apporté -et -elle -apporte -au -* -programme -commun -, -son -plein -soutien -. -par -ses -dispositions -fondamentales -, -il -correspond -, -en -effet -, -aux -objectifs -élaborés -par -les -instances -de -la -CGT -et -définis -à -partir -de -ses -propres -préoccupations -syndicales -. -§ -ces -dispositions -fondamentales -du -* -programme -commun -sont -rendues -encore -plus -urgentes -pour -apporter -une -issue -positive -à -la -crise -et -elles -constituent -la -base -indispensable -à -la -réalisation -d -' -un -changement -profond -et -durable -qui -soit -réellement -novateur -. -à -partir -de -ces -dispositions -fondamentales -, -il -est -possible -de -le -perfectionner -et -de -l -' -enrichir -encore -, -ainsi -que -d -' -actualiserses -dispositions -conjoncturelles -. -§ -assurer -la -satisfaction -des -revendications -populaires -, -fonder -le -développement -économique -sur -le -progrès -social -, -établir -un -cadre -institutionnel -démocratique -dans -lequel -les -masses -populaires -et -avant -tout -la -classe -ouvrière -pourront -exercer -leur -influence -, -c -' -est -l -' -objectif -de -la -démocratie -économique -et -politique -dont -le -contenu -et -les -moyens -ont -été -précisés -par -les -précédents -congrès -de -la -CGT -. -§ -le -39ème -* -congrès -confédéral -rappelle -les -mesures -essentielles -, -qui -sont -indispensables -pour -promouvoir -un -autre -type -de -développement -économique -et -social -et -qui -sont -maintenant -substantiellement -prises -en -compte -dans -le -* -programme -commun -. -< -S10 -= -1 -> -démocratie -économique -. -. -< -S10 -= -0 -> -§ -les -changements -à -promouvoir -visent -à -dégager -les -moyens -indispensables -pour -répondre -aux -revendications -des -travailleurs -et -à -faire -de -la -politique -sociale -un -facteur -de -plus -en -plus -essentiel -du -développement -économique -. -les -mesures -déterminantes -à -mettre -en -oeuvre -sont -: -< -S10 -= -1 -> -la -nationalisation -démocratique -. -. -< -S10 -= -0 -> -§ -la -maîtrise -des -instruments -décisifs -du -développement -économique -doit -être -donnée -à -la -* -nation -. -ce -qui -exige -que -les -grands -moyens -de -production -et -de -contrôle -du -crédit -soient -soustraits -à -l -' -emprise -des -féodalités -économiques -et -financières -. -§ -c -' -est -pourquoi -la -CGT -s -' -est -prononcée -pour -la -nationalisation -démocratique -des -secteurs -clés -du -crédit -, -des -banques -et -des -compagnies -d -' -assurances -, -de -la -sidérurgie -, -de -l -' -industrie -du -pétrole -et -de -l -' -énergie -atomique -, -dans -toutes -ses -composantes -des -groupes -dominants -de -l -' -électronique -, -de -la -grande -industrie -chimique -et -pharmaceutique -, -de -la -construction -des -grands -moyens -d -' -équipement -, -des -industries -aéronautiques -, -aérospatiales -, -d -' -armement -, -de -la -construction -automobile -et -de -la -marine -marchande -. -< -S10 -= -1 -> -la -gestion -démocratique -. -. -< -S10 -= -0 -> -§ -la -large -et -effective -participation -des -travailleurs -et -des -organisations -syndicales -à -la -gestion -des -entreprises -publiques -et -nationalisées -, -constitue -un -élément -décisif -pour -assurer -leur -pleine -efficacité -économique -et -pour -répondre -aux -besoins -des -travailleurs -et -des -masses -populaires -. -elle -répond -pleinement -aux -aspirations -légitimes -des -travailleurs -à -participer -à -l -' -orientation -, -à -la -gestion -et -au -contrôle -des -entreprises -nationalisées -. -§ -assurant -leur -intervention -active -dans -la -détermination -des -objectifs -économiques -de -la -politique -sociale -de -l -' -entreprisenationalisée -, -la -gestion -démocratique -est -une -condition -primordiale -de -la -démocratie -économique -. -§ -en -ce -domaine -, -le -37ème -* -congrès -de -la -CGT -et -ultérieurement -le -document -de -" -réflexions -et -de -propositions -de -la -CGT -sur -la -gestion -démocratique -dans -les -entreprises -" -, -ont -précisé -, -de -manière -détaillée -, -les -mesures -à -mettre -en -oeuvre -pour -assurer -et -garantir -le -caractère -pleinement -démocratique -de -la -gestion -des -entreprises -nationalisées -. -à -cet -effet -, -il -convient -essentiellement -de -promouvoir -$ -: -_ -de -larges -droits -pour -les -travailleurs -, -leurs -représentants -élus -et -les -organisations -syndicales -, -leur -donnant -les -moyens -d -' -exercer -un -contrôle -efficace -dans -l -' -orientation -, -la -conduite -et -le -contrôle -de -la -politique -générale -et -sociale -de -l -' -entreprise -. -ce -qui -requiert -des -prérogatives -étendues -comportant -le -droit -et -le -devoir -d -' -information -sur -la -politique -de -la -marche -de -l -' -entreprise -dans -tous -les -domaines -de -son -activité -; -ce -qui -nécessite -des -droits -suffisants -permettant -la -consultation -et -l -' -intervention -active -des -travailleurs -et -de -leurs -représentants -élus -et -la -création -des -instances -nécessaires -à -l -' -exercice -de -ces -droits -aux -divers -échelons -de -l -' -entreprise -. -un -statut -du -personnel -de -contenu -progressiste -, -élaboré -avec -les -organisations -syndicales -, -garantira -l -' -emploi -, -la -rémunération -, -les -droits -du -personnel -, -l -' -exercice -du -droit -syndical -et -des -droits -des -travailleurs -et -donnera -les -moyens -pour -qu -' -ils -participent -au -règlement -des -questions -relatives -aux -conditions -de -travail -sous -tous -leurs -aspects -; -_ -une -autonomie -effective -de -gestion -des -entreprises -nationalisées -dans -le -cadre -du -plan -et -leur -assurant -une -large -initiative -dans -les -divers -domaines -de -la -gestion -financière -, -technique -et -commerciale -et -de -la -politique -sociale -; -_ -une -pleine -et -entière -responsabilité -du -* -conseil -d -' -administrationqui -aura -notamment -dans -ses -attributions -la -nomination -du -personnel -de -direction -; -_ -une -composition -démocratique -de -ce -* -conseil -d -' -administrationcomprenant -des -représentants -du -pouvoir -central -, -des -représentants -syndicaux -élus -par -les -travailleurs -, -des -représentants -de -certaines -catégories -d -' -usagers -et -des -collectivités -locales -ou -territoriales -. -< -S10 -= -1 -> -une -planification -démocratique -. -. -< -S10 -= -0 -> -§ -la -nationalisation -des -secteurs -clés -, -la -maîtrise -des -moyens -d -' -action -économique -essentiels -de -l -' -* -état -par -un -pouvoir -démocratique -fondent -la -possibilité -de -promouvoir -une -planification -démocratique -. -cette -planification -est -indispensable -pour -permettre -un -développement -progressiste -d -' -ensemble -de -l -' -économie -pour -réaliser -sa -cohérence -, -pour -s -' -attaquer -aux -déséquilibres -engendrés -par -les -monopoles -et -pour -assurer -le -respect -des -objectifs -sociaux -et -pour -élever -d -' -une -manière -continuelle -le -niveau -et -les -conditions -de -vie -. -§ -en -matière -économique -, -la -planification -démocratique -est -le -complément -nécessaire -et -indispensable -de -la -nationalisation -démocratique -, -pour -réaliser -une -véritable -démocratie -économique -et -politique -à -l -' -échelle -de -la -* -nation -, -pour -assurer -la -cohérence -d -' -ensemble -du -développement -économique -, -pour -éliminer -les -disparités -et -distorsions -engendrées -par -les -monopoles -dans -le -domaine -économique -et -social -. -§ -la -participation -des -travailleurs -et -de -leurs -organisations -syndicales -à -l -' -élaboration -du -plan -, -au -contrôle -de -son -exécution -est -indispensable -et -constitue -une -condition -essentielle -de -son -contenu -réellement -démocratique -et -de -la -réalisation -des -objectifs -sociaux -qui -doivent -constituer -le -fondement -même -de -la -planification -démocratique -. -ce -qui -implique -à -tous -les -échelons -la -participation -des -organisations -syndicales -et -qu -' -elles -disposent -des -informations -les -plus -complètes -. -la -participation -démocratique -des -travailleurs -et -de -leurs -organisations -syndicales -s -' -exercera -à -l -' -échelon -national -dans -les -grandes -entreprises -nationalisées -, -mais -également -au -plan -régional -, -départemental -, -et -municipal -ainsi -que -dans -les -institutions -de -recherche -et -d -' -enseignement -. -les -attributions -des -diverses -instances -de -la -planification -devront -être -définies -démocratiquement -, -assurer -une -représentation -satisfaisante -des -travailleurs -et -prévoir -les -droits -et -moyens -leur -permettant -d -' -assumer -pleinement -leur -rôle -. -§ -l -' -élaboration -du -plan -, -son -adoption -et -le -contrôle -de -son -exécution -devront -constituer -une -attribution -essentielle -de -l -' -* -assemblée -nationale -. -§ -la -démocratisation -de -l -' -économie -est -inséparable -de -l -' -élargissement -des -droits -en -matière -économique -des -comités -d -' -entreprise -et -des -organismes -similaires -tant -dans -les -entreprises -nationalisées -, -les -administrations -que -dans -les -entreprises -privées -. -dans -ces -dernières -, -l -' -extension -des -attributions -des -comités -d -' -entreprise -devra -leur -permettre -de -contrôler -que -l -' -activité -de -l -' -entreprise -est -conforme -aux -options -du -plan -démocratique -et -respecte -la -politique -économique -assurant -sa -mise -en -oeuvre -, -notamment -dans -le -domaine -des -prix -, -du -crédit -et -de -la -fiscalité -. -< -S10 -= -1 -> -démocratie -politique -. -. -< -S10 -= -0 -> -§ -démocratie -économique -et -démocratie -politique -sont -étroitement -liées -et -complémentaires -. -s -' -attaquer -à -la -domination -des -monopoles -, -mettre -en -oeuvre -les -changements -structurels -indispensables -, -satisfaire -les -revendications -des -travailleurs -nécessitent -un -pouvoir -politique -d -' -origine -et -d -' -orientation -démocratique -et -des -changements -institutionnels -correspondants -. -§ -ceci -exige -conjointement -$ -: -_ -un -cadre -institutionnel -démocratique -, -ce -qui -suppose -l -' -abrogationde -toutes -les -dispositions -sur -lesquelles -se -fonde -le -pouvoir -personnel -; -_ -la -séparation -et -l -' -équilibre -des -pouvoirs -issus -du -suffrage -universel -; -_ -une -extension -des -libertés -fondamentales -et -leurs -garanties -tant -en -ce -qui -concerne -les -libertés -collectives -qu -' -individuelles -; -ce -qui -implique -$ -: -_ -la -garantie -du -droit -de -grève -, -de -manifestation -et -de -réunion -; -_ -la -garantie -du -droit -d -' -association -et -pour -les -partis -et -groupements -politiques -, -la -garantie -de -pouvoir -se -former -librement -et -de -déployer -leur -activité -dans -le -respect -de -la -légalité -; -_ -la -liberté -de -la -presse -et -un -droit -à -l -' -information -assurant -notamment -l -' -attribution -d -' -un -temps -d -' -antenne -régulier -aux -grandes -centrales -syndicales -; -_ -le -renforcement -de -la -protection -des -libertés -individuelles -et -des -droits -du -citoyen -. -< -S10 -= -1 -> -rassemblement -populaire -pour -la -victoire -du -programme -commun -. -. -< -S10 -= -0 -> -§ -la -CGT -a -engagé -toutes -ses -forces -dans -la -lutte -pour -la -démocratie -économique -et -politique -. -le -soutien -massif -que -le -peuple -de -France -a -apporté -au -* -programme -commun -lors -de -l -' -élection -présidentielle -, -le -grand -espoir -soulevé -par -la -possibilité -de -voir -accéder -la -gauche -au -pouvoir -pour -y -appliquer -son -programme -, -créant -une -situation -nouvelle -, -favorable -pour -gagner -des -millions -de -consciences -nouvelles -à -la -nécessité -du -changement -démocratique -. -§ -dans -ces -conditions -nouvelles -, -la -CGT -poursuivra -inlassablement -son -action -pour -une -démocratie -économique -et -politique -. -elle -déploiera -tous -ses -efforts -pour -développer -l -' -action -commune -sur -des -buts -concrets -et -promouvoir -le -grand -rassemblement -populaire -, -indispensable -à -la -victoire -du -* -programme -commun -. -§ -la -CGT -développera -son -activité -pour -s -' -opposer -à -toutes -les -tentatives -et -manoeuvres -que -développe -et -que -multipliera -la -bourgeoisie -pour -tenter -de -dissocierl -' -alliance -de -la -gauche -et -surtout -pour -s -' -efforcer -de -la -vider -de -son -contenu -antimonopoliste -. -< -S10 -= -1 -> -les -perspectives -du -socialisme -pour -la -France -. -. -< -S10 -= -0 -> -§ -le -régime -capitaliste -fait -apparaître -d -' -une -manière -aiguë -et -massive -, -ses -tares -et -ses -absurdités -, -son -incapacité -profonde -à -résoudre -les -problèmes -fondamentaux -de -notre -époque -. -§ -le -socialisme -représente -l -' -avenir -de -notre -société -. -son -idée -progresse -dans -les -consciences -et -prend -un -caractère -de -masse -. -§ -dès -sa -fondation -, -la -CGT -s -' -est -assignée -de -transformer -la -société -capitaliste -en -mettant -un -terme -à -l -' -exploitation -capitaliste -. -son -37ème -* -congrès -a -encore -précisé -ce -but -dans -les -statuts -. -le -socialisme -est -le -système -économique -et -social -où -l -' -exploitation -de -l -' -homme -par -l -' -homme -est -bannie -. -son -but -est -de -répondre -aux -besoins -matériels -et -intellectuels -grandissants -des -travailleurs -et -du -peuple -, -de -créer -les -conditions -susceptibles -de -libérer -l -' -homme -de -toutes -les -oppressions -économiques -, -sociales -et -culturelles -et -de -permettre -l -' -épanouissement -complet -de -ses -facultés -et -de -sa -personnalité -. -§ -la -CGT -estime -que -la -définition -des -voies -et -moyens -pour -parvenir -au -socialisme -en -France -, -ainsi -que -des -mécanismes -, -organes -, -institutions -et -modalités -de -la -gestion -et -de -la -vie -sociale -qui -sont -à -promouvoir -pour -son -édification -, -doivent -être -l -' -oeuvre -commune -des -formations -politiques -et -syndicats -intéressés -. -§ -pour -sa -part -, -elle -est -prête -, -en -tant -qu -' -organisation -de -classe -la -plus -intéressée -à -l -' -instauration -du -socialisme -, -à -y -contribuer -dans -le -respect -de -son -caractère -d -' -organisation -de -masse -et -avec -ses -vues -propres -résultant -de -sa -spécificité -d -' -organisation -syndicale -. -§ -le -document -" -thèmes -de -réflexion -sur -les -perspectives -du -socialisme -pour -la -France -et -le -rôle -des -syndicats -" -a -exposé -les -principales -idées -communes -aux -organisations -de -la -CGT -. -sa -discussion -a -conduit -à -une -large -approbation -de -son -contenu -par -les -organisations -de -la -CGT -et -par -les -travailleurs -. -il -conserve -pleinement -sa -valeur -. -§ -les -réflexions -exposées -dans -ce -document -constituent -la -base -commune -aux -organisations -de -la -CGT -pour -la -poursuite -de -la -réflexion -et -de -la -discussion -tant -avec -les -travailleurs -qu -' -avec -les -forces -intéressées -à -ce -but -et -pour -laquelle -la -CGT -demeure -disponible -. -§ -elles -constituent -la -base -de -sa -contribution -à -la -nécessaire -élaboration -de -positions -communes -rassemblant -les -forces -qui -luttent -pour -le -socialisme -. -§ -en -même -temps -qu -' -elle -engage -toutes -ses -forces -dans -la -lutte -pour -la -démocratie -économique -et -politique -afin -de -réaliser -les -changements -qu -' -il -est -urgent -d -' -apporter -à -la -société -, -la -CGT -agit -pour -gagner -toujours -plus -de -travailleurs -à -l -' -objectif -du -socialisme -et -pour -que -mûrissent -les -conditions -susceptibles -d -' -en -rapprocher -le -terme -pour -notre -pays -. diff --git a/Rlib/textometrieR/cgt75.txt b/Rlib/textometrieR/cgt75.txt deleted file mode 100644 index 10e591b..0000000 --- a/Rlib/textometrieR/cgt75.txt +++ /dev/null @@ -1,4412 +0,0 @@ - - - - - - - - - document d'orientation de la CGT .. - - § deux données essentielles caractérisent la situation, - déterminent le comportement des diverses forces sociales - et politiques et situent par conséquent les conditions - de l'action syndicale $: - _l'aggravation de la crise qui affecte l'économie et la vie - du pays; - _la montée de la volonté de changement et les - perspectives qu'offre l'union de la gauche sur la base - de son *programme commun de gouvernement . - § dans sa manifestation la plus immédiate et la plus - sensible aux travailleurs la crise se traduit par de - sérieuses atteintes au pouvoir d'achat de leurs salaires, - retraites et prestations sociales,par la montée du chômage, - l'aggravation de leurs conditions de travail et d'existence. - § mais la dimension de cette crise est plus vaste.elle - affecte _ les précédents *congrès de la CGT l'ont déjà - souligné _ l'ensemble de la vie du pays,sous tous ses - aspects essentiels $: économique,social,politique,culturel, - moral. - § elle met en cause les fondements de la société capitaliste - et pose la nécessité de transformations profondes touchant - aux structures économiques et sociales de la société. - § c'est dans ce contexte de crise profonde et durable de - l'ensemble des grands pays capitalistes que se situe - l'aggravation de la situation économique.elle se manifeste - par une poussée beaucoup plus forte d'une inflation depuis - longtemps permanente. cette inflation se combine avec une - montée considérable du chômage et un déclin du - développement économique.il est faux d'attribuer cette - situation au prix du pétrole et des matières premières. - § la récession de 1974-1975 est la plus forte que les - économies capitalistes aient connu depuis la deuxième - guerre mondiale. - § il ne s'agit pas seulement d'une période défavorable - accentuée,mais d'un dérèglement durable en profondeur de - l'économie capitaliste qui est le fond de la crise. - § le dérèglement en profondeur de l'économie capitaliste - mondiale est à la base de la crise.il résulte de l'exploitation -et de la course au profit poussées jusqu'à - leurs limites dans tous les pays où l'*état est - l'instrument des grandes sociétés capitalistes.parmi - ces pays,les Etats-Unis occupent une position dominante, - et l'économie américaine pèse d'un poids déterminant. - § l'accumulation des profits extraordinaires réalisés - par les grandes sociétés,les moyens employés pour - maintenir ces profits et les accroître,même au prix - d'énormes gaspillages,la militarisation de l'économie, - en particulier aux USA,sont à l'origine de l'inflation, - de la crise du système monétaire et des relations - économiques des pays capitalistes ainsi que de tous les - désordres économiques qui les accompagnent. - § la place prépondérante des sociétés multinationales - dans l'ensemble du monde capitaliste et dans les pays - en voie de développement,leurs dimensions,la nature - de leurs activités en font l'un des principaux facteurs - des perturbations économiques,un danger pour les travailleurs, - pour l'indépendance des peuples et les droits des *états . - § cette malfaisance s'exerce également en Europe - occidentale et particulièrement au sein du marché commun. - l'ensemble des phénomènes de crise s'y manifestent. - les sociétés multinationales y sont pour les deux tiers sous - la domination des groupes financiers et industriels - américains,en particulier dans les secteurs de pointe. - § elles assoient leur emprise avec l'appui des gouvernements - qui facilitent l'interpénétration des capitaux publics - et privés au profit de ces derniers. - § les contradictions s'aiguisent au sein du *marché commun - alors que le capital ouest-allemand y joue le rôle principal - et que se renforce la dépendance à l'égard des USA. - § les abandons de souveraineté opérés par le *pouvoir - portent gravement préjudice à l'indépendance nationale - de la France menacée par les projets de supranationalité - et replacée pratiquement dans le giron atlantique. - la volonté d'unification des politiques économiques et - sociales vise à renforcer le front des patrons et des - gouvernements contre les travailleurs de ces pays. - § en France ,la crise a les mêmes causes profondes que - dans les autres pays capitalistes.l'économie est dominée - par un petit nombre de groupes financiers géants qui - augmentent leurs richesses et leur puissance au détriment - des travailleurs et du pays.la politique menée depuis des - années,avec pour but essentiel leurs profits et le - renforcement de leurs positions à l'échelle nationale - et internationale,a plongé le pays dans la crise. - § la politique d'austérité imposée par le gouvernement - sous prétexte d'endiguer la crise ne s'attaque pas à - l'inflation qui est source de profits accrus.elle l'entretient -et augmente le chômage. - § les promesses gouvernementales d'amélioration de la - situation économique sont contredites par la réalité. - § les milliards distribués sous prétexte de relance gonflent - les profits et alimentent l'inflation. - § l'orientation prévue pour le *7ème plan est une - prolongation de la politique d'austérité.elle ne peut assurer - le taux de croissance mensongèrement affiché.elle vise à - diminuer brutalement le pouvoir d'achat par une politique - des revenus.le nombre de chômeurs,déjà égal à 1200000 au - début de 1975,risque sérieusement d'augmenter encore dans - une forte proportion. - § le *pouvoir des féodalités capitalistes ne peut combattre - efficacement ni l'inflation,ni le chômage.loin de s'attaquer -à leurs causes réelles,il veut faire supporter - les frais de la crise aux travailleurs et saisir cette - occasion pour accélérer la concentration capitaliste, - l'élimination d'entreprises petites,moyennes et parfois - grandes.le "redéploiement de l'industrie" consiste - principalement à mettre les ressources du pays et les - moyens de financement et d'action économiques de l'*état - à la disposition des groupes industriels et financiers - susceptibles d'atteindre la dimension multinationale. - § le budget,la fiscalité,la politique du crédit,la politique - des prix,la politique de tarifs et de transferts d'activités - bénéficiaires des services publics et des entreprises - nationalisées vers le secteur privé,tous les moyens sont - mis en oeuvre par le *pouvoir pour répondre aux - exigences des principaux groupes capitalistes. - § le *pouvoir giscardien pousse plus avant l'interpénétration - et la conjonction des moyens de l'*état et des monopoles, - au service de ces derniers,c'est-à-dire le capitalisme - monopoliste d'*état . - § pour cette raison il ne peut qu'aggraver la crise qui mine - la société française. - § la confiscation,par une minorité toujours plus restreinte - et plus puissante des richesses du travail du plus grand - nombre et des moyens de la direction de l'économie conduit - aux aberrations les plus choquantes $: la baisse du niveau - de vie des travailleurs et le chômage,l'énormité des - gaspillages des forces humaines et matérielles,le - sacrifice des équipements collectifs,les injustices de - toutes sortes. - § face au bilan désastreux d'un système condamné,une - puissante force de transformation a grandi et s'est mise - en mouvement.la résistance des travailleurs s'est renforcée, - leur pression revendicative s'est exprimée par la montée - des luttes sociales.la signature du *programme commun de - gouvernement entre le *parti communiste ,le *parti - socialiste et le *mouvement des radicaux de gauche , - avec le soutien de la CGT a constitué un tournant. - § en se prononçant pour la réalisation de ce programme, - lors de l'élection présidentielle de mai 1974,plus de - 49% des électeurs ont démontré que le changement véritable, - fondé sur des réformes profondes est possible,qu'il peut - devenir la volonté majoritaire du peuple. - § cette situation crée un nouveau rapport de force dans - le pays. - § les travailleurs y puisent un grand espoir,une plus - grande confiance en leurs forces. - § ils y trouvent des conditions plus favorables pour leurs - luttes revendicatives,pour défendre avec succès leurs - intérêts les plus urgents,obtenir certains résultats, - mettre en échec certaines mesures antisociales.le *pouvoir - et le *patronat doivent en tenir compte. - § dans cette situation des possibilités nouvelles existent - pour gagner de nouvelles forces,de nouvelles couches - aux luttes immédiates et à l'idée des changements qui - seuls sont de nature à permettre la solution effective - et durable des grands problèmes posés à la société. - § mais leur attitude est également dictée par l'étroitesse - de la marge d'action dont ils disposent. - § d'une part,le maintien et l'accroissement des profits - des grandes sociétés dans le contexte de la crise économique - exigent une politique aux conséquences sociales aggravées.d'autre -part,toute concession aux revendications démontre - qu'il est possible de les satisfaire et qu'une autre - politique peut être mise en oeuvre. - § *pouvoir et *patronat s'efforcent donc,dans ces - nouvelles conditions,de s'adapter pour maintenir une - résistance acharnée aux revendications,poursuivre et - aggraver leur politique.ils s'efforcent également de - contrarier par tous les moyens l'évolution des masses - populaires vers l'idée du changement. - § c'est dans cet ensemble de circonstances qu'il convient - de définir les positions,les tâches et l'action de la CGT. - - l'action revendicative et l'unité d'action syndicale .. - - § le *patronat et le *gouvernement giscardien s'efforcent - de mettre à profit la situation économique dont ils sont - responsables pour comprimer le pouvoir d'achat des salaires, - faire admettre le chômage,les fermetures d'entreprises, - les licenciements,pour aggraver les conditions de travail, - alourdir les impôts payés par les salariés,déprécier - les prestations sociales et familiales,renforcer l'exploitation -des travailleurs français et immigrés. - § pour y parvenir ils usent de tous les moyens dont ils - peuvent disposer $: - _l'intransigeance globale dans toutes les négociations - et le détournement d'une véritable politique contractuelle - par la conclusion avec des organisations minoritaires, - d'accords de collaboration à la politique d'austérité; - _la démagogie sous ses diverses variantes,plus ou moins - renouvelées en dernier lieu le thème de la "réforme - de l'entreprise",pour tenter inlassablement de détourner - les travailleurs des réalités sociales et de la défense - de leurs intérêts de classe ; - _la tentative de domestiquer toute l'information et la - mise en oeuvre des moyens énormes de pression idéologique - pour faire admettre l'inéluctabilité de la crise et de - l'austérité,jouer de l'inquiétude pour l'emploi,et - dénaturer la lutte de la CGT et de toutes les forces - démocratiques; - _l'extension des méthodes plus perfectionnées d'exploitation - sous couvert d'une prétendue participation ou d'une - organisation différente du travail; - _la division entre travailleurs de diverses catégories; - _la tentative de mettre en selle la collaboration de classe - comme une institution permanente (accords séparés, - collusion dans les organismes paritaires,concertation - avec le gouvernement,utilisation abusive de l'information - officielle et de la formation professionnelle); - _l'attaque généralisée contre les libertés syndicales et le - droit de grève,les mesures de répression arbitraires et - illégales,l'emploi de la force policière,des milices privées - armées,contre les grévistes dans les entreprises. - § c'est aussi dans ce cadre qu'il faut placer le recours - par certains patrons,avec la complicité et le soutien - direct du pouvoir,à des syndicats maison,des officines - patronales comme la CFT,des entreprises de louage - d'hommes de main employant des méthodes fascistes. - § loin d'être un signe de force,ces pratiques sont un signe - des difficultés de la bourgeoisie. - § elles constituent néanmoins un grave danger pour les - libertés.elles s'inscrivent dans un processus de renforcement - du système autoritaire .c'est pourquoi elles doivent - recevoir les ripostes immédiates et énergiques qui - s'imposent,et susciter un grand mouvement de lutte pour - la démocratie. - § c'est dans ce cadre qu'il faut placer le recours,pour - une partie du patronat avec la complicité et parfois le - soutien direct des milieux du *pouvoir ,aux syndicats - maison CFT dont le caractère d'officine patronale et - les méthodes ont été dévoilés par la CGT. - § mais ils font un mauvais calcul en misant sur une - quelconque résignation des travailleurs.ils ne tiennent - pas compte du mécontentement accumulé ni de l'état d'esprit - né du progrès des forces de gauche,ni des conséquences - que tirent les travailleurs de toutes les injustices, - de tout ce qui témoigne de l'incapacité du système à - résoudre les problèmes sociaux les plus élémentaires. - § les luttes syndicales ont connu,en plusieurs occasions,des - périodes particulièrement intenses.elles ont mis en avant - des revendications d'une ampleur et d'une portée - nouvelles. - § depuis l'aggravation de la crise,bien des actions et - des grèves d'envergure ont témoigné,d'une combativité - parmi l'ensemble des travailleurs et particulièrement - dans la jeunesse,qu'il faut considérer comme l'indice - d'un état d'esprit significatif du monde du travail. - § toutes les manoeuvres,tous les procédés employés pour - détourner les salariés de la lutte sont voués à l'échec, - inadaptés aux conditions nouvelles,à condition de recevoir - la riposte appropriée. - § car il n'est pas vrai que la crise,le chômage,l'inflation - soient une fatalité $: ils sont un produit du système - capitaliste et de la domination des monopoles. - § il n'est pas vrai ,que l'austérité pour les travailleurs - soit inévitable. - § il n'est pas vrai,que le gouvernement s'attaque aux - inégalités sociales. - § il n'est pas vrai,que les mesures patronales et - giscardiennes soient les seules possibles. - § au contraire,même dans les conditions actuelles,il est - possible d'imposer d'autres mesures pour combattre - l'inflation et le chômage et d'engager l'action avec - l'immense majorité des travailleurs. - § c'est parce qu'ils le ressentent que les travailleurs - n'ont cessé de mener des luttes importantes.mieux ils en - auront conscience et plus énergiquement encore ils - défendront leurs intérêts,avec succès. - § le programme d'action soumis au 39ème *congrès précise - l'ensemble des objectifs revendicatifs essentiels de - la CGT pour la période à venir. - § parmi ces objectifs,il en est un certain nombre qui ont - un caractère d'urgence et une portée générale qui sont - à la base des luttes actuelles. - § dans le contexte de la crise économique,la défense - des conditions de vie et de travail par les revendications - syndicales est étroitement liée à l'action pour des mesures - économiques capables de combattre la crise et de - s'attaquer à ses causes afin d'assainir l'économie et - d'assurer son développement. - § les revendications concernent en particulier : - - les salaires .. - - _garantie du pouvoir d'achat pour tous par l'échelle - mobile et progression avec des différenciations allant - dans le sens d'une remise en ordre des systèmes de - rémunération; - _SMIC à 1700F par mois pour 40 heures hebdomadaires; - _relèvement des prestations sociales et familiales, - des pensions et retraites et allocations de chômage total - ou partiel. - - l'emploi .. - - _une politique de développement économique créatrice - d'emplois; - _le droit et les moyens de discuter du bien fondé des - décisions de licenciements et de fermetures d'entreprises - avec la possibilité d'instances de recours avec effet - suspensif; - _l'interdiction de tout licenciement sans reclassement - préalable équivalent. - § dans les conditions présentes,deux mesures longtemps - refusées prennent une importance et une urgence - particulières $: - _le droit à une retraite pleine à 60 ans pour les hommes - et à 55 ans pour les femmes,avec 75% des éléments du - salaire; - _la semaine de 40 heures en 5 jours partout,sans réduction - de salaire et dans les plus brefs délais. - - les conditions de travail - - exigent un ensemble de mesures pour $: - _limiter les cadences,embaucher en nombre suffisant, - _protéger la santé et la vie des travailleurs, - _élever l'intérêt,la responsabilité,la qualification - du travail avec des classifications et des salaires - correspondants, - _assurer des garanties d'accès à la formation et à la - promotion professionnelles. - - les libertés syndicales.. - - cessation immédiate des atteintes aux libertés - syndicales et au droit de grève et garanties légales - contre ces pratiques; - _sanctions judiciaires contre toutes les violations - de ces libertés et contre l'emploi de la force contre - les travailleurs; - _extension des libertés syndicales,des droits démocratiques - des travailleurs et des moyens attribués pour leur exercice - dans les entreprises et dans la vie publique. - - les discriminations de toutes sortes - - doivent être supprimées et toutes tentatives de les - maintenir sanctionnées. - - une véritable réforme de la fiscalité - - allégeant la charge des salariés et frappant le *capital . - - la sécurité sociale - - doit être rendue aux travailleurs et les mesures - consécutives à la politique de démantèlement poursuivie - par le *pouvoir et le *patronat doivent être abrogées. - § l'indexation des allocations ,rentes et pensions sur - la base d'un indice de prix négocié par les organisations - syndicales. - § les mesures économiques immédiatement nécessaires - visent principalement à assurer un développement - suffisant et équilibré de la production,combattre - l'inflation et la vie chère,sauvegarder l'emploi et - rééquilibrer les échanges.c'est pour atteindre ces buts - qu'elles doivent s'attaquer aux privilèges ,aux profits - et aux moyens de domination des grandes sociétés capitalistes. - § énoncées précisément dans le programme d'action du - 39ème *congrès ,elles comportent : - § contre l'inflation et la vie chère $: - _des réductions de TVA,le blocage temporaire de certains - prix et tarifs publics,la réduction et le contrôle des - bénéfices ainsi que la limitation du crédit pour les - grandes sociétés,la défense de l'épargne populaire. - § pour l'emploi $: - _une politique de développement créatrice d'emplois - fondée sur un solide marché intérieur développé, - notamment par l'amélioration du pouvoir d'achat,une - politique industrielle s'appuyant sur le secteur public, - un développement des équipements collectifs améliorant les - conditions d'existence,un développement régional réel. - § pour l'équilibre des échanges extérieurs $: - _un développement diversifié,vers tous les pays et - notamment les pays socialistes et du Tiers-Monde , - des échanges commerciaux et de la coopération technique - et scientifique en les fondant sur l'intérêt mutuel, - le contrôle des mouvements de capitaux et des investissements - étrangers en France . - § pour assurer les besoins en énergie $: - _des contrats de type nouveau avec les pays producteurs - de pétrole,l'arrêt immédiat des fermetures de puits de mine - et un plan d'augmentation de la production charbonnière, - l'utilisation de l'énergie hydraulique,marémotrice, - géothermique,la maîtrise technologique,la protection de - l'environnement et la garantie de l'approvisionnement - en combustible pour les centrales nucléaires,la - suppression des privilèges des sociétés pétrolières - et la nationalisation immédiate des groupes pétroliers - français,le développement de la recherche sur les - sources de l'avenir. - § ces revendications correspondent à des besoins impérieux - et justifiés.elles constituent des éléments importants - de réponse aux problèmes économiques et sociaux actuels - en favorisant l'emploi et la lutte contre l'inflation.elles - répondent à l'intérêt national. - § si le *pouvoir et le *patronat en tenaient compte, - des difficultés pourraient être atténuées. - § mais il faut s'attendre pour l'essentiel à une résistance - acharnée de leur part,car telle est leur nature de classe - et telles sont les exigences des intérêts du grand capital - monopoliste. - § l'action revendicative de masse est et sera nécessaire - pour obtenir chaque amélioration. - § la réduction du pouvoir d'achat des salaires,les pertes - dues à la réduction d'activité,le chômage total et partiel, - la misère qui gagne un grand nombre de foyers de - travailleurs,loin d'engendrer la résignation,se traduisent - par le mécontentement et la colère,et une conscience plus - élevée de la responsabilité de la politique du pouvoir. - § le patronat et le gouvernement poussent chaque conflit - à l'extrême tension. - § mais la tendance principale est constituée par la - combativité,l'endurance exceptionnelle des travailleurs, - le nombre et la durée des grèves en même temps que par la - recherche des méthodes d'action les plus efficaces,les - mieux adaptées. - § il est possible,par l'action,d'imposer des succès marquants - comme maints exemples l'ont déjà démontré. - § l'intransigeance gouvernementale et patronale conduit - à une montée des luttes sociales,susceptibles d'atteindre - une grande envergure. - § faire échec à la politique d'austérité pour les travailleurs, - de privations pour beaucoup,implique une grande ténacité - dans la lutte. - § il s'agit d'une bataille de longue haleine et - d'envergure dans laquelle s'allient les actions - multiformes et incessantes dans les entreprises - et des mouvements coordonnés de divers types $: au plan - professionnel ou au plan interprofessionnel selon - la nature des revendications essentielles;parfois au - niveau local ou départemental,parfois par de grandes - initiatives d'ampleur nationale. - § dans tous les cas,parmi les conditions nécessaires - à la conduite des luttes,l'information de l'opinion - publique et la recherche de son soutien sont indispensables. - § ce sont les circonstances,les situations concrètes qui - conduisent à adopter les initiatives qui conviennent - le mieux dans chaque cas. - § et c'est l'ensemble de ces luttes aux aspects diversifiés, - souvent très décentralisées et parfois puissamment - regroupées qui constitue un mouvement revendicatif - rassemblant,sur toute une période,des forces de plus en - plus grandes capables d'imposer non seulement des reculs - dans telle ou telle entreprise ou branche mais au - patronat et au gouvernement pour les objectifs communs - à l'ensemble des travailleurs. - § les orientations du 38ème *congrès confédéral définissant - les principes d'une action efficace et responsable se sont - pleinement vérifiées. - § l'essentiel dans la conduite de la bataille présente est, - avec la persévérance,le souci plus indispensable que - jamais de la plus large démocratie $: démocratie avec les - syndiqués qui doivent jouer leur rôle,démocratie avec - l'ensemble des travailleurs,pour tenir le plus grand - compte de leurs besoins,de leur état d'esprit,définir avec - eux à toutes les étapes de la lutte et rechercher la - convergence dans les objectifs et les méthodes d'action. - § les militants et les organisations de la CGT ont à faire - preuve d'audace pour se placer,de la sorte,résolument - à la tête des luttes avec esprit d'initiative,de - décision et d'unité. - § c'est dans cet esprit que la CGT et la CFDT ont pris, - dans toute la dernière période des initiatives d'action - et animé le développement des luttes. - § l'accord conclu le 26 juin 1974 entre les deux centrales - sur les objectifs communs,les méthodes de l'action et le - renforcement de l'unité d'action a représenté un progrès - considérable dans les relations confédérales.il a permis - d'éliminer un grand nombre d'obstacles et a favorisé une - amélioration à différents niveaux quoique subsistent - bien des inégalités de situations. - § la pratique a prouvé $: - _que les divergences existant sur les questions - fondamentales de l'avenir de la société ne sont pas - un obstacle insurmontable à l'unité d'action pour les - revendications communes et urgentes pour les travailleurs; - _que les divergences sur les revendications et les - méthodes de l'action,lorsqu'elles existent,sont plus - facilement surmontées lorsqu'elles sont discutées - clairement et franchement avec les travailleurs dont - l'appui est décisif; - _que la pratique de l'unité d'action sur des bases claires - favorise l'établissement de rapports fraternels et - loyaux,qu'elle contribue à aborder dans de meilleures - conditions la discussion des divergences plus fondamentales - pour tenter de les réduire.tout progrès dans ce sens - facilite réciproquement l'unité d'action; - _qu'une bonne et saine unité suppose la vitalité,l'activité - et l'esprit d'initiative des organisations de la CGT en - tant que telles. - § la CGT persiste à souhaiter que l'unité d'action qui - se développe avec la CFDT s'étende à la FEN et à - Force Ouvrière . - § mais la direction de la FEN en dépit des intentions - qu'elle affirme est délibérément retournée à la - collaboration avec le gouvernement en signant un nouvel - accord salarial qui s'inscrit dans la politique - d'austérité.la pratique de l'unité d'action avec de nombreuses - organisations de la FEN est fondée sur la défense - des intérêts de classe des travailleurs,la lutte contre - la crise et ses conséquences,pour faire reculer le - pouvoir et le patronat. - § la CGT lutte pour l'unité avec la FEN en combattant - les positions de collaboration de classe dans la fonction - publique. - § la direction confédérale de FO est devenue l'agent - officiel et le symbole de la collaboration de classe. - elle s'attaque directement aux travailleurs en grève - et apporte systématiquement la caution de son - organisation au patronat et au gouvernement. - § la CGT ne peut qu'espérer un sursaut contre cette - dégradation parmi les militants et les organisations - de Force Ouvrière et la réalisation de l'unité d'action - sur des bases de classe avec les organisations FO - qui y sont prêtes. - § le *congrès souligne que cela ne peut être possible - que si cette organisation adopte enfin une attitude - combative de défense des intérêts des travailleurs. - § le renforcement et l'élargissement de l'unité d'action - pour les revendications communes est toujours la question - actuelle,la tâche urgente en matière d'unité.la CGT - s'y emploie sans relâche.simultanément,elle ne s'est jamais - résignée à la division syndicale et maintient plus que - jamais son objectif de réunification syndicale.elle - entend travailler à en créer les conditions. - § dans cette perspective,elle a défini ses propres conceptions - fondées sur le contenu de classe de son action, - le caractère de masse de ses activités et la démocratie - syndicale assurant la véritable indépendance d'une - organisation groupant l'ensemble des salariés dans - la diversité des opinions. - § elle est prête à en discuter,certaine d'aller au devant - du désir de la masse des travailleurs et particulièrement - des jeunes. - - rassemblement des forces populaires pour la victoire - du programme commun .. - - § des millions de travailleurs se persuadent,à l'expérience et - par l'effort de conviction de la CGT,que si - l'indispensable action revendicative permet de résister - à l'agression permanente contre le niveau de vie,rien - d'essentiel ni de durable ne pourra être fait sans des - changements profonds dans la société. - § la crise étale toute la malfaisance,les tares et les - absurdités d'un système qui ne répond pas aux besoins - du développement de l'humanité et qui s'avère incapable - de résoudre aucun des problèmes posés par notre époque. - § c'est le socialisme qui représente l'avenir de la - société.cette idée continue à progresser dans l'esprit - des travailleurs.la CGT qui s'est fixée pour but cette - transformation décisive conduisant à l'émancipation - des travailleurs,a clairement exposé ses conceptions - à cet égard.son 38ème *congrès les a confirmées. - elle est disponible pour la poursuite de la réflexion - et de la discussion avec les travailleurs et toutes les - forces intéressées à ce but. - § c'est en poursuivant cet objectif et en militant pour - y gagner toujours plus de travailleurs que la CGT - a engagé toutes ses forces dans la lutte pour la - démocratie économique et politique,pour les changements - profonds qu'il faut d'urgence apporter à la société. - § la conclusion du *programme commun de gouvernement - entre le *parti communiste ,le *parti socialiste et - le *mouvement des radicaux de gauche en a ouvert la - perspective. - § le soutien massif à cette alliance et à ce programme - lors de l'élection présidentielle a créé une situation - nouvelle. - § la possibilité de faire parvenir la *gauche au pouvoir - pour appliquer son programme soulève un grand espoir - parmi les travailleurs. - § cet espoir,pour être pleinement justifié,doit - s'accompagner d'une vue lucide des conditions de la - lutte pour y parvenir. - § car cette même perspective provoque la profonde - inquiétude des milieux dirigeants de la haute bourgeoisie - et de toutes les forces de réaction qui ne restent pas - passifs. - § le *pouvoir regroupe toutes les forces de conservation - sociale quelle que soit leur étiquette.il précipite - son alignement atlantique.il renforce le caractère - personnel,autoritaire du système et en particulier - sa mainmise sur les principaux moyens d'information. - § tout en s'efforçant de maintenir ainsi le pouvoir qui - lui convient le mieux,la bourgeoisie multiplie et - multipliera constamment les manoeuvres pour s'efforcer - de dissocier l'alliance de la *gauche et surtout - pour tenter de la vider de son contenu. - § à cet effet,le pouvoir tente d'entraîner des forces de - la gauche à un comportement de collaboration de classe. - les campagnes anticommunistes sont destinées à diviser et à - affaiblir la gauche.c'est pourquoi il est du devoir de l'ensemble -des forces de gauche,syndicales et politiques, - de les combattre. - § car ce qui inquiète le plus le grand patronat dans - l'union de la *gauche ,ce sont ses objectifs et le - contenu social et économique avancé de son programme. - § c'est aussi ce qui importe le plus aux travailleurs et - à la CGT. - § la CGT a constamment défini,dans ses *congrès et - instances responsables,à partir de ses préoccupations - syndicales,ses positions indépendantes quant aux - perspectives de transformation de la société. - § cette indépendance,conforme aux intérêts des travailleurs,ne - peut pas se détacher des principes de classe et,par - conséquent,ne saurait être confondue avec une quelconque - neutralité. - § pendant de longues années la CGT a lutté pour que - se réalise l'alliance des forces de gauche sur la base - d'un *programme commun au contenu fermement dirigé - contre la domination des monopoles. - § elle a défini,pour sa part,les objectifs qu'elle jugeait - essentiels dans ce but.ces objectifs figurent toujours - dans son programme confédéral. - § lorsque fut conclu le *programme commun de la gauche , - la CGT a fondé son soutien sans défaillance sur le - fait qu'elle y retrouvait l'essentiel de ses propres - objectifs. - § c'est avec ces mêmes préoccupations que la CGT - poursuit son action. - § l'essentiel,du point de vue des intérêts de classe - des travailleurs _ et par conséquent du point de vue - de la CGT _ est dans l'application des mesures prévues - par le *programme commun $: - _pour retirer aux monopoles les moyens de leur - puissance et remettre à la *nation les leviers de - commande essentiels de l'économie,c'est-à-dire la - nationalisation des secteurs clés et leur gestion - démocratique dans le cadre d'une planification également - démocratique; - _pour mettre en oeuvre des mesures sociales hardies - répondant aux revendications des travailleurs; - _pour développer,en démocratisant l'économie,l'intervention - active et la participation de la masse des travailleurs - à la gestion et à la planification. - § les mises au point et ajustements nécessaires du - programme,qui doivent intervenir en temps opportun - pour tenir compte de la conjoncture et des conditions - concrètes devant lesquelles sera placée la *gauche ,ne - sauraient en affecter les dispositions fondamentales, - celles qui sont destinées à donner les moyens du - changement réel. - § loin d'être dépassé,comme le prétendent ses détracteurs, - le *programme commun est plus actuel et urgent que - jamais,dans son fond. - § non,la crise n'est pas fatale,l'austérité pour les - travailleurs n'est pas inévitable et ne constitue pas - une solution. - § contre le pouvoir actuel et les féodalités capitalistes - qu'il s'agit d'éliminer,seules les réformes profondes - contenues dans le *programme commun permettront de - sortir le pays de la crise,d'assurer son développement - et de résoudre d'une manière neuve et efficace les - problèmes essentiels posés à la société moderne et - d'abord ceux qui importent le plus aux travailleurs - pour améliorer leur situation,leurs conditions de vie - et de travail. - § pour qu'elle devienne majoritaire,l'union de la gauche - implique $: - _l'action concrète contre le pouvoir pour assurer - la défense des intérêts des travailleurs et la défense - des libertés; - _le rassemblement et l'union de tous pour la mise en - échec de toutes les tentatives de collaboration de - classe; - _des initiatives multiples afin de gagner aux idées - décisives du *programme commun des millions de consciences - nouvelles et notamment parmi les salariés et de contribuer - au renforcement de leur détermination pour de véritables - changements. - § c'est dans cet esprit et pour ces objectifs communs - que la CGT souhaite voir se renforcer l'*union de - la gauche . - § elle travaillera pour sa part,sur la base de ses - positions de classe,à gagner à ces conceptions et aux - solutions fondamentales du *programme commun ,la masse - des travailleurs.elle impulsera l'action commune pour - des buts concrets.elle contribuera ainsi au renforcement - de l'*union de la gauche et à la réalisation du - rassemblement majoritaire qui assurera sa victoire - et l'application de son programme. - - dans l'intérêt des travailleurs $: puissance,capacité - d'organisation,d'initiative et d'influence de la CGT .. - - § défendre les intérêts des travailleurs dans une situation - aussi complexe,quand la lutte de classe atteint un tel - degré;les aider à s'orienter,à s'organiser pour - intervenir eux-mêmes efficacement;les rassembler par millions - dans la lutte pour les transformations sociales - indispensables $: il est impossible d'accomplir ces tâches - sans un renforcement considérable de la CGT,en - quantité comme en qualité. - § les travailleurs de toutes catégories et de toutes - professions ne peuvent se passer d'une CGT active, - vivante,présente partout,capable de faire face à ses - responsabilités en toutes circonstances,ce qui suppose - à la fois le recrutement systématique de nouveaux - adhérents,l'exercice d'une large démocratie syndicale - et la diffusion des idées de la CGT $: trois conditions - indispensables au syndicalisme de masse et donc à l'efficacité - de l'action syndicale. - - syndiquer massivement les travailleurs .. - - § c'est à partir de ces préoccupations que l'année 1974 - a marqué une ouverture dans la voie d'un recrutement - important et permanent et de la création d'un grand - nombre d'organisations là où elles n'existaient pas. - § les résultats obtenus en 1974,avec 308000 adhésions - et 3400 bases nouvelles,sont encourageants mais ils ne - représentent que le début d'une attitude nouvelle pour - placer les forces organisées de la CGT en concordance - avec son influence et ses responsabilités. - § il s'agit,chaque année,de progresser au rythme - de nombreuses centaines de milliers d'adhérents et de - milliers d'organisations nouvelles. - § ce résultat ne peut être atteint que par une activité -de masse s'appuyant sur une prise de conscience générale - de tous les militants,de tous les syndiqués et un - travail systématique,organisé,dirigé par les directions - syndicales aux différents niveaux. - § le renforcement numérique doit s'accompagner d'un - perfectionnement général du travail des organisations - de la CGT $: direction collective pour assurer - entièrement nos responsabilités dans tous les domaines. - promotion de forces militantes nouvelles représentatives - de la diversité de la CGT aux responsabilités et - tout particulièrement les femmes qui prennent une place - de plus en plus grande dans l'action et la vie syndicale - et des jeunes gens et jeunes filles;formation de centaines - de milliers de militants de toutes responsabilités. - § donner à la CGT un caractère de masse dans toute sa vie - et son action exige également de veiller aux intérêts - de chaque catégorie de travailleurs,de comprendre leurs - besoins,leurs préoccupations.cela exige de déployer - un travail d'organisation et une activité spécifique - qui tiennent compte de leurs revendications particulières, - de leur sensibilité propre à l'égard des revendications - générales et des problèmes d'ensemble de tous les - travailleurs. - § ce travail spécifique,pour être efficace,doit s'appuyer - sur l'activité de l'ensemble des organisations de la - CGT. - § cet ensemble de préoccupations qui concernent toutes - les organisations de la CGT à tous les échelons - s'impose particulièrement dans les grandes entreprises - en raison de leur place dans la vie économique et - sociale,dans les luttes. - - développer et perfectionner la démocratie syndicale .. - - § c'est pour des raisons importantes que la CGT - poursuit avec insistance une campagne intérieure - pour le développement de la démocratie syndicale $: c'est la clé - du perfectionnement des organisations de la CGT ainsi - que la solution de nombreux problèmes qui s'y rapportent, - l'état actuel de sa pratique au sein de nos organisations - réclame qu'on poursuive avec une plus grande attention - les efforts entrepris. - § la démocratie syndicale consiste principalement à - assurer la participation active des syndiqués à la vie - de l'organisation,à la détermination de son orientation et - de ses décisions. - § elle suppose la plus large expression des syndiqués, - l'information et la circulation des idées. - § le 38ème *congrès a défini les principales conditions - nécessaires à la démocratie syndicale. - § plus est grande la participation des adhérents à la vie - de l'organisation,meilleures sont les décisions,plus - étroits sont les liens du syndicat avec les travailleurs - par l'intermédiaire de ses adhérents mieux informés, - plus nombreux les syndiqués qui prennent une part - même modeste,au travail syndical,plus nombreux enfin ceux qui - deviennent des militants. - § par là,le syndicat décuple son efficacité dans son - orientation,dans la mise en activité des forces indispensables - pour faire face à toutes ces obligations,dans les moyens - d'un plus grand recrutement,d'une meilleure promotion de - cadres. - § par là,il donne pleinement l'image,à tous les échelons, - de la grande organisation de masse qu'est la CGT - et qu'elle veut être toujours mieux,pour être - "la CGT partout et pour tous" . - § lorsque les militants responsables sont animés par - ces préoccupations et en assimilent la portée,ils - trouvent plus aisément les solutions pour y parvenir, - les mesures d'organisation et le style de direction. - - porter la bataille des idées à la mesure de nos - responsabilités .. - - § c'est à partir de la même préoccupation $: le caractère - de masse de toute l'activité syndicale,qu'il convient - d'envisager la bataille des idées. - § le 38ème *congrès a lancé le mot d'ordre $: - "gagner des millions de consciences" - car telle est l'envergure de la bataille sociale. - § c'est à des millions de travailleurs qu'il faut apporter - constamment les idées,les réponses ,les réflexions, - les propositions de la CGT pour qu'ils puissent se - déterminer,trouver leur voie en dépit du martèlement - des idées du *capital qui dispose de tous les moyens - essentiels d'information. - § c'est une condition absolue de l'efficacité de l'action - revendicative comme de la lutte pour les changements - plus fondamentaux et de l'accomplissement de toutes les - tâches de la CGT. - § la mettre en mesure de faire face à ses responsabilités, - c'est à la fois la doter de l'organisation correspondant - aux exigences de la lutte gigantesque de notre époque - et assurer un rayonnement permanent et infiniment plus - large à ses idées. - § tout l'ensemble de l'activité d'information et de - propagande de la CGT et de ses organisations doit être - adapté à cette responsabilité,à cette obligation d'information, -d'explication et d'éducation de masse; - c'est dire qu'il convient de donner à la propagande - syndicale les moyens,l'efficacité,la diversité qui - correspondent à ces exigences en adoptant les méthodes - modernes et en consacrant les forces nécessaires pour - y parvenir. - § et d'abord l'effort de diffusion de toute la presse - confédérale et principalement du moyen central et - permanent d'expression de la CGT auprès de l'ensemble - des travailleurs : "la Vie-Ouvrière " . - § ce qui vaut pour la conception du recrutement qui doit - prévaloir vaut pour celle de la diffusion de "la Vie-Ouvrière". - car l'organisation en masse des travailleurs - dans la CGT doit aller de pair avec leur connaissance, - en masse des idées de la CGT et par conséquent avec la - lecture régulière de son hebdomadaire de masse. - - la solidarité ouvrière internationale et l'unité d'action - syndicale en Europe .. - - § les progrès de la détente _ fait principal de la situation - internationale _ sont un succès pour les travailleurs, - les peuples,toutes les forces de progrès.ils traduisent - le recul des positions de l'impérialisme dans le monde; - les résultats,dans leur édification,des pays socialistes, - qui ne connaissent ni crise,ni inflation,ni chômage, - le renforcement des luttes de classe des travailleurs - dans les grands pays capitalistes,les nouveaux succès - du mouvement de libération nationale caractérisés par la - victoire historique des travailleurs et des peuples du - Viêt-Nam et du Cambodge contre l'impérialisme - américain,le renforcement de l'indépendance économique - et politique contre le néocolonialisme de différents - pays libérés. - § à cet égard,la CGT considère parfaitement légitimes - les mesures prises par les pays producteurs de pétrole - et d'autres matières premières pour obtenir des prix - normaux.elle exprime sa solidarité à ceux qui sont - engagés dans une voie démocratique et anticapitaliste. - § elle agit pour la sauvegarde de la paix,la sécurité - en Europe et dans le monde,la coopération internationale. - § elle exige du gouvernement une politique active de paix - et d'indépendance nationale. - § le courant pour la démocratie se renforce.il s'est - manifesté en particulier par le renversement de la - dictature fasciste au Portugal et en Grèce . - § contraint au recul,l'impérialisme s'acharne pourtant - à préserver sa domination par tous les moyens lorsqu'il - en a la possibilité $: la bestialité des généraux putschistes - au Chili en est l'illustration et les menaces d'intervention - militaire contre les pays producteurs de pétrole. - § la CGT renforcera son action de solidarité avec les - travailleurs,les syndicats,les démocrates du Chili , - d'Espagne et tous ceux qui subissent la répression, - le joug fasciste,le racisme à travers le monde. - § la CGT poursuivra son action avec les autres forces - progressistes de France pour la solidarité aux peuples - du Viêt-Nam et du Cambodge . - § elle se prononce pour un règlement des problèmes du - Moyen-Orient qui,mettant fin à la politique agressive - des dirigeants d'Israël ,restitue leurs territoires - aux pays arabes,rétablisse,conformément aux décisions de - l'ONU,le peuple palestinien dans ses droits nationaux - et assure le droit à l'existence et la sécurité de tous - les *états de cette région,y compris l'*état d'Israël . - § affirmant la permanence de son attitude anticolonialiste - et antinéocolonialiste,la CGT salue les victoires - remportées par les peuples d'Angola ,du Mozambique - et de Guinée-Bissau ,et se déclare solidaire des - peuples d'Afrique en lutte pour conquérir ou consolider - leur indépendance économique. - § elle appuie la lutte des travailleurs et des peuples - des *départements d'Outre-Mer et des *territoires - d'Outre-Mer pour la liquidation du colonialisme français - et l'octroi aux DOM du statut d'autonomie réclamé par - les populations de ces pays. - § des changements importants et positifs se produisent - dans le mouvement syndical à travers le monde. - § dans les pays capitalistes,frappés par la crise et - où sévissent les sociétés multinationales,les travailleurs - en subissent les mêmes conséquences $: inflation, - chômage,attaques contre leur niveau de vie et leurs - droits. - § les luttes de classe s'y aiguisent partout et elles - trouvent leur reflet au sein même d'organisation dont - l'orientation est traditionnellement axée vers la - collaboration de classe et où l'on constate la progression - des idées et de la pratique d'une attitude plus combative - dans la défense des intérêts de classe des travailleurs. - § sur cette base,ainsi qu'en conséquence de l'évolution - internationale,se développe un mouvement favorable au - rapprochement entre organisations syndicales de - différentes affiliations internationales et entre les - centrales internationales elles-mêmes. - § la CGT contribue,par ses initiatives directes et - par sa participation active à l'action de la FSM,à - favoriser cette évolution,pour aboutir à un vaste - développement de l'unité d'action internationale - pour des objectifs concrets communs répondant aux intérêts - des travailleurs,de la démocratie et de la paix et par - des actions effectives. - § elle attache la plus grande importance au renforcement de - l'influence de la FSM dont le rôle et le prestige - international grandissent en raison de son action et des - idées de lutte conséquente qu'elle représente.la CGT - renforcera en particulier son soutien aux UIS de la - FSM dont le rôle est capital pour l'organisation - concrète de la défense internationale effective des intérêts - des travailleurs contre les sociétés multinationales. - § la CGT qui entretient de longue date une coopération - fraternelle avec les syndicats des pays socialistes, - entend la développer encore et contribuer à faire - connaître avec objectivité la réalité et les résultats - des pays socialistes qui intéressent au plus haut point - les travailleurs français. - § c'est naturellement en Europe que les responsabilités - de la CGT sont les plus grandes.c'est aussi sur notre - continent que l'on assiste à des évolutions parmi les - plus importantes dans le mouvement syndical. - § une première rencontre unitaire des centrales syndicales - de tous les pays d'Europe ,capitalistes et socialistes, - sans considération d'affiliation internationale s'est tenue - en janvier 1974. - § une deuxième rencontre de toutes ces centrales a eu - lieu en février-mars 1975.des perspectives concrètes - existent pour que s'instaurent au-delà des relations - bilatérales,des relations multilatérales,collectives, - sans discrimination pour étudier des problèmes syndicaux, - économiques et sociaux d'intérêt commun. - § la CGT y attache une très grande importance et entend - y coopérer de son mieux,dans un esprit constructif de - compréhension mutuelle.elle considère qu'il est nécessaire - et possible d'établir des rapports et une coopération - suivis entre toutes les centrales des pays d'Europe , - quel que soit leur régime économique et social. - § en Europe occidentale il est urgent d'aller de - l'avant.dans tous ces pays,les travailleurs se heurtent à la - même situation économique,à des politiques gouvernementales - et patronales similaires et subissent le poids des - sociétés multinationales. - § au sein de la CEE,qui s'est avérée incapable de - promouvoir une véritable politique sociale malgré les - promesses réitérées,les travailleurs sont appelés au - "partage des sacrifices" et subissent les mêmes méthodes - d'austérité.ils se heurtent à l'emprise accrue des grandes - féodalités financières et industrielles de chaque pays - et internationales,notamment américaines. - § la coopération syndicale est urgente,pour des initiatives - communes dans les institutions de la CEE,pour - démocratiser ces institutions.cette coopération est - nécessaire pour promouvoir une Europe antimonopoliste, - démocratique et pacifique. - § au-delà des problèmes propres aux pays membres de la - CEE,se pose avec acuité la recherche de l'unité d'action -entre les syndicats de tous les pays d'Europe - occidentale . - § la constitution de la CES a représenté un événement - nouveau.son ouverture aux centrales affiliées à la CMT - (dont la CFDT) puis à la CGIL marque un progrès. - § si l'évolution unitaire est le trait dominant,il n'en - reste pas moins que demeurent encore dans certaines - centrales des attitudes héritées de la guerre froide - qui maintiennent des blocages artificiels. - § la CGT souhaite participer à la CES dans un - esprit constructif et réaliste.elle ne saurait évidemment - admettre des conditions discriminatoires d'aucune sorte. - § de la même manière qu'elle trouve naturel que les - organisations affiliées à la CISL ou à la CMT - aient conservé leur affiliation internationale,elle - entend conserver librement son affiliation à la FSM, - sans aucune espèce de "distance".la CGT entend être - un partenaire syndical loyal,sérieux mais égal en tous - points. - § des tâches urgentes et communes sollicitent les organisations - syndicales en Europe occidentale .les revendications - essentielles de défense des intérêts des travailleurs - sont communes.sous une forme ou sous une autre,il faut - faire face ensemble avec tout l'esprit de compréhension - nécessaire.il faut développer des initiatives d'action - unitaires;le plus tôt sera le mieux. - - conclusion .. - - § l'année 1975 est celle du 80ème anniversaire de la - *confédération générale du travail . - § dès sa création,la CGT a inscrit dans ses statuts les - orientations essentielles qui guident aujourdhui sa - vie et son action. - § organisation de masse ouverte à tous les salariés, - elle affirmait en 1895 la nécessité de la lutte pour - défendre leurs intérêts de classe et son but $: la suppression - de l'exploitation des salariés par les patrons. - § depuis cette période,la CGT a été au coeur des luttes - et de l'histoire du mouvement ouvrier, - du mouvement syndical,et de l'histoire de la - France tout particulièrement lors du *front populaire , - pendant la *résistance à l'occupant nazi,et dans les - années qui ont suivi la *libération . - § les connaissances,la conscience,l'expérience historique - acquises dans les luttes de classe,dans la vie nationale, - dans la solidarité internationale et les rapports avec - le mouvement syndical du monde entier ont profondément - transformé la CGT en conservant le meilleur de ses - orientations initiales. - § au cours des trente années qui ont suivi la deuxième - guerre mondiale,la CGT a connu les épreuves de la scission - et de la guerre froide,la lutte contre le colonialisme - français,le combat entrepris dès le début contre la - mainmise des monopoles sur l'*état et contre le pouvoir - personnel en France . - § des éléments historiques nouveaux sont apparus dans ce - combat. - § l'unité d'action entre la CGT et la CFDT est devenue - un élément important de la vie et des luttes syndicales. - § mai 1968 a été le premier grand affrontement à l'échelle - nationale entre les travailleurs et le pouvoir des grandes - sociétés capitalistes.mouvement revendicatif,il posait - par sa dimension même le problème d'un changement radical - de politique et de transformations profondes dans la - société.il a servi de révélateur de la crise.depuis, - l'approfondissement de celle-ci fait apparaître - davantage que c'est tout le système actuel,le capitalisme - monopoliste d'*état ,qui est en cause. - § l'*union de la gauche sur le *programme commun , - voulue par la CGT et les succès considérables qu'elle - a remportés offrent aux travailleurs et à la France - la perspective proche de profondes réformes démocratiques - et d'un progrès économique et social qui peuvent,si - la réussite de cette expérience est réalisée,gagner - la grande majorité des travailleurs et du pays à l'idée - de la transformation socialiste de la société. - § cette perspective se situe dans un monde en pleine - évolution et transformation,et ce contexte contribue à - la rendre possible. - § le capitalisme est,au sein même des grands pays - les plus développés,dans une crise profonde qui durera; - le socialisme progresse et se construit,le colonialisme - direct est en voie de liquidation complète,et les pays - du Tiers-Monde luttent pour leur indépendance économique. - plusieurs régimes fascistes sont tombés et l'impérialisme - est en recul. - § cette évolution est le résultat d'une lutte longue et - difficile menée par les travailleurs,les forces - progressistes et les peuples du monde entier.la classe - ouvrière,dans chaque pays et à l'échelle internationale - a toujours été l'élément le plus solide et le plus résolu - dans le combat pour la démocratie,la paix,l'indépendance - des peuples et le progrès.dans les heures les plus - difficiles elle n'abandonne pas la lutte. - § la CGT est consciente d'avoir,pour sa part syndicale - et nationale,contribué à ce mouvement historique dans le - monde entier,au long des 80 ans de sa propre histoire.elle - reste et restera fidèle à sa mission,conforme aux - intérêts et au rôle de la classe ouvrière et de l'ensemble - des travailleurs. - - - - - - - - - programme d'action .. - l'action pour la satisfaction des grands objectifs - revendicatifs .. - - § dans une période marquée par la crise profonde du - système capitaliste et la volonté du pouvoir de renforcer - par tous les moyens la puissance des groupes financiers - et industriels les plus importants,la politique du - gouvernement et du patronat est fondée sur une - accentuation de l'exploitation capitaliste.l'inflation - constitue un moyen d'accentuer et de généraliser cette - exploitation. - § peser sur le pouvoir d'achat,limiter sa progression, - constitue l'objectif avoué du patronat et de l'*état - patron. - - pouvoir d'achat .. - salaires .. - - § dans ces conditions,le problème des salaires et du - pouvoir d'achat est plus que jamais la préoccupation - première et permanente des travailleurs et du mouvement - syndical,parce qu'il détermine,dans une mesure décisive, - le niveau de vie du salarié et qu'il est l'enjeu de la - lutte quotidienne avec le capital.la progression du - pouvoir d'achat représente un moyen efficace pour assurer - le plein emploi et le développement de l'économie. - § la CGT développe son action conjointement pour $: - _l'augmentation des salaires compte tenu,tout à la fois, - de leur niveau scandaleusement insuffisant pour certaines - catégories et dans certains secteurs professionnels et - de l'écart qui s'est creusé,en général,entre les salaires - et les prix; - _la garantie du pouvoir d'achat s'appliquant aux salaires - ainsi revalorisés; - _la progression du pouvoir d'achat; - _la remise en ordre des salaires et systèmes de rémunération. - - garantie du pouvoir d'achat des salaires .. - - § la poussée inflationniste que l'on observe dans notre - pays conduit naturellement les travailleurs à revendiquer - des mesures de protection de leur pouvoir d'achat. - § la garantie effective du pouvoir d'achat des salaires, - pour tous les salariés,suppose l'établissement d'un - véritable système national et interprofessionnel d'échelle -mobile,assurant périodiquement et à intervalles - rapprochés le relèvement automatique des salaires et - traitements,en fonction des hausses des prix intervenues,avec - compensation pour les pertes subies dans la période - antérieure. - § elle suppose aussi la suppression dans la législation - des interdictions ou limitation des clauses d'indexation. - § l'évolution du coût de la vie doit être établie par un - nouvel indice reflétant la réalité des prix,qui doit être - élaboré en accord avec les organisations syndicales et - familiales. - - progression du pouvoir d'achat des salaires .. - - § la progression du pouvoir d'achat doit permettre la - satisfaction des besoins nouveaux qui apparaissent comme - des exigences de la vie à l'étape actuelle de la société, - pour toutes les catégories de travailleurs. - § elle est un impératif du développement économique - et social de la *nation et contribue à assainir la - situation de l'emploi. - § cette progression se justifie pleinement par l'ampleur - des profits capitalistes,le développement du revenu - national,les progrès de l'économie et l'accroissement - considérable de la productivité du travail;elle doit être - assurée quelle que soit l'évolution de la situation - économique. - § le pouvoir d'achat des salaires de tous les travailleurs doit - progresser. - § cette progression,plus importante pour les bas et moyens - salaires,donc différenciée,doit être négociée au niveau - des branches professionnelles et des entreprises,et - pour tous les secteurs d'activité,public et privé. - § cette progression différenciée doit s'inscrire dans une - politique de remise en ordre des systèmes de rémunérations, - ramenant les classifications et coefficients à un nombre - raisonnable avec,entre deux coefficients successifs, - des écarts significatifs,revalorisant la hiérarchie des - catégories ouvriers employés et techniciens et tendant - à réduire l'écart hiérarchique réel par un resserrement - vers le haut. - - remise en ordre des salaires et des systèmes de - rémunérations .. - - § cette remise en ordre,qui s'inscrit dans notre - objectif de statut unique du manoeuvre à l'ingénieur, - doit être établie en fonction des principes suivants $: - _établissement,dans chaque branche,d'une grille - nationale unique de classifications et de salaires - garantis,couvrant toutes les catégories de salariés,du - manoeuvre au cadre,et s'appliquant à tous,sans discrimination - d'aucune sorte. - _ces grilles uniques,nationales et professionnelles, - devront comporter une définition des classifications, - tenant compte des changements intervenus dans tous les - domaines (scientifiques,techniques,technologiques) - des diplômes,de la place et du rôle des hommes dans - le processus de production.ces définitions se référeront - aux connaissances acquises par le travailleur,qu'elles - soient sanctionnées ou non par un diplôme,à l'expérience - qu'il possède,aux initiatives qu'il peut prendre et aux - responsabilités qui lui incombent. - _les barèmes nationaux de salaires garantis seront - calculés,pour chaque classification et coefficient - correspondant par rapport à une valeur de point unique, - affectée au coefficient 100.ces salaires garantis par - conventions collectives et accords devront exclure - toutes les primes et représenter l'essentiel de la - rémunération. - § la réalisation de ces dispositions essentielles - suppose $: - _la suppression de tous les systèmes de rémunération - basés sur les études de postes; - _l'intégration dans le salaire garanti des primes aléatoires - ayant le caractère de fait d'un complément de salaire - ou portant atteinte à la dignité des travailleurs; - _l'élimination des disparités existantes entre des - salariés de même qualification; - _la suppression des abattements de zones et des disparités - régionales; - _la suppression de toute discrimination basée sur l'âge, - le sexe ou la nationalité; - _la limitation des éléments de la rémunération liés - au rendement par leur intégration partielle dans le - salaire garanti;leur suppression,par voie contractuelle, - dans les branches et les entreprises où les conditions - existent pour les intégrer en totalité dans le salaire - garanti; - _la garantie de la classification et du salaire,en cas de - mutation ou de changement de poste de travail; - _la suppression de la rémunération au rendement pour les - femmes enceintes,leur classification et leur salaire - antérieur leur étant garantis. - § lorsqu'une partie du salaire restera liée au rendement, - la partie mobile du salaire venant s'ajouter au salaire - garanti devra être calculée à partir de celui-ci,d'une - manière contrôlable et claire pour les travailleurs - concernés,et assurer obligatoirement une rémunération - supérieure au salaire garanti dans la catégorie. - - salaire minimum interprofessionnel .. - - § la CGT estime qu'il est indispensable de donner - au salaire minimum interprofessionnel de croissance - (SMIC) une valeur telle qu'elle constitue une - véritable garantie permettant une vie décente aux salariés - dont les rémunérations sont les plus faibles.c'est - pourquoi,elle demande que le SMIC soit porté à - 1700 francs par mois (valeur mai 75) qu'il soit mensualisé - sur la base de la durée légale du travail (40 heures - par semaine),que cette garantie mensuelle soit assurée à - tous les salariés,en cas de réduction d'horaire au-dessous - de 40 heures,et que son pouvoir d'achat soit garanti par - référence à un indice des prix rénové et établi par - voie de négociation. - § cette garantie minimale mensuelle devra s'appliquer - à l'ensemble des salariés et servir de référence à - l'évolution des retraites et pensions,ainsi que des - diverses allocations sociales.cette dernière mesure suppose la - suppression du minimum garanti,qui sert d'indexation à - plusieurs indemnités et ne cesse de se dévaloriser depuis - 1970. - § la CGT demande que la loi du 2 janvier 1970,portant - réforme du salaire minimum interprofessionnel,soit - modifiée pour que la commission supérieure des conventions - collectives procède,deux fois par an,à une véritable - discussion sur la progression du SMIC,dont le taux - doit être fixé en tenant compte de l'avis émis par la - commission. - § la CGT estime,en outre,qu'il convient de rendre au - SMIC le sens qu'il avait à son origine,c'est-à-dire - qu'il devrait être fixé net de toutes primes ou majorations - de quelque nature que ce soit. - § par ailleurs,la loi doit interdire la fixation dans les - conventions collectives de salaires garantis inférieurs au - SMIC. - - mensualisation et statut unique .. - - § la CGT considère que la mensualisation des ouvriers, - qui ne se limite pas au seul paiement au mois du salaire, - n'est pas encore réalisée. - § pour que cette mensualisation soit réelle,elle doit - apporter les mêmes garanties à toutes les catégories de - salariés,et permettre aux ouvriers de chaque branche - professionnelle de bénéficier de tous les droits et - avantages dont ils sont encore exclus. - § cette généralisation sans restriction des droits,leurs - améliorations,doivent se traduire,dans chacun des secteurs - professionnels,par l'élaboration d'un statut unique - national,comportant des avantages substantiels,applicable - à toutes les catégories de travailleurs et trouver place - dans les *conventions collectives . - - prestations,allocations,rentes,pensions .. - - § la politique de démantèlement de la *sécurité sociale - engagée par le *pouvoir et le *patronat particulièrement - depuis 1958 se poursuit sans relâche.après les - *ordonnances de 1967 la loi sur la compensation et - l'harmonisation des régimes de *sécurité sociale - constitue une nouvelle et grave atteinte à la - *sécurité sociale .le plan de démantèlement de cette - institution,fondamentale pour les travailleurs,est - progressivement réalisé. - § cette politique a pour conséquence une dévalorisation - continue des prestations et des services rendus aux - assurés,allocataires et pensionnés.compte tenu de l'inflation - ceux-ci connaissent une dégradation constante de leur - pouvoir d'achat. - § face à cette situation,la CGT revendique en tout - premier lieu le relèvement automatique et périodique - des allocations,rentes,pensions et retraites,en fonction - de la hausse des prix enregistrée par un nouvel indice - élaboré en accord avec les organisations syndicales et - familiales. - § la CGT exige $: - pour les prestations sociales et les rentes $: - _ le remboursement à 80 et 100% des dépenses de santé, - y compris celles résultant de l'interruption de grossesse, - remboursement garanti par une *convention médicale - issue d'une véritable négociation entre les médecins - et les représentants des assurés sociaux; - _l'exonération totale du ticket modérateur pour la longue - maladie,les personnes âgées et les enfants de moins - de six ans,première étape vers la gratuité des soins; - _l'extension du tiers payant supprimant l'avance - d'argent pour l'hospitalisation,la pharmacie,les soins - dentaires,les analyses et examens de laboratoire; - _la fixation de l'indemnité journalière maladie et de - la pension d'invalidité 2ème catégorie à 75% du salaire - avec un minimum égal à 80% du SMIC.s'agissant de - l'indemnité journalière versée à la suite d'un accident - du travail ou d'une maladie professionnelle,elle devrait - être portée à 100% du salaire; - _l'établissement d'un minimum de ressources égal au - SMIC pour les handicapés qui travaillent et à 80% du - SMIC pour ceux dans l'incapacité de travailler. - pour les prestations familiales $: - _afin de rattraper les retards accumulés par les - *allocations familiales ,la CGT demande qu'elles soient - revalorisées immédiatement de 30% et que leur progression - soit assurée en fonction de l'évolution des salaires; - _elle exige leur versement aux travailleurs immigrés - dans les mêmes conditions que celles requises pour les - nationaux,quel que soit le pays de résidence des familles; - _elle se prononce pour une refonte du système des - prestations familiales,notamment par $: - _la fusion du salaire unique et des allocations familiales, - _l'attribution de la prestation dès le premier enfant - sans aucune discrimination et sans conditions de - ressources; - _elle revendique l'attribution aux femmes salariés d'une - indemnité de garde pour les enfants de moins de trois - ans quel que soit le mode de garde adopté. - § pour les pensions et retraites $: - les travailleurs retraités connaissent des conditions de vie - très difficiles résultant du trop faible niveau des - retraites et de leur insuffisante progression face à - l'évolution du coût de la vie.pour ces raisons et aussi parce - que pour la CGT il est fondamental de reconnaître le - droit à la retraite dans des conditions permettant de vivre - décemment,elle exige $: - _une retraite égale à 75% de tous les éléments de la - rémunération,avec un montant minimum égal au SMIC,à - 60 ans pour les hommes et 55 ans pour les femmes et les - salariés effectuant des travaux pénibles ou insalubres; - _une pension de reversion fixée,pour tous les secteurs, - à 75% de la pension principale; - _la suppression des restrictions interdisant le cumul - d'une pension propre et d'une pension de reversion; - _la revalorisation des pensions et retraites en fonction - de l'évolution réelle du coût de la vie et de la - progression des salaires; - _le paiement mensuel et d'avance des pensions et - retraites; - _la reconnaissance pour les travailleurs immigrés de droits - identiques à ceux des travailleurs français,quels que - soient leur origine et le pays de résidence des familles. - § l'amélioration de la situation des retraités passe - également pour un très grand nombre d'entre eux par une - juste progression des retraites complémentaires,progression - qui doit tenir compte ,elle aussi,de l'évolution du coût - de la vie et de celle des salaires. - § la satisfaction de ces revendications essentielles - qui doit permettre d'accorder à tous les salariés en - activité ou retraités,un meilleur système de protection - sociale,ne peut résulter de transferts financiers entre - catégories.elle suppose que le problème du financement - de la *sécurité sociale fasse l'objet d'un réexamen - d'ensemble dans le respect de ce principe et dans le cadre - d'une négociation avec les organisations syndicales.la réforme - du financement comporte notamment pour la CGT $: - _la suppression des charges indues et des transferts - effectués au détriment de la sécurité sociale; - _le déplafonnement progressif des cotisations; - _la nationalisation de l'industrie pharmaceutique qui - permettrait de réduire les coûts et les dépenses de l'assurance -maladie en supprimant les gaspillages et en - réduisant le nombre des produits; - _la suppression et la réduction du taux de la TVA sur - les biens et services de santé ouvrant droit aux - prestations de *sécurité sociale . - § de telles dispositions doivent s'inscrire dans le cadre - d'une véritable réforme démocratique de la *sécurité sociale - restituant aux représentants élus des assurés la gestion - de leur régime,fixant de façon satisfaisante la participation - budgétaire de l'*état et créant les conditions d'une - harmonisation concertée des différents régimes dans - l'intérêt de leurs bénéficiaires. - § s'agissant des retraites complémentaires ,la CGT - réclame $: - _un réexamen du financement des régimes permettant - à ceux-ci,au moyen notamment d'une meilleure participation - patronale,de faire face aux impératifs d'évolution des - retraites en liaison avec celle du coût de la vie et aussi - de l'abaissement de l'âge de la retraite; - _l'harmonisation des règlements,la coordination entre - les différents systèmes en vue de rendre possible leur - unification dans le respect intégral des droits individuels - et des droits collectifs acquis; - _la démocratisation des *institutions de retraites - complémentaires à la gestion desquelles les retraités - doivent être associés. - - la fiscalité .. - - § le système fiscal actuel représente par son caractère - de classe une des injustices les plus flagrantes du - régime.les exonérations et avantages substantiels,accordés - au cours des dix dernières années aux grandes sociétés et aux - gros porteurs de capitaux,ont été compensés par un - alourdissement de la charge fiscale supportée par les - salariés. - § très durement frappés par la TVA et les impôts - indirects qui atteignent fréquemment l'intégralité des - ressources familiales,converties en dépense de consommation, - les ménages de salariés en activité ou retraités sont en - nombre croissant assujettis à l'impôt sur le revenu,celui-ci - évoluant plus rapidement que les salaires.ainsi,les - foyers d'ouvriers et de retraités sont de plus en plus - nombreux à acquitter cet impôt.les familles de cadres - moyens ou supérieurs,et plus généralement celles où les - femmes travaillent,supportent,du fait de sa forte - augmentation,une charge fiscale très lourde.pour une - grande partie des salariés,le poids de la charge fiscale, - liée à la stagnation,voire à la diminution ,des prestations - familiales et sociales,aboutit à une régression de leur - pouvoir d'achat global. - § pour ces raisons,la CGT se prononce en faveur d'une - refonte démocratique de l'ensemble du système fiscal. - cette refonte devrait reposer sur quelques grands principes - essentiels $: - _une répartition différente entre les différents impôts - afin notamment de réduire la part résultant de la TVA, - d'assurer un meilleur rendement de l'impôt sur les - sociétés et une imposition du capital; - _une plus juste connaissance des revenus de toutes les - catégories de contribuables; - _des conditions d'imposition différentes pour les revenus - du travail,les revenus du capital et les revenus mixtes, - la rémunération de la force de travail ne pouvant par exemple - être comparée aux revenus du patrimoine foncier acquis sans - effort. - § dans ce cadre la CGT se prononce pour substituer - au système du quotient familial un dispositif de - réduction fixe étudié de manière à tenir compte des - charges réelles de famille. - § dans l'immédiat la CGT exige l'adoption des mesures - qui suivent : - - impôt sur la consommation $: - - _la réduction ou la suppression sur les produits alimentaires - et pharmaceutiques,les biens et services d'intérêt social. - la répercussion intégrale dans les prix de ces - dispositions fiscales doit être assurée par des mesures - de contrôle. - - impôt sur le revenu $: - - _une refonte complète du barème assurant l'exonération des - revenus inférieurs au SMIC et allégeant l'imposition - pour les petits et moyens salariés; - _la révision annuelle du barème en fonction de l'indice - des prix reconnu par les organisations syndicales; - _le relèvement de la déduction pour frais professionnels - de 10 à 15% avec plafonnement.cette mesure étant justifiée par - l'aggravation et la multiplication de ces frais.l'indexation - du plancher de déduction des frais professionnels sur les - prix; - _l'institution d'une réduction spéciale de 15% sur les - revenus des retraités avec établissement d'un - plafonnement; - _dans l'attente de l'attribution aux femmes salariées - d'une indemnité,prenant en compte les frais résultant - de la garde des enfants en bas âge,la déduction des - frais des revenus imposables; - _pour les jeunes salariés effectuant leur année de - service militaire,exonération de l'impôt sur les revenus - de l'année précédant celui-ci;possibilité de reporter le - paiement des impôts et des tiers provisionnels dûs pour - l'année suivant le service militaire;possibilité d'étalement - du paiement de l'impôt pour certains salariés ayant - des revenus irréguliers ou intermittents. - § la CGT rappelle son opposition au paiement de l'impôt - sur le revenu par le système de la retenue à la source,que - le *gouvernement essaie d'introduire en partant du paiement - mensuel de l'impôt.ce système en effet ,ne réglant - aucun des véritables problèmes (poids et répartition - de l'impôt) favoriserait en outre de nouveaux transferts - de charge au détriment des salariés. - - impôts locaux .. - - § la fiscalité locale ne cesse de s'alourdir et elle - frappe de plus en plus durement les foyers de travailleurs, - même ceux ne disposant que de ressources modiques. - § les modifications actuellement en cours dans ce domaine, - que le gouvernement présente comme une amélioration, - se traduisent au contraire par une aggravation des - impôts payés par les ménages. - § il est nécessaire de limiter la pression des impôts locaux - sur les ménages par une réforme démocratique se situant - dans le cadre d'une refonte des finances locales et - entrainant une répartition plus juste,notamment entre - les entreprises et les particuliers. - § en contrepartie des allégements demandés,la CGT - propose dans le but d'aboutir à une répartition plus - équitable de la charge fiscale et d'assurer des recettes - nouvelles,les mesures suivantes : - § imposition des sociétés et actionnaires $: - _élargissement de la base de l'impôt sur les sociétés par - l'abrogation des régimes de faveur (amortissements - dégressifs,provisions injustifiées,régimes spéciaux - d'imposition $...); - _abrogation des mesures bénéficiant aux revenus du - capital (suppression du prélèvement libératoire,de - l'avoir fiscal,de l'abattement,applicable aux revenus - fixes $...). - § imposition du capital $: - _création d'un impôt progressif sur le capital et l'actif - net des grandes sociétés. - § lutte contre la fraude fiscale $: - la CGT demande de véritables mesures de nature à mettre - fin à la fraude fiscale qui se situe essentiellement - au niveau des grandes sociétés,de leurs actionnaires et - de leurs dirigeants. - le problème déterminant étant celui de la connaissance - exacte des revenus de toute nature,il est indispensable - (indépendamment des mesures de publicité de l'impôt) - que l'*administration dispose de moyens suffisants pour - exercer sa mission de contrôle contre la véritable fraude. - - le droit au travail - le droit à l'emploi,sa garantie,l'indemnisation du chômage .. - le droit à l'emploi .. - - § la politique économique et sociale actuelle aggrave - l'insécurité de l'emploi et le chômage. - § les moyens fondamentaux de renverser cette tendance sont - contenus dans l'ensemble du présent programme. - § dans l'immédiat,la CGT se prononce à nouveau en faveur - de mesures générales efficaces permettant d'améliorer - sensiblement la situation de l'emploi $: - _progression du pouvoir d'achat (stimulant pour l'économie); - _avancement de l'âge ouvrant droit à la retraite; - _réduction du temps de travail sans diminution de salaire - et allègement de la charge de travail individuelle - devant entraîner l'embauche d'effectifs supplémentaires. - § ces mesures sont indissociables de la mise en oeuvre d'une -véritable politique de développement économique qui - offrirait les débouchés nécessaires à toutes les personnes - désirant occuper un emploi notamment aux jeunes et aux - femmes. - § _les textes légaux et contractuels sont susceptibles - d'apporter certaines protections appréciables mais ne - résolvent pas le problème décisif de la garantie de l'emploi - et ne règlent que partiellement celui des garanties - de ressources dont de nombreux salariés sont exclus. - § pour atteindre ces deux objectifs,la CGT formule - les revendications suivantes,pour l'ensemble des salariés - des secteurs public,nationalisé et privé,quels que soient - leur âge,leur sexe ou leur nationalité. - - la garantie de l'emploi .. - - § _droit à l'information complète et contrôlable faite - en temps utile des salariés,de leurs représentants et des - organisations syndicales sur tous les problèmes concernant - l'emploi. - _droit réel de discussion pour les syndicats et les - représentants du personnel sur les mesures susceptibles - d'entraîner des compressions d'effectifs,des licenciements ou - des modifications d'emploi,envisagées par les employeurs. - _droit de recours,pour les syndicats et les représentants - du personnel,à des instances paritaires et à des instances - juridiques habilitées à cet effet en cas de difficultés - dans l'entreprise $: le recours suspend toute décision de - licenciement. - _interdiction de tout licenciement non accompagné d'une - mesure de reclassement préalable,garantissant pleinement - les droits des travailleurs et leur assurant une - situation équivalente. - _protections équivalentes des salariés licenciés en cas - de faillite (liquidation de biens,règlement judiciaire) - par la mise en oeuvre de la responsabilité collective - du patronat. - _réemploi obligatoire des femmes dès leur retour du - congé légal d'un an pour élever un enfant et des jeunes à - l'issue du *service national avec maintien des avantages - acquis. - _interdiction de tout licenciement prioritaire basé sur - l'âge,le sexe ou la nationalité. - _application intégrale et extension à l'ensemble des - salariés des droits découlant des accords nationaux - interprofessionnels,lois et règlements,sur la sécurité de - l'emploi,la formation et le perfectionnement professionnels. - _droit de contrôle (et moyens réels de l'assurer), - sur l'utilisation des fonds publics alloués aux entreprises - pour création ou évolution d'emplois. - _suppression des contrats à durée limitée. - _personnel permanent en nombre suffisant permettant - d'assurer les travaux courants de l'entreprise et excluant - dans ces domaines le recours à des entreprises extérieures - de main d'oeuvre intérimaire ou temporaire. - _révision profonde des conditions d'introduction de - séjour et d'emploi de la main-d'oeuvre immigrée et prise - en compte des revendications formulées à cet égard par la - CGT garanties par un statut à caractère social et - démocratique. - _protection des immigrés contre les trafics et les abus - dont ils sont victimes,quels qu'en soient les auteurs et - stricte application de la loi du 6 juillet 1973 relative à - la répression des trafics de main-d'oeuvre. - _l'*office national d'immigration doit être le seul - organisme compétent chargé du recrutement à l'étranger, - de l'introduction et de l'accueil des immigrés et de leurs - familles. - - garantie des ressources .. - - § lorsqu'un emploi ne peut être donné à ceux qui veulent - travailler,il faut leur garantir des ressources décentes - sans limitation de durée : - _tout salarié privé d'emploi par son employeur et qui est - inscrit comme demandeur d'emploi doit bénéficier de - ressources égales à son salaire antérieur. - _tous les autres demandeurs d'emploi ,y compris ceux qui - recherchent un premier emploi doivent être assurés d'un - minimum de ressources égal au SMIC. - _garantie des ressources sur la base de l'horaire et du - salaire habituels pour les salariés touchés par des réductions - d'horaires. - _garantie de ressources égales au salaire antérieur à tous - les salariés dont le reclassement dans un emploi équivalent - n'a pu être assuré. - _revalorisation des allocations d'aide publique en matière - de chômage total ou partiel au taux de 50% du SMIC, - et élévation substantielle des plafonds de ressources. - _généralisation de l'action du *fonds national de l'emploi. - _généralisation de l'accord national interprofessionnel - du 14 octobre 1974,sur l'allocation supplémentaire d'attente -à tous les salariés victimes de licenciement. - _généralisation et amélioration de l'accord national - interprofessionnel du 27 mars 1972 sur la garantie - de ressources aux salariés privés d'emploi de plus de - 60 ans. - _attribution de délais de paiement et aide en matière - d'impôts,de loyer,de dettes et crédits pour les salariés - et leurs familles pendant la période où ils sont sans - emploi et inscrits comme demandeurs d'emplois. - _suspension immédiate de toutes poursuites saisies et voies - d'exécution à l'encontre des chômeurs. - _cotisation ASSEDIC à la charge exclusive des - employeurs. - - l'abaissement de l'âge de la retraite .. - - § alors que des centaines de milliers de travailleurs - connaissent le chômage et que les jeunes sont de plus en plus - nombreux à ne pouvoir trouver un emploi à l'issue de leur - temps de scolarité,*pouvoir et *patronat contraignent - des salariés âgés de plus de 60 ans à continuer leur activité - professionnelle. - § l'abaissement de l'âge de la retraite se justifie - pleinement $: - _pour des raisons humaines $:les statistiques font - clairement apparaître que dans leur grande masse les - travailleurs,et parmi eux tout particulièrement les - ouvriers de l'industrie et de l'agriculture,ont une durée - moyenne de vie plus brève que les autres catégories de - la population,ceci étant dû notamment aux conditions de - travail dont la CGT demande l'amélioration.le droit doit - leur être reconnu de pouvoir bénéficier véritablement et - dans des conditions décentes de leur retraite. - par ailleurs,les femmes de plus en plus nombreuses parmi - les salariés,connaissent dans le contexte actuel une - fatigue accrue du fait de leur double fonction de - travailleuse et de mère de famille,et de l'insuffisance - notoire des équipements sociaux collectifs qui devraient - être créés afin d'alléger leurs tâches familiales - de ménagères.dans ces conditions,la possibilité doit leur - être offerte,ainsi qu'aux travailleurs des professions les - plus pénibles de pouvoir bénéficier d'une retraite - anticipée. - _pour des raisons économiques et sociales $:les emplois - libérés par les travailleurs admis à faire valoir leurs - droits à la retraite au taux plein pourraient être - occupés par des salariés présentement en chômage.ceci apparaît - plus sain sur le plan économique et plus juste sur le plan - social. - § pour ces deux motifs essentiels,la CGT entend faire - aboutir la revendication de l'âge de la retraite au taux - plein à 60 ans pour les hommes et 55 ans pour les femmes - et les salariés effectuant des travaux pénibles ou insalubres, - en garantissant les avantages acquis par certaines - catégories des secteurs public et nationalisé. - - la réduction de la durée du travail .. - - § la nécessité d'un allègement de la charge de travail, - élément essentiel de l'amélioration des conditions de - travail,les besoins croissants de temps libre pour le - repos,les loisirs,l'information,l'accès à la culture, - l'aggravation de la situation de l'emploi,font de la réduction - de la durée du travail sans diminution des salaires une - revendication qu'il est urgent de satisfaire. - § elle peut s'appliquer notamment à l'échelle de la - semaine,par la réduction et la limitation de la durée - hebdomadaire,et à l'échelle de l'année,par l'allongement - des congés payés. - § les engagements pris par le patronat en mai 1968 n'ont - pas été tenus $: le retour à la semaine de 40 heures sans - diminution des salaires n'a été rendu effectif que pour - une minorité de salariés. - § la durée du travail demeure très élevée dans certains - secteurs et certaines entreprises,alors que se multiplient - les licenciements et les réductions d'horaires entrainant - d'importantes diminutions de salaires. - § la durée maximale légale du travail demeure fixée - à un niveau inadmissible. - § en conséquence,la CGT demande $: - _retour rapide et effectif aux 40 heures dans toutes les - branches et pour toutes les catégories de travailleurs, - avec compensation intégrale des effets de la diminution - des horaires sur les salaires. - _attribution à tous les salariés d'une cinquième - semaine de congés payés,pouvant être prise en dehors de - la période légale. - _augmentation des effectifs pour permettre la réduction - de la durée du travail pour toutes les catégories de - travailleurs,sans accroissement de l'intensité du travail. - _semaine de travail de cinq jours suivis de deux jours - de repos consécutifs obligatoires. - _abaissement progressif de la durée du travail en dessous - de 40 heures pour les salariés dont les conditions de travail - sont particulièrement pénibles. - _limitation à 45 heures de la durée hebdomadaire maximale - du travail .les heures supplémentaires effectuées dans - cette limite et seulement dans des cas exceptionnels - seront obligatoirement rémunérées comme telles et - récupérées en repos compensateurs. - _suppression des dérogations permanentes et du système - des équivalences. - _limitation de l'amplitude de la journée de travail. - - la formation et le perfectionnement professionnels .. - - § la rapidité de l'évolution technologique transforme - les conditions d'exercice de l'ensemble des professions. - la politique de concentration des entreprises contraint - les travailleurs à des reconversions profondes.la crise - aggravée du système capitaliste et la détérioration - de la situation de l'emploi rendent ces demandes - de conversion encore plus nombreuses et plus difficiles. - § les travailleurs formulent l'exigence légitime $: - _d'acquérir un savoir plus large,plus complet correspondant - à l'état présent des connaissances, - _de pouvoir se perfectionner afin d'être mieux garantis - dans leur emploi et d'accéder à une promotion réelle, - _de pouvoir se reconvertir à d'autres activités - professionnelles,avec le maintien,au minimum,de leur - niveau de qualification antérieure. - § résultat des luttes, l'*accord du 9 juillet 1970 a - ouvert aux travailleurs le droit à la formation.il a donné - également aux apprentis des garanties nouvelles.les lois du - 16 juillet 1971,malgré leurs insuffisances et leurs - aspects restrictifs ont dû confirmer ce droit et ces - garanties.cependant,la mise en application se heurte à - l'attitude négative du patronat et du gouvernement - qui entendent faire de ces textes des instruments au - service de leurs seuls intérêts. - § afin de permettre aux travailleurs du secteur privé - et du secteur public d'exercer ce droit et aux apprentis - de disposer des nouvelles garanties,la CGT préconise les - revendications suivantes : - - apprentissage .. - - § la situation des jeunes sous contrat d'*apprentissage doit - être améliorée par $: - _l'augmentation du minimum légal des rémunérations des - apprentis avec maintien du versement des allocations - familiales aux parents (rémunération égale à 40% du - SMIC pendant la durée du premier tiers - de l'apprentissage,60% durant le deuxième tiers,80% - pendant le troisième); - _l'application ,sans dérogation,de l'horaire annuel - de 360 heures dans les *centres de formation d'apprentis - (horaire porté progressivement à 400 heures); - _la garantie de recevoir dans l'entreprise une formation - pratique complète et préalablement définie; - _la reconnaissance du plein droit syndical. - § les *centres de formation d'apprentis doivent être - placés sous la tutelle et le contrôle directs de l'éducation - *nationale . - - formation professionnelle continue .. - - § cette formation est un droit ouvert à tous les travailleurs - des secteurs privé,public et nationalisé. - § pour assurer la formation continue des travailleurs,la - CGT pose les revendications suivantes : - _des mesures sociales doivent être prises concernant $: - _la généralisation et la simplification du maintien - de la rémunération des travailleurs en congé formation - ou des demandeurs d'emploi allant en stage, - _une protection sociale complète des stagiaires $: - _le remboursement intégral des frais de transport et - d'hébergement, - _la prise en charge intégrale par l'état ou l'entreprise - du coût des stages, - _les dispositions particulières permettant aux travailleuses - d'accéder sans discrimination à la formation et au - perfectionnement professionnels. - _ des opérations de mise à niveau sont nécessaires pour - certaines catégories dont l'accès à une formation et à une - qualification est freiné par l'insuffisance du niveau - de formation générale.ces opérations doivent relever - essentiellement de l'*éducation nationale et faire - l'objet d'un financement particulier. - § ces actions de mise à niveau sont particulièrement - nécessaires $: - _pour les femmes désirant prendre un emploi ou reprendre - une activité professionnelle après une interruption - pour raisons familiales;ces sessions de rattrapage doivent - être rémunérées; - _pour les travailleurs immigrés,afin de permettre le - développement de leur formation professionnelle et leur - promotion sociale $: les cours d'alphabétisation et d'apprentissage -du français doivent être généralisés,sur - le temps de travail et rémunérés comme tel.ces actions - doivent être à la charge de l'*état ,des employeurs et - des pays d'origine,sous la responsabilité de l'éducation - *nationale ,indépendamment des lois et des - accords relatifs à la formation professionnelle - continue; - _pour les jeunes sans formation professionnelle $: - _pour ceux qui sont sous contrat de travail,doit être - rendue effective l'application des dispositions législatives - prévoyant 200 heures de formation pendant le temps de travail - et avec le maintien intégral du salaire (ces 200 heures - devant être considérées comme un minimum), - _pour ceux qui sont sans travail,il faut développer et - améliorer les actions de préformation de l'*éducation - nationale et de l'AFPA,et revaloriser les indemnités - des stagiaires. - _un développement important de l'AFPA doit être - réalisé pour lui permettre de répondre sans délai - aux besoins de formation des demandeurs d'emploi et de - participer à la mise en oeuvre du congé formation, - y compris par la création de sections mobiles opérant hors - des centres,au plus près des travailleurs.l'accès des - femmes et des travailleurs immigrés dans toutes les - spécialités doit être rendu possible par des mesures - d'adaptation des *centres de l'AFPA.le libre - exercice du droit syndical doit être reconnu aux stagiaires de - l'AFPA. - _les établissements de l'*éducation nationale doivent - être systématiquement ouverts à la formation continue, - ce qui implique des moyens nouveaux et des structures - appropriées (dotation supplémentaire de crédits de - fonctionnement et d'équipement,création de postes d'enseignants -et d'autres personnels). - _la reconnaissance des diplômes,des connaissances - acquises et des niveaux de qualification atteints, - doit être assurée en s'appuyant sur l'inscription - désormais prévue dans les clauses obligatoires des - conventions collectives. - _dans le secteur public,le droit des personnels à la - formation doit s'exercer sans entrave. - _pour les non-titulaires de l'*état ,exclus jusque-là de la - formation continue,le droit doit être immédiatement - ouvert et les stages doivent avoir,parmi leurs objectifs, - de contribuer à la titularisation. - - financement .. - - § en ce qui concerne le financement,la CGT réaffirme - sa proposition d'un *fonds national de formation - et de perfectionnement,alimenté parallèlement par des - versements des employeurs et des crédits d'*état . - § ce *fonds serait soumis au contrôle syndical et - son institution est le seul moyen d'éviter les gaspillages. - § dans le système actuel,le taux de la participation - patronale à la formation continue doit être portée à 2% - du montant des salaires en 1976,comme le prévoit la loi - du 16 juillet 1971,que le gouvernement doit appliquer. - § la taxe d'apprentissage doit revenir au taux,antérieur à - 1972,de 0-6% des salaires. - - contrôle des organisations syndicales des travailleurs .. - - § le contrôle syndical doit être accru sur toutes les - actions de formation,aussi bien en ce qui concerne la - formation initiale que la formation continue.cela implique - le renforcement $: - _des prérogatives des représentants des travailleurs - dans toutes les instances traitant de la formation; - _des prérogatives des *comités d'entreprise ainsi que des - délégués du personnel en l'absence de *comité d'entreprise ; - _des moyens donnés à leurs membres et à ceux de la - *commission d'emploi et *formation professionnelle , - (crédit suffisant d'heures rémunérées). - - faire appliquer et élargir .. - - § la CGT engage ses organisations et l'ensemble - des travailleurs $: - _à exiger partout l'application intégrale des dispositions - contractuelles et légales,ce qui doit permettre - actuellement de faire bénéficier,au minimum,un travailleur - sur cinq d'un mois de formation,chaque année; - _à réclamer l'élargissement de ces dispositions, - notamment des clauses de l'accord interprofessionnel du - 9 juillet 1970 qui peuvent être améliorées à tous les - niveaux,notamment au plan des conventions collectives; - _à faire accélérer l'établissement des listes de stages - paritairement agréés sur des critères précis; - _à poursuivre l'action à tous les niveaux,et particulièrement - à celui des entreprises,pour obtenir les conditions et - les moyens nécessaires au plein exercice du droit au - congé formation. - - le respect de la vie des travailleurs .. - l'amélioration des conditions de travail .. - - § l'aggravation des conditions de travail se généralise.elle - atteint,sous des formes et à des degrés divers,toutes - les catégories de salariés $: ouvriers,employés,techniciens, - ingénieurs,cadres. - § l'emploi des techniques nouvelles au lieu d'alléger - la peine des hommes s'accompagne d'une accélération - des cadences,d'une tendance accentuée à la déqualification - du travail et à la parcellisation des tâches,du développement - du travail en continu,de l'inadaptation des locaux de - travail,de l'absence ou de l'insuffisance des moyens de - protection de la santé et de la sécurité.il en découle une - usure intensive des forces des travailleurs,une augmentation - importante du nombre et de la gravité des accidents et - maladies,situation qui contribue à aggraver l'insécurité de - l'emploi,de la classification et des ressources. - § les 28 millions de journées de travail perdues - annuellement pour incapacités temporaires traduisent les - conséquences extrêmement graves des conditions actuelles de - travail sur la santé et l'intégrité physique des travailleurs. - § les revendications de la CGT ont été présentées dans le - document adopté le 2 février 1972 par la *commission - exécutive et précisées en vue des négociations avec le - CNPF.elles tendent à réduire la pénibilité du travail, - à prémunir les travailleurs contre les exigences de - rendement accru,à s'opposer à la déqualification et à - la parcellisation extrême du travail,à obtenir une - protection efficace de la santé et de la sécurité des - travailleurs,à ouvrir des possibilités de promotion - professionnelle. - § leur satisfaction exige notamment $: - _l'affectation d'un pourcentage minimum des investissements - annuels à l'étude et à la réalisation de l'amélioration des - conditions de travail; - _la mise à la disposition des travailleurs,de leurs - représentants élus,des syndicats,des moyens d'information, - de contrôle,d'expression et d'intervention sur tous les - sujets concernant les conditions de travail,lesquels doivent - obligatoirement,sur demande des syndicats,faire l'objet - de négociations aux différents niveaux. - § outre la réduction de la durée du travail et l'augmentation -des effectifs,éléments essentiels de - l'amélioration des conditions de travail,la révision des - classifications,le droit à la formation et au - perfectionnement professionnels,qui trouvent sur ce plan - une justification particulière,la CGT défend les - revendications suivantes : - - § charge de travail .. - - la charge de travail physique ou intellectuelle doit - être ramenée ou contenue dans des limites n'entrainant - pas une fatigue excessive pour le travailleur. - les cadences de travail notamment doivent être limitées - ou réduites en conséquence. - ce résultat peut être obtenu par $: - _l'accroissement des effectifs,lesquels doivent tenir - compte notamment des absences probables, - _la limitation du nombre de pièces à produire ou d'opérations - à réaliser, - _la réduction du nombre de machines ou d'appareils à - conduire ou à surveiller, - _la réduction de la vitesse de la chaîne, - _l'affichage dans les ateliers ou services des temps - alloués,de la vitesse de la chaîne,des effectifs occupés, - de la définition des opérations à effectuer sur chaque - poste de travail ou du nombre de machines ou d'appareils - à conduire ou à surveiller doit être rendu obligatoire; - _toute modification ayant pour effet d'accroître la charge - de travail individuelle doit être interdite; - _les délégués syndicaux,du personnel et du CE,les - travailleurs concernés,doivent être informés au préalable - et consultés sur toutes modifications du processus de travail. - - § organisation du temps de travail .. - - _temps de repos payés en cours de journée,avec arrêt - effectif,le cas échéant,de la machine ou des appareils ou - de la chaîne; - _mise en place,pour les travaux sur chaîne,de remplaçants - en nombre suffisant pour permettre des arrêts individuels; - _temps de repos supplémentaires pour les femmes enceintes - et allongement à 18 semaines du congé légal de maternité; - _installation de salles de repos à proximité des lieux - de travail; - _pour les travailleurs en équipes $: allongement du temps - de pause payé et paiement,comme temps de travail,du temps - total de présence dans l'entreprise; - _limitation du travail en continu et en semi-continu - aux seuls postes de travail où existent réellement des - impératifs techniques; - _compensation pour les travailleurs postés en continu - ou semi-continu,des conséquences de cette forme de travail - par $: - l'abaissement de la durée du travail en dessous de - 40 heures par $: - l'introduction d'une cinquième équipe (continu) ou d'une -quatrième équipe (semi-continu), - l'avancement de l'âge de la retraite, - l'allongement des congés payés; - _organisation des systèmes de rotation des postes par - discussion entre la direction et les organisations - syndicales et avec l'accord des intéressés; - _pour les travaux particulièrement éprouvants ou - comportant des risques pour la santé,changement de poste - en cours de journée,avec maintien du salaire et - renforcement de la surveillance médicale; - _préalablement à toute application des horaires variables - ou du travail à temps partiel,établissement de garanties - portant notamment sur les avantages acquis et l'exercice - des droits syndicaux,ces garanties devant faire l'objet - de négociations avec les organisations syndicales. - - formation et promotion professionnelles .. - - § la lutte contre les effets du caractère épuisant et - asservissant du travail comporte l'exigence du droit - à la formation et à la promotion pour tout travailleur, - du manoeuvre à l'ingénieur,selon les aptitudes et - capacités de chacun. - § ce qui implique $: - _la modification de l'organisation du travail de façon - à en diminuer la pénibilité,à en réduire la parcellisation et - à en augmenter l'intérêt et le degré de qualification; - _la possibilité pour tous les ouvriers spécialisés - qui en feront la demande de changer de poste de travail, - après un an d'ancienneté,afin d'étendre leur expérience - ou d'acquérir une polyvalence donnant accès à une - qualification supérieure; - _des dispositions particulières pour favoriser l'accès - à une formation de base des travailleurs et travailleuses - n'en ayant pas reçue; - _la garantie pour tous les travailleurs de pouvoir - franchir,au bénéfice de l'expérience et de l'enrichissement - de leurs connaissances,les échelons dans la hiérarchie - des classifications et des salaires,leur assurant ainsi - une carrière normale. - - rôle de l'encadrement .. - - § il importe qu'en matière de conditions de travail,les - ingénieurs,cadres,techniciens et agents de maîtrise - aient toutes possibilités de donner leur avis sur le - plan professionnel,même lorsqu'il est en opposition avec - l'orientation officielle de l'entreprise,ce qui suppose $: - d'une part,les modalités d'application des garanties - collectives,les protégeant contre les pressions de leurs - employeurs, - d'autre part,les garanties liées à leurs responsabilités - sur les conditions de travail des autres salariés et - d'en fixer les limites. - - sécurité des personnes .. - - § sécurité des travailleurs assurant les paiements, - encaissements et transports de fonds. - § toutes dispositions matérielles doivent être prises - pour prémunir les travailleurs concernés contre les - risques d'agressions. - § les effectifs de personnel,en particulier,doivent être - en nombre suffisant. - - l'hygiène et la sécurité du travail .. - - § liée étroitement aux problèmes posés par les conditions - de travail,l'amélioration des conditions d'hygiène et - de sécurité implique en tout premier lieu que la - réglementation existante soit strictement appliquée - sur tous les lieux de travail,qu'elle soit adaptée aux - conditions et exigences actuelles et qu'elle évolue - constamment en fonction des conditions et exigences - nouvelles. - § les dispositions et l'action,en matière d'hygiène et - sécurité,doivent avoir avant tout un caractère préventif, - ce qui suppose notamment que la sécurité soit intégrée - dès le stade de l'élaboration des projets de construction, - de la mise au point des méthodes de travail,de la - conception et des études de machines,locaux,produits - et processus de fabrication. - § les organisations syndicales,les comités d'entreprises, - les délégués du personnel ont pleine compétence pour - l'ensemble de ces problèmes touchant aux conditions de - travail.les *comités d'hygiène et de sécurité ont un - rôle particulièrement important. - - comité hygiène et sécurité .. - - § à cet égard,leur efficacité doit être renforcée par les - dispositions suivantes : - § _institution de *comités d'hygiène et de sécurité dans - toutes les entreprises et établissements industriels et - commerciaux du secteur privé,comme des secteurs public et - nationalisé.leurs membres doivent disposer de pouvoirs - réels,notamment celui d'obtenir l'interruption du travail dans - tous les cas où celui-ci présente un caractère dangereux - et de saisir les juridictions compétentes. - § la liberté de circulation doit leur être garantie - dans tous les lieux de travail.ils doivent disposer du - temps nécessaire pour l'accomplissement de leur mission - et en toute hypothèse d'un minimum au moins égal au crédit - d'heures des délégués du personnel. - § _les membres des *comités d'hygiène et de sécurité - doivent être élus par l'ensemble des salariés concernés. - ils doivent bénéficier d'une protection identique - à celle des délégués du personnel dans toutes les - entreprises.le secrétaire du *comité d'hygiène et de sécurité - doit être un représentant des travailleurs désigné - par les membres élus du *comité d'hygiène et de sécurité. - § _le *comité d'hygiène et de sécurité a compétence - pour l'ensemble du personnel travaillant dans l'entreprise - qui comprend également le personnel intérimaire et - intermittent. - § la responsabilité juridique en matière d'accidents du - travail ou de maladies professionnelles incombe - exclusivement à l'employeur.elle ne peut en aucun cas - être imputée au personnel d'encadrement. - § outre les conditions qui leur sont faites,les ingénieurs, - cadres,techniciens et agents de maîtrise jouent un rôle - important dans le développement de la sécurité au sein - de l'entreprise.ils doivent pouvoir travailler en liaison avec - le médecin du travail et l'ingénieur de sécurité et - avoir connaissance de toutes les remarques des CHS,ainsi - que des autres représentants des salariés et des organisations - syndicales. - § toutes dispositions,telles que le contrôle médical - organisé à l'initiative des employeurs,tendant à exercer - une pression sur les salariés malades ou accidentés, - en vue de leur imposer une reprise prématurée du travail, - sont vigoureusement combattues par la CGT et doivent - être interdites. - § les consignes de sécurité doivent être adaptées et - traduites dans leur langue maternelle pour les travailleurs - immigrés. - § des stages d'information sur les questions relatives à la - sécurité doivent être organisés pour les travailleurs - nouvellement embauchés,le temps passé à ces stages étant - considéré comme temps de travail et payé comme tel, - sans imputation sur le temps du congé formation - professionnelle ni sur les fonds dévolus à celle-ci. - § la compétence du *comité d'hygiène et sécurité - doit s'étendre sans restriction aux problèmes de la - pollution $: toutes dispositions seront prises pour qu'il - puisse veiller au respect des normes nationales ou - internationales concernant le bruit et la teneur - en produits nocifs non seulement de l'atmosphère des - ateliers mais aussi des gaz,liquides et solides rejetés - par l'entreprise. - § dans ce domaine,la CGT dénonce vigoureusement le - chantage exercé sous la forme des faux dilemnes $: - usine insalubre (ou polluante) ou fermeture (ou non - installation). - - médecine du travail .. - - § la médecine du travail est un élément important du - système de protection de l'homme sur le lieu de travail. - § il convient d'établir avec l'ensemble des parties - intéressées un statut du médecin du travail. - § ce statut devra notamment fixer les conditions de - rémunération et définir une protection qui assurent au médecin - du travail une indépendance totale à l'égard de l'employeur. - _détermination du nombre des vacations du médecin - du travail de telle sorte que le tiers de son temps - lui permette réellement de remplir les tâches qui sont - les siennes en matière de prévention de la pathologie du - travail,connaissance des conditions concrètes de réalisation - du travail,recherche des moyens d'améliorer l'hygiène - et la sécurité. - _modification du décret du 13 juin 1969,notamment - en ce qui concerne la gestion des services médicaux - interentreprises.les représentants élus des établissements - concernés,ainsi que ceux des organisations syndicales - représentatives doivent participer de plein droit à la gestion - des centres médicaux interentreprises,ce qui implique $: - _que leur représentation au sein du *conseil d'administration - soit assurée dans des conditions leur permettant une - intervention effective dans les décisions et sur l'activité - des centres; - _qu'ils disposent du temps,des possibilités de déplacement - et des moyens d'information nécessaires à l'accomplissement - de leur mandat,l'indemnisation du temps passé étant - assumée par les employeurs. - § le médecin du travail sera obligatoirement consulté - pour toutes les questions relevant des conditions de - travail,de la prévention,de l'hygiène et de la sécurité - du travail. - - les comités techniques régionaux et nationaux .. - - § de par leurs attributions,les *comités techniques - régionaux et nationaux peuvent prendre des mesures - comblant le retard de la réglementation sur le - développement des sciences et des techniques influençant les - conditions de travail,de prévention,d'hygiène et de sécurité. - § les conditions actuelles de composition et de fonctionnement - des *comités techniques régionaux ne leur permettent pas - de jouer correctement et pleinement leur rôle.il est - nécessaire d'imposer $: - _l'augmentation du nombre de *comités techniques régionaux et - le regroupement des activités professionnelles tout en - assurant aux représentants salariés le temps et les - moyens d'assurer leur mandat. - - dispositions législatives .. - - § la CGT demande que tous les produits présentant - un danger de quelque nature que ce soit avant d'être - utilisés dans l'industrie,soient subordonnés à un visa - délivré par un organisme national compétent dont il - convient de débattre avec les *pouvoirs publics.le même - organisme devrait être chargé de déterminer des normes - nationales fixant la teneur maximale tolérable de - l'atmosphère des lieux de travail en substances - nuisibles,ainsi que les limites du bruit et de la - radioactivité. - § ces dispositions s'appliquent aux produits actuellement - en usage qui entraînent des conséquences nuisibles pour - la santé. - _création d'une sous-commission au sein de la - *commission d'hygiène industrielle chargée d'établir, - de tenir à jour et de communiquer les listes de - substances et agents cancérigènes à interdire dans la - production,à contrôler ou à soumettre à autorisation avant - utilisation. - _établir pour chaque travailleur exposé à des substances - et agents cancérigènes ou autres substances nocives, - un livret médical mentionnant les produits dangereux - avec lesquels il est en contact durant sa carrière. - _la CGT demande,en outre,le renforcement du corps de - l'*inspection du travail et de l'*inspection médicale - qui devraient être dotés de pouvoirs accrus en matière - de contrôle et de sanction à l'encontre des employeurs - violant les règles de sécurité. - - les droits et libertés des travailleurs .. - les droits .. - - § l'action de classe a libéré le travailleur d'un certain - nombre de contraintes imposées par le patronat - dans l'entreprise capitaliste,et lui a permis de conquérir - certains droits. - § sans perdre de vue que ces contraintes ont leur origine - dans l'exploitation capitaliste et que seule la suppression - de celle-ci permettra leur disparition complète, - sans perdre de vue également que des prétendus nouveaux - "droits" suggérés ou offerts (telle "la participation" - sous ses diverses formes),visent en fait à l'intégration - du travailleur dans le système et constituent par là même - une duperie,il est possible et nécessaire d'élargir - les droits existants. - § la CGT entend promouvoir aussi bien les droits - des travailleurs pris individuellement que les droits de - la collectivité des travailleurs,représentés par le - syndicat et les diverses institutions existantes ou à - créer,y compris dans les petites entreprises. - § dans cet esprit,elle oeuvre pour une législation - interdisant aux employeurs de demander au personnel d'encadrement -d'exercer sur les travailleurs des pressions - directes ou indirectes non relatives à l'accomplissement - de l'activité professionnelle. - - § la CGT réclame concernant .. - information .. - - _droit pour le travailleur d'être préalablement informé, - avant toute décision,de toute mesure le concernant - (qu'il s'agisse de la détermination de ses conditions - de travail,de modification à son contrat de travail, - de sanctions,y compris le licenciement $...); - _droit de débattre (assisté s'il le désire d'un délégué - syndical ou d'un délégué du personnel) avec la direction - des intentions de cette dernière à son égard; - _toute mesure prise en violation de ces droits,comme - toute disposition dont les motivations seraient reconnues - inexactes,doivent entraîner leur annulation. - - promotion .. - - _droit effectif à la promotion par la priorité absolue - donnée aux travailleurs de l'entreprise en cas de poste - d'une qualification à pourvoir. - - rémunérations .. - - _droit pour chacun à la connaissance des salaires de - tous les membres du personnel de l'entreprise. - - règlement intérieur .. - - _suppression du règlement intérieur dans sa conception - actuelle qui permet à l'employeur d'édicter souverainement - des sanctions et de se rendre ainsi justice à lui-même - par la voie de décisions unilatérales. - - information économique,consultation,contrôle .. - - _droit à l'information à la consultation et au contrôle - sur tout ce qui concerne l'activité de l'entreprise,en - priorité absolue par le canal des représentants du - personnel.cette pratique permettant d'analyser l'information - et de combattre,le cas échéant,tout caractère de mise en - condition. - _mise en place des *comités d'entreprise de tous les - éléments d'informations économiques,en particulier $: - _tous les documents permettant une connaissance approfondie - et véridique des éléments comptables de la gestion passée - et d'avenir au niveau de l'entreprise,du groupe,de la - branche d'industrie sur le plan national et international. - ces documents doivent être fournis dans toutes les - sociétés quelle qu'en soit leur forme juridique. - _toutes les informations relatives au travail et la - gestion du personnel. - _suppression de toute obligation de discrétion dans - l'information économique. - _droit à l'assistance d'un expert-comptable dans toutes - les sociétés et pouvant être choisi en tout lieu. - _dotation des *comités d'entreprise en moyens matériels - et financiers leur permettant l'étude des questions - économiques. - _mise en place de *comités centraux de groupes . - - information syndicale .. - - _droit à un temps suffisant selon les besoins constatés - dans chaque entreprise _et en aucun cas,inférieur à - une heure par mois_pris sur le temps de travail et payé - comme tel,pour participer à des réunions organisées par les - syndicats,dans des locaux mis à leur disposition par - l'entreprise. - - représentation .. - - _dans les grandes entreprises et dans celles où la nature du - travail aboutit à la dispersion des salariés ou à leur - rotation en équipes successives,augmentation du nombre des - délégués du personnel,des membres du *comité d'entreprise - et du nombre des délégués au CHS. - § la CGT combat les tentatives répétées du patronat - et du pouvoir,de mettre en place des organisations de - collaboration de classe n'ayant de syndicales que le nom - telle par exemple la CFT. - § elle rappelle que l'une des garanties essentielles - de la liberté syndicale réside dans le droit pour les - seules organisations syndicales représentatives de - présenter des candidatures au premier tour des élections - professionnelles.afin de renforcer ce droit et pour déjouer - les manoeuvres patronales la CGT réclame $: - _un contrôle plus strict et une aggravation des pénalités - encourues par les employeurs portant atteinte à la - liberté de vote; - _l'abrogation des dispositions légales,telles celles relatives - aux *comités centraux d'entreprises,qui déforment - la représentation proportionnelle à l'entreprise; - _que seules les organisations syndicales représentatives - soient habilitées à présenter des candidatures y compris - au deuxième tour des élections quand celui-ci s'avère - nécessaire; - _que les candidats soient élus dans l'ordre de présentation - de la liste. - § la CGT demande également que la représentation - des organisations syndicales dans les organismes - paritaires,tripartites ou de caractère officiel,soit établie - proportionnellement à l'influence réelle de chacune d'elle, - et soit réservée aux seules organisations représentatives à - l'exclusion de toute autre;qu'en conséquence il soit procédé - à l'éviction des organisations telles que la CFT. - - les libertés .. - libertés syndicales .. - - § amélioration et extension des dispositions de la loi du - 27 décembre 1968,soit $: - _reconnaissance de l'organisation syndicale et des - conséquences légales de cette reconnaissance dans tous - les établissements et entreprises quel que soit l'effectif - du personnel; - _reconnaissance de la représentation spécifique de - toutes les organisations représentatives d'ingénieurs,cadres - et techniciens; - _révision des textes législatifs ou réglementaires - restreignant le rôle des organisations syndicales de - salariés; - _libre accès et liberté de circulation en tout lieu - de l'entreprise et à tout moment,aux délégués élus,aux - délégués et représentants syndicaux; - _possibilité pour les délégués représentants locaux - régionaux ou nationaux des organisations syndicales - représentatives d'avoir accès dans les entreprises pour - y rencontrer les travailleurs, y compris là où n'existe - pas d'organisation syndicale; - _collecte des cotisations et diffusion des publications - syndicales sur les lieux et pendant les heures de travail. - § mise à la disposition des organisations syndicales d'un - contingent d'heures nécessaires à leur fonctionnement - attribué proportionnellement à leur influence telle - qu'elle ressort des élections professionnelles. - - protection .. - - § interdiction et nullité du licenciement et de toutes - les formes de répression patronale visant les élus - et représentants du personnel,les salariés exerçant un mandat - ou une fonction confiés par l'organisation syndicale ou - exercé en son nom,et,tout salarié en raison de ses - opinions,croyances ou appartenance à une organisation - syndicale ou à un parti ou prononcé en violation des - droits et libertés syndicales. - - mandat syndical .. - - § droit inconditionnel pour tout salarié à l'exercice d'un - mandat électif et de délégué syndical,cela exige que - la charge de travail de l'intéressé soit diminuée - dans la même proportion que le temps qu'il doit consacrer - à son travail ou qu'il soit remplacé pendant l'exercice - de ses fonctions.cela exige également que les - dispositions soient prises pour que l'élu des travailleurs - puisse continuer à exercer son activité professionnelle. - § éligibilité pour les travailleurs immigrés dans les mêmes - conditions que celles s'appliquant aux travailleurs - français,et levée de toutes restrictions concernant leur - accès aux responsabilités de représentation,de direction - et d'administration des organisations syndicales. - - grève .. - - § abrogation de toutes les restrictions à l'exercice du - droit de grève,y compris celle résultant de l'utilisation - abusive de la notion de "liberté du travail". - § interdiction de toute retenue sur le salaire ou les primes - excédant le prorata de la durée de la grève. - § interdiction du lock-out,qu'il soit ou non camouflé sous - l'appellation de chômage technique. - - libertés et informatique .. - - § en cas d'établissement de fichiers de renseignements, - notamment informatisés par des services administratifs - publics ou privés,qu'il soit interdit de recueillir et de - mémoriser des informations sans rapport direct avec l'objet - spécifique du fichier,et en particulier des données - ou appréciations susceptibles de nuire au travailleur - dans sa vie professionnelle ou de porter entrave - à l'exercice des libertés individuelles ou collectives - dont il est en droit de se réclamer. - § institution de système de contrôle permettant de veiller - à la stricte application et au respect du principe - énoncé ci-dessus. - - l'éducation syndicale .. - - § étant donné le rôle et les responsabilités des syndicats - dans la société moderne,l'éducation syndicale est un - élément de l'éducation dans son ensemble. - § son développement pose de nombreux problèmes au premier - rang desquels le financement de ces activités et - l'amélioration du congé éducation. - § s'agissant du financement,la CGT estime qu'en premier - lieu le patronat doit prendre en charge le paiement - de la perte de salaire qu'entraîne l'utilisation des - congés éducation.les comités d'entreprise versant,quant - à eux,des bourses d'études aux bénéficiaires des congés - éducation,bourses d'un montant suffisant pour couvrir les - frais de séjour et les voyages des intéressés.plus - globalement enfin,la subvention annuelle du *ministère - du travail doit connaître une augmentation notable - pour tenir compte de l'augmentation des charges,du - développement important de l'ensemble des réalisations - éducatives de la CGT,ainsi que de sa représentativité - réelle. - § s'agissant du congé éducation,des modifications - réglementaires doivent intervenir pour le fractionnement - de ce congé,pour l'augmentation du nombre des bénéficiaires, - notamment dans les grandes entreprises,et,enfin,pour - l'octroi aux centrales syndicales les plus représentatives - et proportionnellement à leur représentativité,d'un - contingent annuel de congés éducation de longue durée - pour répondre aux besoins des éducateurs et à la nécessité de - renforcer les stages de niveau supérieur. - - la législation du travail .. - - § l'application et le respect des droits des travailleurs - à l'entreprise nécessitent que les instances responsables - de la législation sociale disposent de moyens de contrôle et - de réparation suffisants et adaptés. - § en effet,les violations des droits des travailleurs - prennent un aspect intolérable,du fait même de leur - fréquence et de leur gravité,et appellent un certain nombre - de réformes qui,au jugement de la CGT,devraient - comporter les points suivants : - - § inspection du travail .. - - _augmentation sensible du nombre des inspecteurs et - contrôleurs du travail qui devrait être doublé. - _accroissement de leurs pouvoirs d'intervention,de contrôle et - de sanction à l'encontre des employeurs,notamment par la - possibilité d'intervenir devant toutes les instances - compétentes,le droit de faire arrêter les machines en - cas de danger flagrant et le droit de convoquer tout - témoin. - _extension de leur compétence à toutes les professions - et à tous les secteurs d'activité. - _institution de délégués salariés à l'inspection du travail, - élus par les travailleurs et dotés des attributions et des - pouvoirs nécessaires à l'accomplissement de leur tâche de - contrôle dans les entreprises,de répression et de sanction - des violations de la loi. - - § juridiction prudhomale .. - - _création obligatoire de *conseils de prudhommes dans - tous les centres importants et couvrant tout le - territoire national. - _extension sans exception de la juridiction prudhomale à - tous les travailleurs ne relevant pas de la fonction - publique. - _accès à l'électorat et à l'éligibilité de tous les - travailleurs sans distinction de nationalité. - _élection des conseillers prudhommes un jour ouvrable, - pendant le temps de travail,au scrutin proportionnel sur - des listes présentées par les organisations syndicales - les plus représentatives. - _suppression des sections et catégories en tant que telles, - et liberté d'organisation interne des conseils en sections - professionnelles ou chambres selon leurs besoins particuliers. - _gratuité,accélération et simplification de la procédure - prudhomale. - _prise en charge par l'*état ,au titre du *ministère de - la justice ,de la création et du fonctionnement des - *conseils de prudhommes et de l'attribution d'une - subvention spéciale aux organisations syndicales - pour la formation de leurs conseillers prudhommes. - _élargissement de la compétence des *conseils de - prudhommes aux conflits collectifs d'ordre juridique; - institution d'un véritable référé prudhomal. - _établissement d'un statut de conseiller prudhomme - garantissant le libre exercice de son activité et sa - couverture contre tout préjudice,de quelque ordre qu'il - puisse être. - - code du travail .. - - § une réforme profonde de la législation sociale s'impose - pour la débarrasser des conceptions antisociales - héritées du *code Napoléon .un *code du travail moderne - doit élargir et garantir efficacement les droits des - travailleurs dans les conditions actuelles de l'exploitation -capitaliste. - - les conventions collectives .. - - § la garantie des droits collectifs et des revendications, - imposée par l'action syndicale,nécessite des *conventions - collectives efficaces. - § trop souvent,ces conventions sont vidées de leur - contenu,notamment en ce qui concerne les salaires. - dans de nombreux cas,elles sont même inexistantes. - § la CGT lutte pour de véritables conventions collectives $: - _la négociation des conventions collectives,avenants - et accords paritaires,doit être ouverte obligatoirement à - toutes les *organisations syndicales représentatives; - _les conventions collectives,avenants et accords - paritaires ne doivent s'appliquer que s'ils sont signés - par des organisations syndicales représentatives représentant - ensemble la majorité des travailleurs concernés; -_tous les travailleurs d'une même branche du manoeuvre - à l'ingénieur doivent être couverts par une convention - collective unique,comportant des avenants traitant - les questions spécifiques qui concernent les diverses - catégories.cela implique l'extension automatique - de chaque convention à toutes les entreprises d'une - profession déterminée; - _les problèmes généraux intéressant l'ensemble des - salariés doivent être réglés par des accords - interprofessionnels.des conventions collectives - nationales doivent couvrir toutes les branches et - régler les problèmes d'ensemble du secteur professionnel; - _les accords et conventions d'entreprises doivent être - considérés comme des compléments aux accords nationaux - ou aux conventions collectives nationales,leur objet - étant de les adapter et de les améliorer; - _accélération de la procédure d'extension des conventions - collectives et accords,la décision devant être rendue - dans un délai maximum de trois mois à dater du dépôt de la - demande d'extension. - § pour répondre pleinement à la protection qu'elle doit - apporter aux travailleurs,toute convention collective doit - couvrir dans ses dispositions l'ensemble des problèmes - soulevés par l'exercice de la profession,dans le sens - des revendications définies par le présent programme. - tout particulièrement,elle doit assurer une véritable garantie - des salaires. - § la CGT s'oppose à toute disposition visant à limiter - les droits syndicaux et le droit de grève,et refuse - toute clause se référant à des conceptions de collaboration - de classes. - § conclue à la fois en fonction des conditions économiques - sociales et politiques et du rapport des forces entre - les salariés et le patronat existant au moment de la - signature,la convention collective représente un - avantage minimum pour tous,qui ne saurait être considéré comme - immuable. - § son contenu doit être amélioré en tenant compte des - besoins nouveaux et de l'évolution du rapport des forces - en présence. - § aussi une action de caractère permanent est elle - nécessaire pour assurer l'application correcte des - avantages acquis et les préserver de toute atteinte, - et conquérir des avantages et des droits nouveaux. - § sur la base des principes énoncés ci-dessus,la CGT - réclame l'ouverture rapide,dans toutes les branches, - de négociations aux fins de conclure des conventions - collectives nationales,ou,le cas échéant,de mettre à - jour et d'améliorer celles qui existent. - - les statuts .. - - § les statuts des personnels sont le résultat des luttes - nombreuses des organisations syndicales pour obtenir - l'établissement de garanties.ils ont été acquis - ou améliorés à l'occasion d'un rapport de forces - favorable à l'ensemble de la classe ouvrière,notamment - lors de la libération de notre pays avec le progrès du - mouvement démocratique. - § la prise en considération des revendications générales - de la CGT constitue un élément important de la lutte - pour la sauvegarde et l'amélioration des garanties statutaires - mises en cause par la politique du pouvoir visant à - favoriser les monopoles. - § cette politique a les plus lourdes conséquences dans le - secteur public $: - _compression maximum des dépenses de fonctionnement - au détriment des conditions de vie et de travail des - personnels et de la qualité de service rendu aux - usagers; - _transferts de plus en plus nombreux et variés des - activités publiques rentables vers le secteur privé - et démantèlement des services publics,utilisation de - personnels hors statuts pour certains secteurs d'activité. - § cela s'accompagne d'attaques constantes,ouvertes ou - insidieuses contre les statuts des personnels.sous - couvert de réformes,d'adaptation ou de réorganisation, - l'objectif final est de remettre en cause les avantages - acquis dans tous les domaines. - § ainsi,défense du service public,défense et amélioration - des garanties statutaires sont étroitement liées. - § cette action reste une préoccupation importante de la - CGT. - - respect des garanties acquises .. - - § la CGT lutte pour le respect intégral des garanties - acquises et le rétablissement de celles qui ont été - remises en cause.elle exige notamment $: - _l'extension du rôle et de la compétence des organismes - paritaires de la *fonction publique (commissions - administratives,comités techniques,*conseil supérieur - de la *fonction publique )et des *comités mixtes du - secteur nationalisé; - _leur consultation obligatoire; - _l'amélioration de leur fonctionnement dans le sens d'un - développement de prérogatives des représentants des - personnels et des facilités nécessaires à l'exercice de - leur mandat. - § la CGT exige que soit mis un terme au recrutement - de personnel auxiliaire ou hors statut $: - _les auxiliaires doivent être titularisés; - _les personnels écartés du bénéfice des droits statutaires - doivent être intégrés dans le cadre du statut; - _les situations particulières pouvant justifier le recrutement - de personnel sous contrat doivent être déterminées en accord - avec les organisations syndicales.dans ce cas,des garanties - équivalentes à celles des personnels à statut doivent - être accordées à ces personnels.des règles similaires seront - appliquées aux personnels des entreprises assurant une - concession de service public. - - garanties nouvelles .. - - § des garanties fondamentales nouvelles doivent être - obtenues,notamment en ce qui concerne $: - _ les modalités de négociations afin de respecter les - prérogatives syndicales.à ce sujet $: - _les représentants du gouvernement ou des directions - nationales doivent avoir réellement le pouvoir de négocier - et de traiter sans être enfermés dans les limites - de décisions prises au préalable et arbitrairement; - _la référence à des instruments dont le gouvernement - possède le contrôle exclusif (indice officiel des prix) - ou à des formules liées à la productivité,à l'évolution - des recettes,ou à la production doit être exclue; - _les réformes de caractère fondamental,ou les mesures - de caractère pluriannuel doivent être négociées en dehors - des discussions salariales annuelles; - _les organisations syndicales représentatives doivent - être associées à toutes les discussions intéressant - les travailleurs dont elles ont mission de défendre les - intérêts,qu'elles soient ou non signataires des accords. - § les droits syndicaux,les prérogatives des organisations - syndicales dans l'entreprise,l'établissement ou le service, - en particulier pour ce qui concerne le temps et les moyens - des élus,doivent être respectés et étendus. - § les comités d'entreprise ou organismes similaires - financés par les administrations ou les directions et - gérés par les représentants élus du personnel doivent - être créés dans tous les secteurs .là où ils existent,les - droits des travailleurs dans la gestion doivent être - étendus. - - la formation et le développement de l'homme .. - l'enseignement et l'éducation permanente .. - - § la CGT attache la plus grande importance à la - formation des hommes.l'acquisition des connaissances - pour tous et au niveau le plus élevé,en fonction des aptitudes - de chacun,commande largement le développement du progrès - scientifique,technique,économique,social et culturel. - § il est un facteur important du développement de la - démocratie. - § l'éducation des enfants et des jeunes doit viser tout - à la fois à l'épanouissement de l'individu,à son insertion - dans la société pour qu'il soit utile à la collectivité - nationale,à sa préparation au rôle de citoyen - responsable. - § une telle formation étalée de l'école maternelle à - l'enseignement du second degré et à l'enseignement - supérieur,doit se prolonger au cours de la vie active - par le moyen d'une éducation permanente ouverte à tous - les champs de la connaissance. - § le *pouvoir en place ne permet pas la réalisation - d'un tel objectif. - § le système éducatif actuel est conçu à partir des - besoins des couches dominantes.il limite les connaissances - au minimum requis pour assurer le profit.il freine la - recherche scientifique et l'asservit au patronat.il - perpétue la ségrégation sociale.il diffuse largement - l'idéologie de la classe au pouvoir. - § les réformes successives entreprises depuis 15 ans - _même si elles doivent tenir compte de la pression - populaire_ recherchent les adaptations que nécessitent l'évolution -des techniques et surtout la crise du - capitalisme. - § la crise de l'école française,la pauvreté de ses moyens, - les jeunes,les étudiants diplômés sans emploi,sont des - reflets de la crise du capitalisme dans notre pays. - § la CGT estime qu'un autre système éducatif réaliste, - progressiste,inspiré de la réforme Langevin-Wallon - doit être mis en place. - § il donnerait aux jeunes tout à la fois la possibilité de - s'instruire sans autre limitation que celle des - aptitudes et celle d'utiliser leur savoir dans des - emplois rendus disponibles par le renouveau économique. - § il effacerait largement les discriminations nées - des différences de situation de fortune et aussi de race en - permettant notamment aux immigrés et à leurs enfants - d'apprendre leur langue maternelle et de mieux connaître - la culture du pays d'origine et du pays de travail. - § il rétablirait l'égalité entre la formation des hommes - et des femmes. - § il se prolongerait dans une véritable formation continue, - assurant notamment l'entretien et le perfectionnement - professionnels,qu'un enseignement technique rénové - et développé rendrait possible et efficace. - § ainsi serait assuré,dans le cadre d'une éducation - nationale laïque,unifiée associant les maîtres et les - utilisateurs,un développement réel d'un enseignement - de qualité,effectué par des maîtres qualifiés et - rémunérés en conséquence. - § la CGT continuera de se battre pour un tel projet, - solution réaliste et globale à la crise de l'enseignement. - § d'ores et déjà,sans attendre une réforme complète du - système éducatif,un certain nombre de revendications peuvent - être satisfaites. - § le développement à l'école maternelle pour tous en milieu - rural et urbain,en s'opposant à tout "plan" qui tendrait - à dénaturer le caractère éducatif et social de cet - enseignement. - § la rénovation de l'école élémentaire dans son contenu - et son fonctionnement et assurant notamment la réduction - des effectifs par classe et la formation élevée et le - perfectionnement des maîtres. - § le respect intégral de la loi sur la scolarisation - obligatoire jusqu'à 16 ans en garantissant à chaque jeune - une formation complète dans les structures de l'éducation - *nationale . - une telle exigence implique l'abrogation des articles - 56 et 57 de la *loi Royer ,l'abandon des formules de - cloisonnement structurel ou pédagogique conduisant - des élèves à des impasses dramatiques.elle implique - également des actions de rattrapage des retards - scolaires. - § la mise en oeuvre d'un enseignement secondaire de valeur, - associant aux connaissances scientifiques et littéraires - fondamentales,l'éducation civique et morale,l'initiation - à la technologie et à l'économie,l'éducation artistique - et la formation physique. - § un tel enseignement,sanctionné par un baccalauréat doit - s'ouvrir librement et sans discrimination vers les - enseignements supérieurs,ou vers l'exercice d'un métier. - § l'expansion sans précédent d'un enseignement technique - public,ouvert également aux garçons et aux filles, - rénové,moderne,diversifié,favorisant l'épanouissement - des jeunes,leur donnant les bases fondamentales des - adaptations ultérieures,les préparant concrètement à - l'emploi.cela implique $: - _d'assurer le développement des moyens d'accueil,de - fonctionnement,d'orientation et d'enseignement des jeunes, - garçons et filles,en fonction des besoins réels de - l'économie et de la société; - _de supprimer tous les moyens et toutes les structures - ségrégatives,empêchant un recrutement normal dans les - collèges d'enseignement technique; - _de procéder à l'aménagement des structures de l'enseignement -technologique pour permettre $: - _la mise à niveau des jeunes,garçons et filles,victimes - de handicaps scolaires, - _la diversification des formations, - _l'accès facilité vers des formations supérieures ; - _de prendre des mesures incitatives pour faire venir - vers l'enseignement technologique un grand nombre de - jeunes; - _de réaliser une rénovation totale de l'enseignement - technique,la promotion de ses enseignants et leur - perfectionnement continu. - § la suppression des barrages ségrégatifs et l'accès - des étudiants à un enseignement supérieur de haut niveau, - en assurant la liaison entre l'enseignement et la recherche - dans les *universités ,et en étendant les moyens de la - recherche. - § en conquérant le droit à la formation et le congé - éducation les travailleurs ont réalisé un important - progrès.la CGT exige que ce droit soit pleinement - respecté et que la formation continue s'élargisse à tous - les besoins professionnels et culturels des salariés. - § elle estime que l'*éducation nationale doit être le - maître d'oeuvre principal d'une telle politique, - notamment en créant auprès de chaque établissement - public des départements de formation continue animés - par des enseignants préparés en conséquence. - § pour la réalisation de ces mesures,la CGT demande - la mise à la disposition de l'*éducation nationale des - moyens nécessaires permettant $: - _de construire et d'équiper convenablement,et en toute - sécurité,les écoles de tous niveaux; - _de recruter,de former et de perfectionner les maîtres, - de résorber l'auxilariat; - _d'assurer aux familles et aux jeunes l'aide sociale - nécessaire sous forme de bourses,de primes de scolarité - ou d'allocations d'études indexées sur l'indice des prix - accepté par les organisations syndicales; - _de mettre en place un véritable service de protection sociale - et médicale,relevant de l'*éducation nationale ,ainsi - qu'un véritable service d'orientation scolaire et - professionnelle. - § enfin la CGT réaffirme son attachement à l'école - laïque.elle dénonce l'augmentation constante des subventions - et des aides aux écoles privées,confessionnelles ou - patronales.elle confirme sa volonté de voir regrouper - au sein d'un grand service public de l'*éducation nationale - tous les enseignements et services actuellement dispersés - comme l'enseignement agricole par exemple. - § elle appelle toutes ses organisations,ses militants, - les travailleurs à agir,aux côtés des enseignants, - des organisations et partis démocratiques pour promouvoir - toutes les mesures conformes à l'intérêt d'un enseignement - national et pour s'opposer à toutes les attaques contre - l'école. - - la culture,les sports,les loisirs .. - - § le développement harmonieux de l'individu sur le plan - culturel,sportif et des loisirs,est un droit qui depuis - longtemps est partie intégrante des revendications de la - classe ouvrière. - § consciente que la possibilité pour les travailleurs - d'accéder à une véritable vie culturelle,sportive ou de - loisirs est largement déterminée par leurs conditions - générales de vie,la CGT agit pour l'amélioration des - conditions de travail,la réduction de la durée du travail, - la garantie et la progression du pouvoir d'achat. - § afin de permettre aux travailleurs d'accéder massivement - à la culture,aux sports et aux loisirs,la CGT définit - ses revendications $: - _au niveau de la collectivité nationale pour exiger - une véritable politique de crédits,d'investissements, - d'infrastructure et d'équipement pour l'ensemble de ces - activités; - _au niveau des entreprises pour obtenir $: - _la gestion pleine et entière de ces activités par les - représentants élus du personnel au sein des *comités - d'entreprise et organismes assimilés,dans toutes les - entreprises,y compris dans les secteurs public et - nationalisé,sans ingérence du patronat et du gouvernement. - § le financement par l'employeur $: - _de l'ensemble des activités sociales par une contribution - au *comité d'entreprise qui ne saurait être inférieure - à 3% de la masse globale des salaires et appointements, - ce qui permettrait notamment le développement des - réalisations culturelles,sportives et de loisirs au - bénéfice des travailleurs et de leur famille, - _des investissements pour la réalisation d'installations - sportives,culturelles,de loisirs et de vacances; - _l'octroi par l'*état de subventions et de crédits sans - intérêt aux *comités d'entreprise et organismes - équivalents pour le développement des activités sociales; - _la mise à disposition de locaux convenables et d'un accès - facile; - _la suppression de la TVA pour les infrastructures et - les équipements culturels,sportifs,de loisirs et de - vacances. - § la CGT appuie l'activité des associations démocratiques - culturelles sportives et de tourisme,des organisations - d'éducation populaire et de jeunesse et appelle les - organisations confédérées et leurs élus dans les CE - et équivalents à renforcer leur coopération avec elles. - § l'essor sans précédent des sciences et des techniques, - la multiplication des contacts entre les peuples et - des échanges économiques,la prolifération des grands moyens - d'information,la prolongation de la scolarité,les - nécessités du recyclage professionnel font que le droit - à la culture,dans le prolongement du droit à l'instruction, -à la formation et au perfectionnement - professionnels,est devenu un phénomène social - de notre époque et une revendication primordiale des - travailleurs.ils développent chez les travailleurs le - besoin d'approfondir leurs connaissances,leur capacité - de réflexion,de discussion sur tous les sujets de la vie - quotidienne et sociale. - § les besoins croissants des travailleurs,donnent une - acuité plus grande à ces revendications que le grand - capital tente de détourner à des fins mercantiles,de - rabaisser à des évasions illusoires,individualistes - ou primaires,de canaliser à son profit pour faire pénétrer - son idéologie de collaboration de classes.le pouvoir porte - atteinte à la liberté de création,d'expression,et de - diffusion culturelle.les mesures prises,concernant - les activités de l'audiovisuel visent à renforcer - sa pression idéologique sur les masses.il en est de même - de certaines opérations de prestige qui risquent d'aboutir -à la définition d'une culture officielle alors - même que sévit la censure,que des subventions sont - supprimées et des animateurs licenciés. - § pour répondre à la volonté d'accéder et de participer - à la culture,mettre un terme à la dégradation du patrimoine - artistique de notre pays et pour l'enrichir,la CGT - agit pour obtenir $: - _l'augmentation des crédits d'*état accordés à toutes - les branches des activités culturelles,afin de permettre - notamment de développer le réseau des théâtres populaires - des maisons de la culture et des conservatoires et de - donner à l'art cinématographique les moyens financiers - qui lui font défaut; - _la liberté de création,d'expression,de diffusion des - oeuvres artistiques et littéraires; - _une radio-télévision répondant à l'intérêt national et non - aux impératifs de conditionnement idéologique et de - profit. - § la CGT soutient la revendication des artistes, - écrivains et interprètes pour un statut social élaboré - avec eux,leurs représentants et leurs organisations - syndicales. - § elle considère indispensable d'associer les travailleurs - y compris les travailleurs immigrés à toutes les formes - de la vie culturelle et à toutes les réalisations - culturelles existantes $: maisons de la culture,maisons - de jeunes,en les intéressant également à la gestion. - § elle participe au développement de ces activités à divers - niveaux par la mise en oeuvre d'initiatives prises par - les organisations confédérées,par l'impulsion que donnent - ses militants aux multiples réalisations culturelles - des comités d'entreprise ou organismes équivalents - des secteurs public et nationalisé. - - les activités sportives de masse .. - - § le sport n'est pas seulement le moyen le plus sûr - de garantir la santé et l'équilibre psychique des - individus,c'est aussi un des éléments de la culture - générale et de l'éducation. - § les conditions de notre temps,conditions aggravées - des travailleurs menacent gravement leur santé et celle - de leur famille,interdisent l'épanouissement de leur - personnalité.la pratique des activités physiques et - sportives devient un besoin social indispensable de plus - en plus ressenti par les travailleuses et les travailleurs. - § la CGT agit pour l'attribution de crédits permettant - le développement de la pratique du sport de masse, - et également pour que les activités sportives occupent - toute leur place dans l'éducation des enfants sur la base - de la gratuité et dans des établissements scolaires - dotés d'installations modernes et d'éducateurs - qualifiés. - § l'organisation des activités physiques et sportives sur la - base de l'entreprise doit permettre à chaque travailleuse - et à chaque travailleur qui le désire de pratiquer le - sport de son choix. - § c'est pourquoi la CGT demande que des dispositions - soient prises dans les statuts,accords nationaux et - conventions collectives. - § elle demande $: - _des mesures particulières concernant les jeunes sous - la forme de cinq heures rétribuées prises sur le temps de - travail légal,leur permettant de fréquenter une école - d'initiation sportive omnisports; - _des installations à l'intérieur ou à proximité - immédiate de l'entreprise; - _la formation d'animateurs et de moniteurs choisis parmi - les travailleurs. - - les activités touristiques,les loisirs .. - - § les conditions de la vie moderne et les servitudes - qu'elle impose,la pollution qui corrompt l'atmosphère et - le milieu de vie,les nuisances de toutes sortes,atteignent le - travailleur sur le plan physique et moral. - § tous ces facteurs contribuent à faire des loisirs, - des vacances et du tourisme un phénomène social, - économique et culturel de notre temps. - § alors que les vacances et le tourisme sont conçus - par le patronat et le pouvoir comme éléments d'évasion - et source de profits,qu'ils sont l'objet d'opérations - spéculatives,la CGT lutte pour que les travailleurs - puissent exercer pleinement le droit aux congés, - aux loisirs et à la détente. - § la CGT entend susciter et favoriser tout ce qui - conduit à l'enrichissement culturel,à la découverte des - sites et des modes de vie,à la connaissance des réalités - socio-économiques y compris dans les autres pays. - § attachant une très grande importance au tourisme social et - aux activités de loisirs,elle agit pour $: - _étendre le réseau de centres de vacances familiales - et de parcs de loisirs; - _réaliser une véritable politique de crédits et - d'investissements pour le tourisme social,ses infrastructures - et ses équipements; - _obtenir la réservation par l'*état et les collectivités - locales de sites privilégiés au profit du tourisme - social avec bail de longue durée; - _exiger la réduction de 50% pour les billets de congés - payés quel que soit le moyen de transport ainsi que - l'octroi d'un second billet; - _supprimer toutes les restrictions concernant l'utilisation - de certains moyens de transport ainsi que les péages sur - les autoroutes pour les salariés en congés. - - les conditions de vie .. - les équipements collectifs,sanitaires et sociaux .. - le logement .. - - § la politique de l'habitat aboutit à l'accentuation - de la crise du logement dont les travailleurs et leur - famille sont les principales victimes.cette crise est - à la fois quantitative et qualitative.tout d'abord - la pénurie de logements accessibles persiste (particulièrement - dans les agglomérations urbaines);la charge logement - ponctionne lourdement le pouvoir d'achat,égalant et souvent - même dépassant les 25% du budget familial.les logements - existants ou réalisés ne sont ni assez spacieux,ni - suffisamment équipés,ni correctement implantés. - § tandis que des menaces de plus en plus lourdes pèsent - sur l'institution HLM,et que la spéculation immobilière - est source de profits scandaleux,le prétexte de la lutte - contre l'inflation aboutit à réduire le nombre des - logements sociaux construits. - § la CGT considère que la politique sociale du logement - ne peut s'insérer dans la pratique d'un urbanisme fondé - sur la réalisation du profit. - § pour ce qui la concerne,une véritable politique sociale - du logement comporte $: - _la définition d'un urbanisme d'ensemble procédant de la - volonté de satisfaire des besoins réels.cela implique - d'une part,d'assurer des liaisons correctes entre - l'habitat et l'emploi,des transports collectifs rapides - et confortables et financés principalement par les - entreprises,d'autre part,la réalisation d'un cadre de vie - agréable permettant la détente et la satisfaction correcte - des besoins sociaux et culturels; - _la reconnaissance du droit au logement,assurée par un service - public basé sur l'institution HLM,ce qui suppose une - gestion démocratique des organismes d'HLM,celle-ci - étant assurée majoritairement par les élus locaux et - les représentants des usagers (locataires,syndicats), - ainsi qu'un ensemble de mesures leur permettant de remplir - efficacement leur rôle; - _la maîtrise de l'usage des sols avec droit de préemption - public sur les transactions de terrains bâtis ou non bâtis - à l'intérieur des zones d'urbanisation et fixation de prix - de référence stables pour éliminer la spéculation; - _le financement des programmes par l'*état , à l'aide de prêts - de longue durée à faible taux d'intérêt; - _l'octroi de subventions permettant aux collectivités locales - et aux offices HLM de réaliser les réserves financières - nécessaires; - _l'exonération totale de la TVA et diminution du taux de - celle-ci sur les fournitures et travaux d'entretien; - _la réalisation de programmes annuels permettant - de faire face aux besoins; - _la réglementation des loyers et charges.suppression du - surloyer,garantie du droit au maintien dans les lieux, - abrogation de la loi permettant la vente des HLM - locatives; - _la refonte complète et la réforme du financement - de l'allocation logement; - _l'affectation prioritaire,sous le contrôle des - *comités d'entreprise ,de la cotisation du 1% des - entreprises au financement du logement social.cette - cotisation doit s'appliquer à l'*état et aux collectivités - publiques pour les personnels qu'ils emploient;elle doit - être portée à 2% pour les grandes entreprises; - _le développement de la construction de logements - sociaux pour les travailleurs immigrés et les retraités, - ainsi que des foyers pour les jeunes travailleuses et - travailleurs;résorption de l'habitat insalubre; - _la mise en oeuvre d'une véritable politique de rénovation - urbaine et d'amélioration de l'habitat ancien,à l'initiative -des collectivités locales,avec dotations - budgétaires convenables permettant l'intervention - prioritaire des organismes d'HLM et le respect du droit - au relogement sur place des habitants concernés. - - transports et circulation .. - - § c'est une même politique monopoliste qui conduit aux - déséquilibres régionaux de l'économie,au développement - incohérent des grandes concentrations urbaines,qui - dégrade des secteurs entiers de l'équipement ferroviaire, - routier,de l'aviation civile et de la marine marchande. - elle utilise le secteur nationalisé des transports - dans l'intérêt des grands financiers,domine par la - sous-traitance les transports routiers,détériore - gravement les services publics urbains,liquide des trafics - maritimes ou aériens.confrontée avec le problème du - développement de la circulation automobile elle accumule - les retards dans les infrastructures de circulation. - elle dilapide le potentiel humain et matériel de - construction des moyens de transports (aéronautique, - automobile,etc).enfin,elle mène une politique énergétique - portant préjudice aux transports et déplacements. - § cette politique atteint la vie quotidienne de la - population laborieuse,le développement de l'économie - nationale et les échanges internationaux favorables - à notre pays. - § l'insuffisance notoire et grandissante des moyens de - transports collectifs,leur manque de rapidité et leur - inconfort portent atteinte à la santé et à la vie - familiale,sociale et culturelle des travailleurs. - § la politique des monopoles tend de plus en plus à faire - peser sur les travailleurs les frais de l'équipement - en moyen de transports et de circulation remettant en cause - leur rôle de services publics. - § pour la CGT,les transports de marchandises et de - personnes au niveau national et international doivent - être adaptés aux besoins sociaux et culturels,au - développement équilibré de l'économie,à l'aménagement - cohérent du territoire,à l'intérêt national. - § loin de s'opposer,les différentes techniques de - transports (terrestres,aériens,maritimes ou fluviaux) - les différents moyens individuels ou collectifs - doivent répondre à des besoins,à des conditions,à des - domaines spécifiques permettant de faire face à la - complexité,à la diversité et à la mouvance des nécessités - de la vie économique et sociale,tout en assurant une - cohérence et une efficacité de l'ensemble. - § sachant l'importance que représentent les conditions -de transports et de circulation pour l'existence - quotidienne des travailleurs,la CGT demande $: - _une politique coordonnée de l'emploi,du logement et des - équipements sociaux et culturels (ce qui supposerait - la suppression de la spéculation foncière); - _un véritable service public de transports en commun, - desservant l'ensemble des agglomérations et assurant - les services rapides,confortables,peu coûteux et - fonctionnant aux heures permettant l'activité économique, - sociale et culturelle de la population; - _l'amélioration des conditions de circulation dans les - agglomérations permettant d'élargir l'accès aux transports - collectifs notamment par l'adaptation des voieries, - des constructions de parkings à proximité des gares ou - stations ; - _le développement de l'équipement en transports et en - voies de circulation entre les communes isolées et les - agglomérations.ce qui implique par conséquent,de cesser - le démantèlement des réseaux de transports existants, - tels la SNCF et la RATP; - _la prise en charge de l'essentiel des équipements,de - leur renouvellement et de leur extension par des - investissements de l'*état .des taxes progressives étant - prélevées sur les grosses entreprises commerciales, - industrielles et la grosse propriété foncière; - _le paiement des frais de transports des travailleurs - (cartes hebdomadaires ou autres)par les employeurs; - _la création de cartes de réduction pour les chômeurs,les - retraités et vieux travailleurs,sur l'ensemble des - transports publics; - _la gratuité des transports pour les jeunes soldats; - _l'extension des réductions de transports accordées - aux familles nombreuses,aux familles de travailleurs - immigrés; - _l'amélioration des transports scolaires,la sécurité - des enfants devant être rigoureusement assurée et les - frais en résultant pris en charge par l'*état ; - _la création ou le développement des moyens de transports - en rapport avec les besoins en loisirs.extension - des billets congés payés sur les transports aériens - et maritimes,création de navires de croisières,etc; - _une politique de développement des différents modes de - transports sur la base de leur qualité complémentaire, - associée à une politique nationale de la construction - des moyens de transports. - - la santé .. - - § la santé constitue un besoin humain essentiel en même temps - qu'un impératif de progrès économique,social et culturel. - elle suppose d'abord des conditions de vie et de travail - correctes pour lesquelles lutte la CGT. - § il appartient avant tout à l'*état de fournir - les moyens nécessaires à la satisfaction de ces besoins. - § le droit à la santé doit comporter pour toute la - population l'accès aux méthodes de prévention,d'investigation, -de traitement,de rééducation et de - réadaptation.cet accès devrait se réaliser dans le cadre - d'une véritable sectorisation sanitaire mettant,au service - de tous,les progrès des techniques médicales et des sciences - biologiques. - § pour cela la CGT exige $: - _la mise en oeuvre d'une véritable réforme de la santé - reposant sur le principe du service public; - _la reconnaissance du rôle de premier plan occupé - par l'hôpital public; - _la création de nouveaux hopitaux et la modernisation - de ceux qui existent;l'implantation des unités hospitalières - au plus près des lieux d'activité de la population - avec des équipements permettant de prévenir et de - traiter les maladies telles que notamment le cancer, - les affections nerveuses et cardiaques,les maladies - mentales et pulmonaires; - _la formation d'urgence,et en nombre suffisant,des - personnels qualifiés notamment au niveau des infirmiers et - des médecins et le renforcement massif des effectifs des - hopitaux,les personnels bénéficiant de plus justes - salaires et de meilleures conditions de travail; - _un statut pour le secteur privé de l'hospitalisation - garantissant les malades et les personnels; - _la multiplication des centres de secours hospitaliers - d'urgence; - _le développement de la recherche médicale; - _la promotion de formes nouvelles d'exercice de la médecine - dans le respect de ses principes fondamentaux $: secret - professionnel,liberté de prescription,indépendance - technique et professionnelle. - § dans ce but,il convient que les moyens financiers soient - assurés permettant le développement et le fonctionnement - des *centres de santé ,des *collectivités locales, - de la *sécurité sociale,des organisations mutualistes, - de maisons médicales permettant l'exercice d'une véritable - médecine d'équipe. - § la mise en oeuvre de ces mesures devrait s'effectuer - après une large concertation avec les organisations - syndicales et mutualistes,le corps médical et les - représentants des collectivités locales,et dans le cadre - d'une véritable carte sanitaire. - § ainsi seraient créées les conditions d'une réelle - humanisation de l'hôpital,de la continuité des soins - et de la permanence du service de santé. - - les équipements sociaux et l'action sociale .. - - § la CGT attache une très grande importance aux - différents aspects de " l'action sociale" maintenue,malgré les - déclarations officielles,dans la plus grande indigence. - § pour une politique d'action sociale conforme aux exigences - actuelles la CGT revendique $: - _des équipements et des mesures de protection de - l'enfance et en tout premier lieu $: - _des crèches $: compte tenu des graves carences qui existent - dans ce domaine il convient de mettre en oeuvre - un programme d'urgence.pour assurer le financement de - la construction et le fonctionnement des crèches,il - importe qu'à la participation des caisses d'allocations - familiales et des collectivités locales,vienne s'ajouter - un versement de 0-5% de toutes les sommes payées au titre - des traitements et salaires et la contribution de - l'*état ; - _une véritable médecine scolaire; - _des maisons et hôtels maternels; - _des foyers de l'enfance; - _des maisons d'enfants à caractère social; - _l'ouverture de centres d'orthogénie et de consultations - spécialisées permettant la connaissance et l'accès aux - problèmes de la sexualité et de la contraception; - _des équipements et des mesures spéciales pour les - personnes âgées et en particulier $: - _la création de centres de gériatrie et de gérontologie; - _l'augmentation des effectifs des aides-ménagères; - _la construction de foyers d'habitation comportant - les équipements sociaux et le personnel médical - nécessaire; - _la rénovation des "hospices" existants et l'édification - d'établissements chargés d'accueillir tous ceux qui - nécessitent des soins constants et une assistance - permanente; - _le développement du réseau d'accueil pour les travailleurs - immigrés,qui doit être placé sous la seule responsabilité - de l'*office national d'immigration ,avec le contrôle - syndical et financement par le gouvernement et le - patronat; - _la mise en oeuvre d'une politique conséquente en faveur - des handicapés qui implique un effort budgétaire particulier - de l'*état et comporte en tout premier lieu $: - _la reconnaissance du droit à la santé permettant de mieux - prévenir les handicaps et de mieux les soigner; - _l'intégration des enfants handicapés dans le système - scolaire de l'*éducation nationale ,en créant un éventail - complet d'établissements offrant tous les moyens d'éducation - correspondant aux différents handicaps; - _la reconnaissance du droit à l'emploi sur la base du - principe de l'insertion du travailleur handicapé dans le - cadre normal des entreprises,et de la garantie des - dispositions légales et de celles définies dans les - conventions collectives; - _la juste rétribution de la force de travail du travailleur - handicapé qui doit au minimum percevoir le SMIC et - l'attribution d'une allocation égale à 80% du SMIC pour - ceux qui sont dans l'incapacité de travailler; - _la refonte des prestations familiales versées aux familles - ayant à leur charge un enfant handicapé. - - le cadre de vie .. - - § aujourdhui,ce que l'on appelle les "nuisances" -atteignent un niveau insupportable pour la population et -spécialement pour les travailleurs,ce sont $: le bruit,l'air vicié - l'eau polluée,les forêts détruites,le paysage enlaidi, - les cités dortoirs inadaptées. - § mais ce n'est pas la "vie moderne" qui en est responsable. - le grand responsable c'est l'anarchie d'un système - basé sur le profit qui gaspille les biens naturels - et néglige les besoins fondamentaux de l'homme;c'est l'anarchie -de l'urbanisation qui se fait en fonction de - la spéculation foncière et du profit immobilier;c'est - l'anarchie de l'industrialisation qui se fait en fonction - de calculs de rentabilité à court terme;c'est l'anarchie - de la production qui consomme des biens comme l'eau - et l'air et les restitue sous forme de déchets pollués, - sans que personne ne limite cette consommation ni oblige - les vrais pollueurs à empêcher cette dégradation. - § les salariés,exploités dans leur travail,ne veulent pas, - à leur sortie du travail,que ce soit dans leur localité - ou dans leur lieu de vacances,retrouver le même univers - inhumain,souillé par la recherche du profit immédiat. - § la CGT demande $: - _que l'urbanisation et l'industrialisation se fassent - en fonction d'un plan élaboré démocratiquement; - _que soit mis en oeuvre un urbanisme respectant les - besoins et aspirations de la population tant en matière - esthétique qu'en matière sociale; - _qu'aucune construction d'ensembles immobiliers n'ait - lieu sans que soient,en même temps,édifiées les installations - sociales,culturelles,sportives nécessaires à la population; - _que les syndicats aient leur mot à dire,à l'échelon - local,départemental ou régional sur les équipements - collectifs nécessaires à la population; - _que les mesures nécessaires soient imposées aux industriels - pour que leurs activités préservent les conditions de vie - de la population et les sites de repos et qu'elles respectent - des normes antipollution efficaces; - _que toute nouvelle installation ou fabrication fasse l'objet -d'un examen,notamment des *comités d'hygiène et de - sécurité ,en liaison avec les représentants de la - population concernée; - _qu'une contribution financière,prélevée sur le chiffre - d'affaires des grandes entreprises en fonction des - atteintes au cadre de vie,soit affectée à la réparation des - préjudices causés. - - - - - - - - - la CGT définit son action face à la situation générale - du pays .. - - § la crise du système capitaliste s'est aggravée. - elle engendre un niveau élevé et permanent d'inflation - et un chômage massif.elle s'accompagne d'un ralentissement - de l'activité économique,de difficultés croissantes de - débouchés. - § la France est profondément affectée par le développement - de la crise qui entraîne des atteintes sérieuses au - pouvoir d'achat et approfondit et généralise l'insécurité. - § mais la crise n'est pas fatale.le dérèglement de - l'économie capitaliste a pour cause l'accumulation de - profits extraordinaires par les grandes sociétés - capitalistes et en particulier par les sociétés - multinationales avec le soutien de l'*état . - § la politique du pouvoir vise à faire supporter la crise - aux travailleurs et au peuple.l'austérité n'est pas un remède - permettant de sortir de la crise.elle l'accentue.elle - accélère le gâchis des forces productives humaines et - matérielles,entraînant la destruction et l'abandon - de secteurs décisifs,aggravant les déséquilibres de - l'appareil productif et des économies régionales.le - "redéploiement" que met en oeuvre le pouvoir pour - renforcer les monopoles va encore les accélérer. - il vise à soutenir l'expansion multinationale des groupes - monopolistes basés en France et il accélère la pénétration - de l'économie française par les multinationales - étrangères. - § les orientations du *7ème plan visent à prolonger - et à accentuer la politique d'austérité. - § cette politique est profondément nocive,contraire à - l'intérêt national et à l'établissement d'une coopération - et d'échanges économiques internationaux sur une base - saine. - § concentrant toutes les forces de conservation sociale, - la politique du pouvoir renforce l'autoritarisme du - système et en accentue toutes les contraintes majeures. - § en s'appuyant sur la montée de la volonté populaire - de changement,il est nécessaire de développer les luttes - sociales pour assurer la défense des conditions de - travail et de vie des travailleurs.en même temps l'action - est indispensable pour imposer des mesures économiques, - s'attaquant à l'inflation,assainissant l'économie et - assurant son développement.elle est intimement liée - à la défense des intérêts des travailleurs. - - la politique économique .. - - § pour faire face à la crise,des mesures essentiellement - différentes de celles adoptées par le patronat et le - gouvernement,dont la responsabilité dans la situation - actuelle est écrasante,sont à mettre en oeuvre. - § il est indispensable d'assurer le développement prioritaire - du marché intérieur et d'élever la consommation populaire - pour répondre aux besoins des travailleurs et des grandes - masses de la population. -pour assurer un développement économique plus sain,fondé - sur l'élargissement de la consommation populaire et - du marché intérieur,sauvegarder l'emploi et rééquilibrer - nos échanges,il faut promouvoir une politique - industrielle s'appuyant sur le secteur public.il faut - utiliser toutes les ressources et potentialités du - pays.il faut s'attaquer aux sources de l'inflation. - § à cet effet il est nécessaire $: - _de réduire la TVA sur les produits de première - nécessité; - _de bloquer les prix de certains produits de grande - consommation,des produits industriels les plus importants - à la production ainsi que les tarifs publics,les loyers - et les charges; - _de réduire et de contrôler les marges bénéficiaires des - grandes sociétés; - _de mettre en oeuvre une politique sélective du crédit - s'attaquant aux facilités inflationnistes de crédit - offertes aux grandes entreprises,sans porter atteinte - au fonctionnement normal des PME ni à l'emploi; - _de défendre l'épargne populaire contre l'inflation et - d'indexer le montant des livrets A- de *caisse - d'épargne sur l'évolution réelle des prix. - § pour s'opposer à la dégradation de l'emploi et assurer - son développement,sont nécessaires des mesures de réduction - de la durée du travail,d'abaissement d'âge de la retraite, - la garantie des ressources,l'interdiction des décisions - de licenciement sans reclassement préalable,le droit - et les moyens de discuter du bien fondé des décisions - de licenciement et de fermeture d'entreprises. - conjointement,il est indispensable de mettre en oeuvre - une politique économique et sociale assurant le - développement économique et qui soit créatrice d'emplois. - ceci exige notamment le développement des services et - activités directement utiles à l'économie ou indispensables - à l'amélioration des conditions de vie (enseignement, - santé,services sociaux,etc). - § il faut stopper l'abandon,la liquidation et la - subordination au capital étranger de secteurs ou d'entreprises -indispensables au développement de l'économie - française qu'entraîne la politique actuelle,assurer - leur maintien et leur développement,notamment dans les - secteurs de pointe,vitaux pour la souveraineté nationale - et la définition de la place de notre pays dans la - civilisation internationale du travail. - § la politique industrielle doit s'appuyer sur l'extension - du secteur public pour assurer le développement de - productions nationales nécessaires au développement - de l'économie,indispensables à son équilibre interne - et à celui de ses échanges extérieurs. - § indépendamment des mesures visant à une réforme - de la fiscalité qui aurait une portée économique - positive,les subventions et autres transferts effectués - au bénéfice du grand capital doivent être supprimés. - un impôt sur le capital des grandes firmes françaises doit - être instauré. - § les ressources dégagées doivent être,en priorité, - affectées aux équipements sociaux.le budget de l'*état - doit être équilibré.il convient de réduire - substantiellement les dépenses militaires avant tout - par la suppression de la force de frappe nucléaire - et en prévoyant la reconversion des industries d'armement et - des activités qui leur sont liées vers des fabrications - civiles en utilisant pleinement le potentiel scientifique - technologique devenu ainsi disponible. - § une nouvelle orientation de la fiscalité et du budget et - des fonds publics ou parapublics (conjugués avec le - contrôle des prix et du crédit) est indispensable - pour s'attaquer à l'inflation qui pèse lourdement - sur les travailleurs et les titulaires de petits revenus - et qui a également des effets négatifs sur les échanges - extérieurs. - § il est immédiatement nécessaire d'augmenter rythme et - réalisation des équipements sociaux et collectifs - afin de combler les retards considérables accumulés - dans ce domaine. - § ces mesures sont de nature à impulser l'activité dans - de nombreux secteurs de production et à favoriser la mise - en oeuvre de techniques nouvelles. - § un changement radical de la politique énergétique - de la France est urgent.il faut en finir avec le - pillage et la domination des sociétés multinationales sur - la politique énergétique. - § une politique nouvelle fondée sur la diversification - et la coordination des sources d'énergie doit être appliquée. - elle doit comporter $: - _l'arrêt immédiat des fermetures de puits dans les - mines de charbon encore en exploitation et l'utilisation - à plein des capacités actuelles d'extraction; - _un plan d'augmentation de la production charbonnière - utilisant pleinement les ressources nationales; - _l'utilisation des potentialités nationales pour la - production hydraulique d'électricité,notamment par - l'énergie marémotrice; - _le développement de la production d'électricité - d'origine nucléaire en orientant le choix entre les - différentes techniques de réacteurs,dans le but d'assurer - une meilleure utilisation possible des réserves naturelles - en matériaux fissiles pour la production d'électricité; - _"aucune considération de rentabilité économique ne doit - être opposée aux mesures indispensables pour assurer - la sécurité de la population et du personnel"; - _la suppression des privilèges des sociétés pétrolières - et l'abaissement des taxes à la consommation sur les - produits pétroliers; - _l'établissement avec les pays producteurs de pétrole - et de gaz naturel de contrats sur la base de l'intérêt - mutuel des peuples,en bannissant toute pratique - néo-coloniale et sans interférence des compagnies; - _la nationalisation de l'ensemble du secteur pétrolier et, - dans l'immédiat,la nationalisation des groupes pétroliers - français Elf-Erap CFP-Total; - _le développement de la recherche,par le secteur public - et nationalisé,sur les sources d'énergie de l'avenir $: - hydrogène,énergie solaire,géothermie,fusion - thermonucléaire contrôlée. - § la remise en cause généralisée du rôle du service - public,le démantèlement de certaines activités des - administrations et entreprises nationalisées par leur - transfert,soit pour les faire effectuer par des personnels - hors statut,soit pour faire bénéficier les monopoles - de leur rentabilité,la pénétration accélérée de ces - administrations et entreprises par les capitaux privés - doivent être stoppés.au contraire,il convient de - développer le secteur public et nationalisé et de le - mettre au service de l'intérêt national,ce qui implique - une politique de tarifs mettant fin aux transferts - considérables opérés au bénéfice des monopoles et au - détriment de la grande masse des usagers et qui pèsent - sur les prix à la consommation. - § une politique coordonnée des transports,combinant le - développement des infrastructures nouvelles et l'utilisation - des capacités existantes répondant aux besoins des - usagers,des régions,du développement économique national - et des échanges internationaux de la France ,est à mettre - en oeuvre. - § cette politique doit s'insérer dans un plan de développement - à long terme des infrastructures nécessaires pour satisfaire - au mieux et au moindre coût économique et social - les besoins prévisibles.il est urgent de développer les - transports collectifs d'usagers,notamment les transports - urbains. - § il est nécessaire d'organiser une recherche scientifique - dégagée de la pression matérielle et morale des intérêts - privés qui s'efforcent d'en monopoliser les résultats et - compromettent son avenir à long terme. - § l'enseignement supérieur et les établissements publics de - recherche scientifique doivent recevoir les moyens - nécessaires au développement des différents secteurs de la - recherche,conformément à l'intérêt national. - § en ce qui concerne l'aménagement du territoire,il faut - en premier lieu assurer un niveau d'activité permettant - de réaliser le plein emploi,s'attaquer aux facteurs de - régression que sont les disparités en matière de - salaires,d'équipements collectifs et sociaux. - § les investissements publics,ceux du secteur nationalisé, - doivent être orientés en vue de rééquilibrer les - économies régionales.il est urgent de prendre des mesures - pour arrêter le dépérissement des régions du Centre de - la France ,de l'Ouest-Sud-Ouest .des mesures - spécifiques doivent être adoptées à cet effet. - § les objectifs généraux suivants doivent être assignés - à la politique d'aménagement du territoire. - § infrastructures $: - _accélération des liaisons de désenclavement des régions - et de jonctions radiales interrégions,notamment - autoroutières sous le contrôle et avec le financement - de l'*état ; - _arrêt des fermetures de liaisons ferroviaires et - accélération des programmes d'investissements; - _participation accrue de l'*état et du FDES - (*fonds développement économique et social ) à la - modernisation des installations portuaires et fluviales; - _modernisation et extension prioritaire du réseau de - télécommunications. - § industrie $: - _développement diversifié des activités économiques - régionales prenant appui sur les ressources propres de - chaque région et leur vocation; - _utilisation de l'ensemble des ressources industrielles, - énergétiques,minières,agricoles et humaines de chaque - région. - § dans le domaine législatif et réglementaire,il est - nécessaire de prendre les mesures suivantes $: - _élection au suffrage universel direct et à la - proportionnelle des *conseils régionaux et accroissement - des ressources des régions par transfert du budget - de l'*état et suppression de la fiscalité supplémentaire - prévue par la loi du 5 juillet 1972; - _augmentation de la représentation des organisations - représentatives des salariés dans les CESR (*conseils - économiques et sociaux régionaux ) et répartition des - sièges attribués à ces organisations proportionnellement - à leur influence respective; - _suppression des sièges attribués aux organisations non - représentatives. - § il est indispensable de cesser les encouragements - sous des formes diverses visant à favoriser les exportations - de capitaux et il faut viser à se prémunir contre leurs - effets inflationnistes et à contrôler les mouvements de - capitaux pour défendre la monnaie.les investissements - de capitaux étrangers doivent faire l'objet d'un strict - contrôle et être interdits dans tous les cas où ils mettent - en cause la maîtrise de l'économie du pays et la - souveraineté nationale. - § il est nécessaire de procéder,progressivement,à une - diversification de nos relations économiques extérieures - tant en ce qui concerne le commerce extérieur que la - coopération technique et scientifique en les fondant - sur l'intérêt mutuel et en les étendant à un nombre plus - grand de pays,notamment les pays socialistes et les pays en - voie de développement. - § ces mesures ne peuvent être imposées que par les luttes - des salariés et des grandes masses de la population. - elles s'inscrivent en opposition avec la politique - réactionnaire du pouvoir dont les effets néfastes - s'expriment dans la crise actuelle. - - les libertés .. - - § luttant pour l'instauration d'un véritable régime - démocratique,la CGT s'oppose au caractère de plus en - plus autoritaire du pouvoir qui tente de le dissimuler - dans un libéralisme de façade. - § elle dénonce la propagande antisyndicale du patronat - et des hommes du pouvoir et les campagnes racistes - de leurs officines. - § la CGT s'élève contre l'accroissement des contraintes, - directes et indirectes du pouvoir et du patronat - dirigées contre les libertés individuelles et publiques - et mettant en cause les droits syndicaux,notamment le - droit de grève et les autres droits des travailleurs. - - libertés collectives et individuelles .. - - § elle juge que le respect des libertés fondamentales dans - notre pays exige,dans l'immédiat,l'ensemble des mesures - suivantes $: - _respect absolu du droit de pétition et de manifestation; - _abrogation de la loi du 8 juin 1970,dite loi - "anticasseur"; - _droit d'expression des syndicats sur les antennes de - la radio et de la télévision; - _abrogation de la loi du 7 août 1974 portant suppression - de l'ORTF et remplacement de cette loi par un ensemble - législatif garantissant l'indépendance,la démocratisation - et la qualité de la radio et de la télévision française; - _mise en oeuvre d'un statut démocratique du jeune soldat - assurant le droit d'association de libertés d'expression, - de respect de la dignité de l'homme citoyen et l'arrêt - de toutes sanctions prises arbitrairement; - _suppression des juridictions d'exception telle la - *cour de sûreté de l'*état ; - _modification profonde de la loi 1963 pour aboutir à - un véritable statut des objecteurs de conscience; - _rattachement de la police judiciaire au ministère de - la justice; - _démocratisation de la police dans son recrutement - sa formation et son utilisation; - _suppression des polices parallèles; - _rétablissement et respect des franchises universitaires; - _réforme de la procédure de flagrant délit; - _abrogation de la garde à vue; - _droit immédiat et gratuit,en cas d'arrestation,à - l'assistance d'un avocat; - _droit pour tout inculpé de connaître son dossier aussi bien - que le procureur; - _réforme des règles d'enquête judiciaire; - _levée du secret de l'instruction judiciaire; - _abolition du pouvoir discrétionnaire du *ministre de - l'intérieur en matière d'expulsion,de refoulement et - d'assignation à résidence; - _garantie des libertés individuelles et collectives des - travailleurs immigrés,de leur dignité,de leurs droits - d'expression,d'association et de leurs droits - politiques; - _réforme du système pénitentiaire dans le sens d'une - véritable humanisation des conditions de détention et de - la garantie de la sécurité des gardiens; - _répression sévère des attentats,violences et campagnes - racistes et stricte application de la loi antiraciste - du 1er juillet 1972. - - liberté de la presse et des autres moyens d'information .. - - § la crise que connaît actuellement la presse écrite - a son origine dans l'entreprise délibérée du pouvoir et - des quelques journaux à grand tirage,propriété de groupes - industriels et financiers,pour s'assurer le monopole de - l'information. - § c'est le même objectif que poursuit le pouvoir en - démantelant l'ORTF et en s'assurant plus complètement - le contrôle des radios périphériques. - § il s'agit de la volonté délibérée de mettre en cause - une liberté essentielle $: la liberté d'expression. - § le droit à l'information est une donnée essentielle et - permanente de la démocratie. - § la CGT demande une discussion générale de toutes - les parties intéressées _ y compris les représentants - des organisations syndicales de travailleurs en vue de - rechercher une solution d'ensemble pour assurer l'existence de - l'indépendance des moyens d'information. - § en outre,elle réclame $: - _une industrie nationale du papier de presse; - _l'abrogation des mesures fiscales et postales amputant - les aides consenties à la presse à la *libération ; - _une réglementation des ressources publicitaires; - _des garanties pour le libre exercice de la fonction - de journaliste aussi bien à la radio,à la télévision que - dans la presse écrite. - - - - - - - - - la CGT définit son action face aux grands problèmes - internationaux et au marché commun .. - la solidarité internationale,la paix,l'indépendance - nationale .. - - § l'accentuation de la crise générale du capitalisme - fait obligation au mouvement syndical de lier étroitement - la lutte pour les revendications économiques et sociales - des travailleurs aux niveaux national et international - ainsi qu'au combat plus général pour le maintien de - la paix,pour le développement de rapports internationaux - permettant l'établissement d'un climat mondial de - coopération entre les peuples. - § notre époque est caractérisée par des grandes luttes - des travailleurs et des peuples pour l'indépendance - nationale et la démocratie,le progrès social et la paix, - pour le socialisme.la solidarité internationale acquiert - des dimensions inconnues jusqu'ici. - § d'importants succès ont été obtenus dans ces domaines. - après avoir été contraint de signer les accords - de Paris ,l'impérialisme US a été chassé du Viêt-Nam et - du Cambodge qui ont été définitivement libérés. - des pays anciennement colonisés ont acquis leur - indépendance politique,certains acquièrent ou consolident - leur indépendance économique,au Portugal et en Grèce - le fascisme a subi un échec;des progrès sont enregistrés - pour l'établissement de la coexistence pacifique dans - le *monde ,pour la détente et la coopération - européenne. - § l'impérialisme est en crise profonde et s'affaiblit. - il est contraint à des reculs.mais,en vue de maintenir et si - possible de renforcer sa domination et son exploitation - sur les travailleurs et les peuples,il intervient de plus - en plus contre la liberté des peuples,emploie la violence - la plus bestiale comme au Chili pour s'opposer - au développement de la démocratie.il relance l'alliance - atlantique,dangereuse pour la paix mondiale et l'indépendance - des peuples,il fomente complots et agressions. - § de plus,il favorise le développement des sociétés - multinationales et l'internationalisation de l'exploitation - des travailleurs,il organise l'intégration monopoliste - comme dans le *marché commun . - § la CGT considère que la lutte anti-impérialiste - et antimonopoliste est un impératif pour la défense des - intérêts des travailleurs. - § en se félicitant qu'en France des actions unitaires - se manifestent pour l'affirmation de la solidarité - internationale des travailleurs et la défense de la paix, - la CGT s'efforce de faire progresser l'action unie - de la classe ouvrière et des organisations syndicales - dans le monde et plus spécialement en Europe . - § constatant que la politique extérieure du *pouvoir - en France s'efforce d'enchaîner notre pays à la - stratégie planétaire de l'impérialisme US,la CGT - exige le respect et la défense de l'indépendance - et de la souveraineté nationale,que soient prises par - notre pays des initiatives pour la coexistence pacifique, - pour le désarmement général et contrôlé,pour l'établissement - d'une action et durable entente entre les peuples du - monde. - § la CGT se prononce et déploie son action $: - _pour la participation active de la France à la détente - internationale,aux règlements par voie de négociations - des litiges internationaux,à l'organisation de la coexistence - pacifique et du désarmement général; - _pour la suppression de toute force de frappe atomique,qu'elle - soit nationale,multinationale ou européenne et des - armes de destruction massive,pour la réduction des - dépenses d'armement et l'utilisation des fonds ainsi - disponibles à la solution des grands problèmes de notre - temps (aide aux pays sous-développés,lutte contre le - chômage et pour l'emploi,contre la pollution,etc); - _pour la dissolution simultanée de tous les blocs - militaires.la France ne doit pas participer à un bloc - militaire quel qu'il soit, ce qui implique son - désengagement du *pacte atlantique ; - _pour le respect de l'indépendance des peuples,la - non-ingérence dans leurs affaires intérieures et l'établissement - sur un pied d'égalité d'une véritable politique de - coopération avec les peuples nouvellement indépendants; - _après la victoire historique des peuples du Viêt-Nam et - du Cambodge ,la CGT exigera que ces peuples qui - ont eu à supporter durant de longues années une guerre - de destruction massive puissent faire valoir leurs droits -à de justes réparations et pour une reconstruction - rapide des régions dévastées.la France doit élargir - et développer ses rapports,avec la *république - démocratique du Viêt-Nam ,avec le GRP du Sud-Viêt-Nam , - avec le Laos et le GRUNC du Cambodge ; - _pour le règlement politique du conflit au Moyen-Orient sur - la base des résolutions de l'ONU prévoyant,en premier - lieu,l'évacuation des territoires occupés par l'armée - israélienne,la reconnaissance des droits nationaux - du peuple arabe de Palestine ,le droit à l'existence - de tous les états de la région y compris l'*état - d'Israël .la CGT souhaite que la *conférence de - Genève permette un tel règlement écartant à l'avenir - toute ingérence impérialiste et que s'instaure un climat - de détente et de coopération entre les *états et les - *communautés du Moyen-Orient ; - _pour l'organisation d'une véritable sécurité collective - entre tous les *états d'Europe sans distinction - de régime politique.la CGT soutient les diverses - initiatives qui tendent à créer sur notre continent - un véritable climat de coexistence pacifique.elle - souhaite que rapidement soient menés à bien les travaux - de la *conférence européenne de sécurité et de - coopération ; - _pour la liquidation totale du colonialisme et pour - la condamnation de toute politique néo-colonialiste - tendant à maintenir sous la dépendance du système - capitaliste de nombreux pays,particulièrement en ce qui - concerne l'exploitation de leur richesse nationale. - la CGT soutient l'action des peuples concernés - pour la libre disposition et la mise en valeur de leurs - richesses naturelles,leur commercialisation et leur - utilisation.elle dénonce la politique de l'impérialisme qui - vise à maintenir de nombreux pays dans des zones de - dépendance économique et politique portant ainsi - entrave à la lutte pour une véritable indépendance - nationale. - § la CGT s'est félicitée et a salué les succès des - forces démocratiques au Portugal et la liquidation - du régime fasciste en Grèce .elle est solidaire - et apporte un appui sans réserve à la lutte des travailleurs - et du *peuple d'Espagne pour un changement radical - de régime,pour l'amnistie,pour la démocratie et la - liquidation du franquisme. - § de même,elle continuera d'être aux côtés des peuples - d'Afrique du Sud ,de Zimbabwe ,de Namibie dont - l'action est renforcée par les succès anticolonialistes - arrachés par les peuples de Guinée-Bissau ,d'Angola - et du Mozambique . - § la CGT,en dénonçant les interventions répétées des - USA et,plus précisément d'organismes comme la CIA - en Amérique latine ,affirme sa solidarité aux travailleurs - et aux peuples de cette région du monde.elle développera - avec plus de force le soutien et l'aide aux travailleurs - et au peuple du Chili ,dans leur détermination pour la - liquidation de la junte fasciste et le rétablissement - des libertés démocratiques dans leur pays. - § les récentes luttes dans les pays dits départements - d'Outre-Mer ont posé avec force la nécessité du - changement des rapports entre la France et ces pays. - la CGT soutient leurs revendications nationales - et leur demande légitime d'accéder à un statut d'autonomie. - § face au développement des sociétés multinationales - la CGT considère que chaque pays a le droit $: - _de prendre des mesures pour que les sociétés - multinationales investissent leurs bénéfices dans le pays - où ils ont été obtenus; - _d'orienter les investissements d'origine extérieure - vers tel ou tel secteur ou vers telle ou telle région, - suivant les nécessités de son développement; - _d'instaurer un contrôle public et démocratique des - importations et exportations de capitaux; - _de nationaliser les entreprises implantées sur son - territoire et de disposer librement de ses ressources - nationales afin de créer ou d'assurer les bases d'un - développement indépendant et d'une coopération - internationale fondée sur les avantages mutuels. - § s'appuyant sur le soutien des travailleurs,la CGT - agit pour la reconnaissance et la pleine application - de ces principes par les gouvernements,les groupements - interétatiques et les organisations internationales - (ONU,OIT,etc).elle considère que les politiques - communes et les mesures arrêtées au niveau de la CEE - doivent respecter les principes énoncés ci-dessus. - § pour assurer la défense des intérêts des travailleurs, - face à l'internationalisation du capital et de la - production,la CGT exige également des mesures - économiques,à savoir $: - _les organisations syndicales doivent avoir le droit et - les moyens de discuter avec la direction des entreprises - multinationales des problèmes qui se posent à l'ensemble - des travailleurs d'une même société (ou d'un groupe). - le droit de négociations collectives internationales - pour les travailleurs appartenant à des groupes économiques - multinationaux,sans que cela affecte le plein exercice des - droits syndicaux au niveau de chaque entreprise et de - chaque état.il est nécessaire de promouvoir en ce - domaine,une réglementation communautaire.aucune - négociation,à un niveau international,ne saurait remettre - en cause les avantages acquis,ni porter atteinte au - droit de négociations des syndicats au niveau de chaque - pays. - _les travailleurs doivent avoir le droit effectif et les - moyens de participer pleinement aux activités syndicales, - nationales et internationales.ils doivent disposer - pleinement du droit de grève sans restriction d'aucune - sorte.les organisations internationales et groupements - interétatiques (OIT,CEE,etc) doivent promouvoir les - instruments nécessaires à un libre exercice du droit - syndical et des droits sociaux et veiller à leur - application. - _des organismes représentatifs doivent être constitués - au niveau des sociétés multinationales avec droit - d'information et de consultation des représentants élus - des travailleurs et des organisations syndicales - de chaque pays,sur la politique sociale,la gestion - économique et notamment les résultats économiques,financiers - et la politique d'investissement menée par la société. - _pour assurer des garanties minimales aux travailleurs - en relation avec les problèmes nouveaux posés par le - développement accéléré des sociétés multinationales, - il est nécessaire de donner une portée plus effective et un - champ plus large aux normes internationales du travail - élaborées par l'OIT. - _les organisations internationales et groupements - interétatiques (OIT,CEE,etc) doivent promouvoir - les instruments nécessaires à un libre exercice du - droit syndical à l'extension des droits sociaux rendus - indispensables par le développement des sociétés - multinationales et veiller à leur application. - - le marché commun .. - - § favorable à une coopération englobant tous les pays - européens,y compris les pays socialistes,la CGT - réaffirme son opposition à la division actuelle de l'Europe . - § la CGT tient compte de la réalité que représente - le *marché commun ,mais elle considère que l'intérêt - national est d'assurer un meilleur équilibre et une - croissance plus saine de ses échanges,ce qui exige que - ses relations économiques,techniques et scientifiques - s'établissent avec tous les pays et soient réellement - fondées sur la base de l'avantage réciproque. - § assujetties aux plus puissants monopoles,les politiques - communautaires visent au renforcement de la domination - des grandes féodalités économiques et financières, - s'opposent à la maîtrise de l'économie nationale et - comportent des atteintes et des risques pour l'indépendance - nationale. - § face au *marché commun qui a favorisé un tel renforcement - et accentué les déséquilibres sectoriels et régionaux - mais s'est avéré incapable d'instaurer une politique - sociale prenant en compte les intérêts des travailleurs, - la CGT agit pour l'action commune des travailleurs et - des organisations syndicales d'Europe . - § les revendications et les réformes à partir desquelles - l'unité d'action doit se réaliser sont nombreuses.elles - concernent notamment $: - _s'agissant des revendications à avancer $: - _la garantie et la progression du pouvoir d'achat des - salaires,retraites,pensions et allocations;ce qui suppose - des mesures concrètes de nature à juguler la hausse des - prix et l'inflation; - _la sécurité de l'emploi et la garantie des revenus; - _la réduction de la durée du travail; - _l'allongement du temps de congés payés; - _l'amélioration des conditions de travail,de la protection - de l'hygiène et de la sécurité du travail,en général de - la qualité de la vie essentiellement dans les grandes - concentrations urbaines et industrielles; - _l'extension des libertés syndicales et des droits - démocratiques des travailleurs dans les entreprises ou - dans la vie publique; - _l'abolition de toute forme de discrimination entre - femmes et hommes,jeunes et adultes; - _l'égalité des droits dans tous les domaines pour les - travailleurs immigrés des pays membres et des pays - tiers; - _une véritable formation professionnelle et continue - en rapport avec les conditions actuelles; - _la mise en oeuvre d'une politique progressiste dans les - domaines de la sécurité sociale,de la santé,des prestations - familiales,de la retraite (sous le double aspect de - l'âge et des ressources garanties). - _s'agissant des réformes à proposer $: - _de convenir d'objectifs communs à atteindre dans le - domaine de la démocratisation des *institutions - communautaires; - _de présenter et de soutenir ensemble des propositions - concrètes de nature à faire échec à l'activité dominatrice - des firmes multinationales et dans l'immédiat,compte tenu - de la situation énergétique,de soumettre le cartel - international du pétrole à de strictes mesures de contrôle - conformément à l'intérêt général; - _de favoriser les échanges commerciaux,économiques, - scientifiques et culturels entre *états ; - _de stimuler la coopération,notamment dans l'informatique, - l'aéronautique et le nucléaire,de telle façon que - prédominent les intérêts généraux,ce qui implique la mise - en cause de l'utilisation des fonds publics pour le - financement de sociétés privées; - _de soutenir d'un commun accord l'idée de nouvelles - relations entre les pays de l'Europe et les pays en voie - de développement sans que ces relations puissent gêner - en aucune façon les relations bilatérales; - _de contribuer ensemble à la détente,à la sécurité collective - et à la coexistence pacifique des pays d'Europe de - systèmes économiques et sociaux différents. - § il s'agit d'un ensemble de revendications urgentes - et cohérentes qui peuvent être prises en compte par le - mouvement syndical au niveau de la CEE et qui s'inscrivent -dans le développement des luttes de la classe - ouvrière en Europe occidentale .la défense de ces - revendications exige une coopération accrue et l'action - unie des syndicats de l'ensemble des pays de la - *communauté . - - - - - - - - - la CGT poursuit son action pour une démocratie économique - et politique et pour le socialisme .. - - § accentuant tous ses effets nocifs,la crise qui - s'approfondit rend plus que jamais nécessaire de promouvoir - un type de développement économique et social reposant - sur une large participation des travailleurs et des masses - populaires et apportant une réponse véritable à leurs - besoins. - § pour réaliser des changements réellement novateurs dans - le domaine économique,politique et social correspondant - à l'intérêt national,à celui des travailleurs et des - grandes masses de la population,il est urgent et - indispensable d'imposer des solutions d'un contenu - fermement dirigé contre la domination des monopoles. - § la CGT a longuement déployé tous ses efforts pour - que se réalise l'alliance des forces de gauche sur une - telle base. - § elle s'est félicitée de la conclusion du *programme commun de - gouvernement entre le PCF,le PS et le mouvement des - *radicaux de gauche qui a ouvert les perspectives - d'une démocratie économique et politique réellement - nouvelle,permettant de retirer aux monopoles les moyens - de leur puissance,de maîtriser des leviers de commande - essentiels de l'économie et de les remettre à la *nation - et d'assurer ainsi la mise en oeuvre des mesures sociales - hardies répondant aux revendications des travailleurs. - § la CGT a apporté et elle apporte au *programme commun , - son plein soutien.par ses dispositions fondamentales, - il correspond, en effet,aux objectifs élaborés par les - instances de la CGT et définis à partir de ses propres - préoccupations syndicales. - § ces dispositions fondamentales du *programme commun - sont rendues encore plus urgentes pour apporter une - issue positive à la crise et elles constituent la base - indispensable à la réalisation d'un changement profond et - durable qui soit réellement novateur.à partir de ces - dispositions fondamentales,il est possible de le - perfectionner et de l'enrichir encore,ainsi que d'actualiser -ses dispositions conjoncturelles. - § assurer la satisfaction des revendications populaires, - fonder le développement économique sur le progrès social, - établir un cadre institutionnel démocratique dans lequel - les masses populaires et avant tout la classe ouvrière - pourront exercer leur influence,c'est l'objectif de - la démocratie économique et politique dont le contenu et - les moyens ont été précisés par les précédents congrès - de la CGT. - § le 39ème *congrès confédéral rappelle les mesures - essentielles,qui sont indispensables pour promouvoir - un autre type de développement économique et social - et qui sont maintenant substantiellement prises en - compte dans le *programme commun . - - démocratie économique .. - - § les changements à promouvoir visent à dégager les moyens - indispensables pour répondre aux revendications des - travailleurs et à faire de la politique sociale un facteur - de plus en plus essentiel du développement économique. - les mesures déterminantes à mettre en oeuvre sont : - - la nationalisation démocratique .. - - § la maîtrise des instruments décisifs du développement - économique doit être donnée à la *nation .ce qui exige que les - grands moyens de production et de contrôle du crédit - soient soustraits à l'emprise des féodalités économiques - et financières. - § c'est pourquoi la CGT s'est prononcée pour la - nationalisation démocratique des secteurs clés du - crédit,des banques et des compagnies d'assurances, - de la sidérurgie,de l'industrie du pétrole et de - l'énergie atomique,dans toutes ses composantes des groupes - dominants de l'électronique,de la grande industrie - chimique et pharmaceutique,de la construction des grands - moyens d'équipement,des industries aéronautiques, - aérospatiales,d'armement,de la construction automobile et - de la marine marchande. - - la gestion démocratique .. - - § la large et effective participation des travailleurs - et des organisations syndicales à la gestion des - entreprises publiques et nationalisées,constitue - un élément décisif pour assurer leur pleine efficacité - économique et pour répondre aux besoins des travailleurs - et des masses populaires.elle répond pleinement aux - aspirations légitimes des travailleurs à participer - à l'orientation,à la gestion et au contrôle des entreprises - nationalisées. - § assurant leur intervention active dans la détermination - des objectifs économiques de la politique sociale de l'entreprise -nationalisée,la gestion démocratique est une - condition primordiale de la démocratie économique. - § en ce domaine,le 37ème *congrès de la CGT et - ultérieurement le document de "réflexions et de propositions - de la CGT sur la gestion démocratique dans les - entreprises",ont précisé,de manière détaillée,les mesures - à mettre en oeuvre pour assurer et garantir le - caractère pleinement démocratique de la gestion des - entreprises nationalisées.à cet effet,il convient - essentiellement de promouvoir $: - _de larges droits pour les travailleurs,leurs représentants - élus et les organisations syndicales,leur donnant les - moyens d'exercer un contrôle efficace dans l'orientation, - la conduite et le contrôle de la politique générale et - sociale de l'entreprise.ce qui requiert des prérogatives - étendues comportant le droit et le devoir d'information - sur la politique de la marche de l'entreprise dans tous - les domaines de son activité; - ce qui nécessite des droits suffisants permettant la - consultation et l'intervention active des travailleurs - et de leurs représentants élus et la création des - instances nécessaires à l'exercice de ces droits aux - divers échelons de l'entreprise.un statut du personnel - de contenu progressiste,élaboré avec les organisations - syndicales,garantira l'emploi,la rémunération,les droits - du personnel,l'exercice du droit syndical et des droits - des travailleurs et donnera les moyens pour qu'ils participent - au règlement des questions relatives aux conditions de - travail sous tous leurs aspects; - _une autonomie effective de gestion des entreprises - nationalisées dans le cadre du plan et leur assurant - une large initiative dans les divers domaines de la - gestion financière,technique et commerciale et de la - politique sociale; - _une pleine et entière responsabilité du *conseil d'administration -qui aura notamment dans ses attributions - la nomination du personnel de direction; - _une composition démocratique de ce *conseil d'administration -comprenant des représentants du pouvoir - central,des représentants syndicaux élus par les - travailleurs,des représentants de certaines catégories - d'usagers et des collectivités locales ou territoriales. - - une planification démocratique .. - - § la nationalisation des secteurs clés,la maîtrise des - moyens d'action économique essentiels de l'*état par - un pouvoir démocratique fondent la possibilité de - promouvoir une planification démocratique.cette planification - est indispensable pour permettre un développement - progressiste d'ensemble de l'économie pour réaliser - sa cohérence,pour s'attaquer aux déséquilibres engendrés - par les monopoles et pour assurer le respect des - objectifs sociaux et pour élever d'une manière - continuelle le niveau et les conditions de vie. - § en matière économique,la planification démocratique - est le complément nécessaire et indispensable de la - nationalisation démocratique,pour réaliser une véritable - démocratie économique et politique à l'échelle de la - *nation ,pour assurer la cohérence d'ensemble du - développement économique,pour éliminer les disparités - et distorsions engendrées par les monopoles dans le - domaine économique et social. - § la participation des travailleurs et de leurs - organisations syndicales à l'élaboration du plan, - au contrôle de son exécution est indispensable et constitue - une condition essentielle de son contenu réellement - démocratique et de la réalisation des objectifs sociaux - qui doivent constituer le fondement même de la planification - démocratique.ce qui implique à tous les échelons la - participation des organisations syndicales et qu'elles - disposent des informations les plus complètes. - la participation démocratique des travailleurs et de leurs - organisations syndicales s'exercera à l'échelon national - dans les grandes entreprises nationalisées,mais également - au plan régional,départemental,et municipal ainsi que - dans les institutions de recherche et d'enseignement. - les attributions des diverses instances de la planification - devront être définies démocratiquement,assurer une - représentation satisfaisante des travailleurs et prévoir - les droits et moyens leur permettant d'assumer pleinement - leur rôle. - § l'élaboration du plan,son adoption et le contrôle - de son exécution devront constituer une attribution - essentielle de l'*assemblée nationale . - § la démocratisation de l'économie est inséparable de - l'élargissement des droits en matière économique des - comités d'entreprise et des organismes similaires - tant dans les entreprises nationalisées,les administrations - que dans les entreprises privées.dans ces dernières, - l'extension des attributions des comités d'entreprise - devra leur permettre de contrôler que l'activité de - l'entreprise est conforme aux options du plan démocratique - et respecte la politique économique assurant sa mise - en oeuvre,notamment dans le domaine des prix,du crédit - et de la fiscalité. - - démocratie politique .. - - § démocratie économique et démocratie politique sont - étroitement liées et complémentaires.s'attaquer à la - domination des monopoles,mettre en oeuvre les changements - structurels indispensables,satisfaire les revendications - des travailleurs nécessitent un pouvoir politique - d'origine et d'orientation démocratique et des changements - institutionnels correspondants. - § ceci exige conjointement $: - _un cadre institutionnel démocratique,ce qui suppose l'abrogation -de toutes les dispositions sur lesquelles - se fonde le pouvoir personnel; - _la séparation et l'équilibre des pouvoirs issus du - suffrage universel; - _une extension des libertés fondamentales et leurs - garanties tant en ce qui concerne les libertés collectives - qu'individuelles; - ce qui implique $: - _la garantie du droit de grève,de manifestation et de - réunion; - _la garantie du droit d'association et pour les partis et - groupements politiques,la garantie de pouvoir se former - librement et de déployer leur activité dans le respect - de la légalité; - _la liberté de la presse et un droit à l'information - assurant notamment l'attribution d'un temps d'antenne - régulier aux grandes centrales syndicales; - _le renforcement de la protection des libertés individuelles - et des droits du citoyen. - - rassemblement populaire pour la victoire du programme - commun .. - - § la CGT a engagé toutes ses forces dans la lutte - pour la démocratie économique et politique.le soutien - massif que le peuple de France a apporté au *programme - commun lors de l'élection présidentielle,le grand espoir - soulevé par la possibilité de voir accéder la gauche - au pouvoir pour y appliquer son programme,créant une - situation nouvelle,favorable pour gagner des millions - de consciences nouvelles à la nécessité du changement - démocratique. - § dans ces conditions nouvelles,la CGT poursuivra - inlassablement son action pour une démocratie économique - et politique.elle déploiera tous ses efforts pour - développer l'action commune sur des buts concrets et - promouvoir le grand rassemblement populaire,indispensable - à la victoire du *programme commun . - § la CGT développera son activité pour s'opposer à - toutes les tentatives et manoeuvres que développe et que - multipliera la bourgeoisie pour tenter de dissocier -l'alliance de la gauche et surtout pour s'efforcer de la - vider de son contenu antimonopoliste. - - les perspectives du socialisme pour la France .. - - § le régime capitaliste fait apparaître d'une manière - aiguë et massive,ses tares et ses absurdités,son - incapacité profonde à résoudre les problèmes fondamentaux - de notre époque. - § le socialisme représente l'avenir de notre société. - son idée progresse dans les consciences et prend un - caractère de masse. - § dès sa fondation,la CGT s'est assignée de transformer - la société capitaliste en mettant un terme à l'exploitation - capitaliste.son 37ème *congrès a encore précisé ce but - dans les statuts.le socialisme est le système économique - et social où l'exploitation de l'homme par l'homme est - bannie.son but est de répondre aux besoins matériels - et intellectuels grandissants des travailleurs et du - peuple,de créer les conditions susceptibles de libérer - l'homme de toutes les oppressions économiques,sociales - et culturelles et de permettre l'épanouissement complet - de ses facultés et de sa personnalité. - § la CGT estime que la définition des voies et moyens - pour parvenir au socialisme en France ,ainsi que des - mécanismes,organes,institutions et modalités de la gestion - et de la vie sociale qui sont à promouvoir pour son - édification,doivent être l'oeuvre commune des formations - politiques et syndicats intéressés. - § pour sa part,elle est prête,en tant qu'organisation - de classe la plus intéressée à l'instauration du socialisme, - à y contribuer dans le respect de son caractère d'organisation - de masse et avec ses vues propres résultant de sa spécificité - d'organisation syndicale. - § le document "thèmes de réflexion sur les perspectives du - socialisme pour la France et le rôle des syndicats" - a exposé les principales idées communes aux organisations - de la CGT.sa discussion a conduit à une large approbation - de son contenu par les organisations de la CGT et - par les travailleurs.il conserve pleinement sa valeur. - § les réflexions exposées dans ce document constituent - la base commune aux organisations de la CGT pour - la poursuite de la réflexion et de la discussion tant - avec les travailleurs qu'avec les forces intéressées - à ce but et pour laquelle la CGT demeure disponible. - § elles constituent la base de sa contribution à la - nécessaire élaboration de positions communes rassemblant - les forces qui luttent pour le socialisme. - § en même temps qu'elle engage toutes ses forces dans - la lutte pour la démocratie économique et politique - afin de réaliser les changements qu'il est urgent - d'apporter à la société,la CGT agit pour gagner toujours - plus de travailleurs à l'objectif du socialisme et - pour que mûrissent les conditions susceptibles d'en - rapprocher le terme pour notre pays. diff --git a/Rlib/textometrieR/data/bfm.R b/Rlib/textometrieR/data/bfm.R deleted file mode 100644 index 8411f35..0000000 --- a/Rlib/textometrieR/data/bfm.R +++ /dev/null @@ -1,4 +0,0 @@ -## Adv in the 5 discourse types of the BFM corpus (Base de français médiéval). -bfm <- matrix(c(103000, 23429, 15345, 11, 16517, 1370887, 413441, 194894, 119, 270676), nrow=2, byrow=TRUE); -rownames(bfm) <- c("ADV", "other"); -colnames(bfm) <- c("litteraire","historique","didactique","juridique", "religieux"); diff --git a/Rlib/textometrieR/data/corpus.tiny.cooccurrences.R b/Rlib/textometrieR/data/corpus.tiny.cooccurrences.R deleted file mode 100644 index 0de3b1a..0000000 --- a/Rlib/textometrieR/data/corpus.tiny.cooccurrences.R +++ /dev/null @@ -1 +0,0 @@ -corpus.tiny.cooccurrences <- factor(c("S", "S", "F", "G", "S", "F", "F", "G", "S", "S", "F", "G", "F", "S", "S", "S", "F", "S", "G", "F", "S", "S")); diff --git a/Rlib/textometrieR/data/robespierre.R b/Rlib/textometrieR/data/robespierre.R deleted file mode 100644 index b29e4fb..0000000 --- a/Rlib/textometrieR/data/robespierre.R +++ /dev/null @@ -1,17 +0,0 @@ -de <- c(464, 165, 194, 392, 398, 235, 509, 96, 58, 662); -peuple <- c(45, 18, 15, 14, 53, 30, 42, 16, 4, 59 ); -republique <- c(35, 10, 16, 29, 29, 9, 21, 14, 2, 42 ); -ennemi <- c(30, 13, 11, 19, 22, 10, 16, 7, 2, 35 ); -patrie <- c(6, 5, 16, 8, 23, 10, 35, 8, 3, 39 ); - -robespierre <- matrix(c(de, peuple, republique, ennemi, patrie, rep(0, 10)), nrow=6, byrow=TRUE) -tokens <- c("de", "peuple", "republique", "ennemi", "patrie"); -rownames(robespierre) <- c(tokens, "others"); -colnames(robespierre) <- paste("D", 1:10, sep=""); - -partSize <- c(8395, 2558, 3920, 6903, 7896, 4555, 10142, 2063, 1084, 13933); -robespierre[6,] <- partSize - colSums(robespierre); - -rm(list=c(tokens, "partSize")); -rm("tokens"); - diff --git a/Rlib/textometrieR/inst/CITATION b/Rlib/textometrieR/inst/CITATION deleted file mode 100644 index 2810e9a..0000000 --- a/Rlib/textometrieR/inst/CITATION +++ /dev/null @@ -1,14 +0,0 @@ -citHeader("To cite 'textometrieR' in publications use:") - -citEntry(entry="article", - title="The textometrieR software package for textual corpora description", - author=personList(as.person("Sylvain Loiseau"), as.person("Matthieu Decorde")), - journal="", - volume="", - pages="", - year="", - url="", - textVersion=paste("", - "", - "", - "", sep="")) diff --git a/Rlib/textometrieR/man/bfm.Rd b/Rlib/textometrieR/man/bfm.Rd deleted file mode 100644 index 8bb2dd7..0000000 --- a/Rlib/textometrieR/man/bfm.Rd +++ /dev/null @@ -1,28 +0,0 @@ -\name{bfm} -\alias{bfm} -\docType{data} -\title{ ~~ data name/kind ... ~~} -\description{ - Contingency table of the frequency of adverbs in the BFM (Base de Francais - M \' e di \' e val) \emph{vs} all other parts of speech in each of the five genre - (literary, historical, didactic, law, religious). -} -\usage{data(bfm)} -\format{ - The format is: - num [1:2, 1:5] 103000 1370887 23429 413441 15345 ... -} -%\details{ -% ~~ If necessary, more details than the __description__ above ~~ -%} -\source{ - BFM : http://w3.ens-lsh.fr/egerstenkorn/bfm/ -} -%\references{ -% -%} -\examples{ -data(bfm) -%## maybe str(bfm) ; plot(bfm) ... -} -\keyword{datasets} diff --git a/Rlib/textometrieR/man/cooccurrences.Rd b/Rlib/textometrieR/man/cooccurrences.Rd deleted file mode 100644 index 4b5990d..0000000 --- a/Rlib/textometrieR/man/cooccurrences.Rd +++ /dev/null @@ -1,30 +0,0 @@ -\name{cooccurrences} -\alias{cooccurrences} - -\title{ compute association score beteen tokens } -\description{ -Compute association between pairs of words in a text. Not implemented yet. -} -\usage{ -cooccurrences(corpus) -} - -\arguments{ - \item{corpus}{ The number of cooccurrences found in a given unit (phrase, sentence, paragraph) between \code{type1} et \code{type2} } -} - - -\value{ - -} - -\references{ -Lafon P. (1981) <<~Analyse lexicom\'etrique et recherche des cooccurrences~>>, \emph{Mots}, pp. 95--148, n~3. -See http://www.persee.fr/showPage.do?urn=mots\_0243-6450\_1981\_num\_3\_1\_1041 -} - -\author{ Sylvain Loiseau } - -\examples{ - -} diff --git a/Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd b/Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd deleted file mode 100644 index 474467b..0000000 --- a/Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd +++ /dev/null @@ -1,35 +0,0 @@ -\name{corpus.tiny.cooccurrences} -\alias{corpus.tiny.cooccurrences} -\docType{data} -\title{ testing data set for cooccurrences function } -\description{ - - A vary basic representation of a text for illustrating cooccurrences computing - -} -\usage{data(corpus.tiny.cooccurrences)} -\format{ -} -\details{ - - Data frame containing three values, "S" for sentences boundaries, "G" and - "F" for two phenomena whose cooccurrences inside sentences are observed. - -} -\source{ - - Lafon P. (1981) Lexicom \' e trie et cooccurrences, Mots, 2, pp. 120. - -} -\references{ - - Lafon P. (1981) Lexicom \' e trie et cooccurrences, Mots, 2, pp. 95-148. - -} -\examples{ - -data(corpus.tiny.cooccurrences) -#cooccurrences.corpus(corpus.tiny.cooccurrences); - -} -\keyword{datasets} diff --git a/Rlib/textometrieR/man/pareto.Rd b/Rlib/textometrieR/man/pareto.Rd deleted file mode 100644 index 37f2c9a..0000000 --- a/Rlib/textometrieR/man/pareto.Rd +++ /dev/null @@ -1,21 +0,0 @@ -\name{pareto} -\alias{pareto} - -\title{ Draw a pareto graphic of lexical distribution } -\description{ - Draw a pareto graphic of lexical distribution -} -\usage{ -pareto(x) -} - -\arguments{ - \item{x}{ named vector of frequencies } -} - -\value{ - a plot -} - -\author{Sylvain Loiseau} - diff --git a/Rlib/textometrieR/man/robespierre.Rd b/Rlib/textometrieR/man/robespierre.Rd deleted file mode 100644 index 7207e74..0000000 --- a/Rlib/textometrieR/man/robespierre.Rd +++ /dev/null @@ -1,45 +0,0 @@ -\name{robespierre} -\alias{robespierre} -\docType{data} -\title{ Robespierre's discourses } -\description{ - A lexical table containing the frequencies of 5 words in 9 Robespierre public - discourses (between november 1793 and july 1794). -} -\usage{data(robespierre)} -\format{ - The format is: - num [1:6, 1:10] 464 45 35 30 6 ... - - attr(*, "dimnames")=List of 2 - ..$ : chr [1:6] "de" "peuple" "republique" "ennemi" ... - ..$ : chr [1:10] "D1" "D2" "D3" "D4" ... -} -\details{ - - The last line of the table give the total frequency of all the other forms in - each of these discourses. - -} -\source{ - - Lafon P. (1980) Sur la variabilit \' e de la fr \' e quence des formes dans un corpus, Mots, 1, pp. 127--165. - -} -\references{ - - Lafon P. (1980) Sur la variabilit \' e de la fr \' e quence des formes dans un corpus, Mots, 1, pp. 127--165. - -} -\examples{ -data(robespierre) - -## See graphic in Lafon, 1980 : 140 - -t <- colSums(robespierre)["D9"]; # size of the part -T <- sum(robespierre); # size of the corpus -f <- rowSums(robespierre)["peuple"]; # total frequency of "peuple" -p <- dhyper(1:15, f, T-f, t) -plot(p, type="h", main="Probabilities of various frequencies of 'peuple' in discourse 'D9'", xlab="Frequency of 'peuple'", ylab="Prob(k)"); - -} -\keyword{datasets} diff --git a/Rlib/textometrieR/man/specificites.Rd b/Rlib/textometrieR/man/specificites.Rd deleted file mode 100644 index c2b263f..0000000 --- a/Rlib/textometrieR/man/specificites.Rd +++ /dev/null @@ -1,58 +0,0 @@ -\name{specificites} -\alias{specificites} - -\title{ Compute specificites association score } -\description{ - - Compute specifities association score, i.e. an indicator of the association - between tokens and sub-corpus, given a lexical table - -} -\usage{ -specificites(lexicaltable, types=NULL, parts=NULL) -} - -\arguments{ - - \item{lexicaltable}{ a complete lexical table, i.e. a numeric matrix where - each line is a token and each column a part of a corpus. Each cell give the - frequency of the given token in the corresponding part of the corpus. } - - \item{types}{ Indicate for which rows the specificity index must be computed. - If \code{NULL}, the specificity index is computed for every form. If - \code{types} is a character vector, it indicates the name of the row of - \code{lexicaltable} to be used (an error is thrown if \code{clt} has no row - names). If it is an integer vector, it indicates the index of the row to be - used.} - - \item{parts}{ Indicate for which columns the specificity index must be computed. - If \code{NULL}, the specificity index is computed for every part. If - \code{parts} is a character vector, it indicates the name of the columns of - \code{lexicaltable} to be used (an error is thrown if \code{clt} has no - column names). If it is an integer vector, it indicates the index of the - column to be used.} - -} - -\value{ - -The fonction return a matrix of \code{nrow(clt) * ncol(clt)} (the number of -rows and columns may be reduced using \code{types} or \code{parts}), each cell -giving the frequency index. - -} - -\references{ - Lafon P. (1980) Sur la variabilit \' e de la fr \' e quence des formes dans un corpus, - Mots, 1, pp. 127--165. -} - -\author{Sylvain Loiseau} - -\seealso{ \code{\link{specificites.probabilities}}, \code{\link{specificites.lexicon}} } - -\examples{ -data(robespierre); -specificites(robespierre); -specificites(robespierre, types="peuple", parts=c("D9", "D10")); -} diff --git a/Rlib/textometrieR/man/specificites.lexicon.Rd b/Rlib/textometrieR/man/specificites.lexicon.Rd deleted file mode 100644 index 8d2c87e..0000000 --- a/Rlib/textometrieR/man/specificites.lexicon.Rd +++ /dev/null @@ -1,29 +0,0 @@ -\name{specificites.lexicon} -\Rdversion{1.1} -\alias{specificites.lexicon} - -\title{ -specificites association score with two frequency list. -} - -\description{ -Compute specificites association score between a lexicon and a sub-lexicon -} - -\usage{ -specificites.lexicon(lexicon, sublexicon) -} - - -\arguments{ - \item{lexicon}{ a frequency list (named vector) } - \item{sublexicon}{ a frequency list (named vector) } -} - -\value{ - specificites index as a named vector. -} - -\seealso{ - \code{\link{specificites}} for specificites score and reference -} diff --git a/Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd b/Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd deleted file mode 100644 index 97796c1..0000000 --- a/Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd +++ /dev/null @@ -1,28 +0,0 @@ -\name{specificites.lexicon.probabilities} -\Rdversion{1.1} -\alias{specificites.lexicon.probabilities} - -\title{ - Raw hypergeometric probabilities -} -\description{ - Raw hypergeometric probabilities for computing specificites, see \code{\link{specificites.lexicon}} -} -\usage{ - specificites.lexicon.probabilities(lexicon, sublexicon) -} - -\arguments{ - \item{lexicon}{See \code{\link{specificites.lexicon}}} - \item{sublexicon}{See \code{\link{specificites.lexicon}}} -} - -\value{ - Hypergeometric probabilities. See \code{\link{specificites.lexicon}}. -} - -\author{ Sylvain Loiseau } - -\seealso{ - See \code{\link{specificites.lexicon}} -} diff --git a/Rlib/textometrieR/man/specificites.probabilities.Rd b/Rlib/textometrieR/man/specificites.probabilities.Rd deleted file mode 100644 index b4aeac6..0000000 --- a/Rlib/textometrieR/man/specificites.probabilities.Rd +++ /dev/null @@ -1,30 +0,0 @@ -\name{specificites.probabilities} -\Rdversion{1.1} -\alias{specificites.probabilities} - -\title{ - Raw hypergeometric probabilities -} -\description{ - Raw hypergeometric probabilities, used for computing specificites (see \code{\link{specificites}}). -} - -\usage{ -specificites.probabilities(lexicaltable, types = NULL, parts = NULL) -} - -\arguments{ - - \item{lexicaltable}{ see \code{\link{specificites}} } - - \item{types}{ see \code{\link{specificites}} } - - \item{parts}{ see \code{\link{specificites}} } - -} - -\seealso{ - - see \code{\link{specificites}}. - -} diff --git a/Rlib/textometrieR/man/textometrieR-package.Rd b/Rlib/textometrieR/man/textometrieR-package.Rd deleted file mode 100644 index 11aa774..0000000 --- a/Rlib/textometrieR/man/textometrieR-package.Rd +++ /dev/null @@ -1,53 +0,0 @@ -\name{textometrieR-package} -\alias{textometrieR-package} -\alias{textometrieR} -\docType{package} -\title{ -Statistical exploration of textual corpora -} -\description{ -Statistical exploration of textual corpora using several methods -from french 'lexiometrie' and french 'Data Analysis' schools. It includes -methods for exploring irregularity of distribution of lexicon (or other -features) accross parts of texts; multidimensionnal exploration ('Analyse -des correspondances'), etc. -} -\details{ -\tabular{ll}{ -Package: \tab textometrieR\cr -Type: \tab Package\cr -Version: \tab 1.0\cr -Date: \tab 2009-01-18\cr -License: \tab GPLv3\cr -Depends: \tab R (>= 2.5.0)\cr -Packaged: \tab Thu Mar 12 17:00:01 2009; sloiseau\cr -Built: \tab R 2.7.1; ; 2009-03-12 17:00:03; unix\cr -} - -Index: -\preformatted{ -pareto Draw pareto graphic -specificites Compute specificites indices of association between words and subcorpus -repartition compute repartition graph -} -% ~~ An overview of how to use the package, including the most important ~~ -% ~~ functions ~~ -} -\author{ -Sylvain Loiseau, Lise Vaudor, Matthieu Decorde -% ~~ The author and/or maintainer of the package ~~ -} -\references{ -%~~ Literature or other references for background information ~~ -} -%~~ Optionally other standard keywords, one per line, from file KEYWORDS in ~~ -%~~ the R documentation directory ~~ -\keyword{ package } -\seealso{ -%~~ Optional links to other man pages, e.g. ~~ -%~~ \code{\link[:-package]{}} ~~ -} -\examples{ -data(robespierre); -specificites(robespierre); -} diff --git a/Rlib/textometrieR/tests/.RData b/Rlib/textometrieR/tests/.RData deleted file mode 100644 index 5a0fbeeac23ed9dad39026cb43c315f4365b7a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2221 zcmV;e2vYYSiwFP!000001I=2?ZyQAzUpt9oJ4u^1Ee$0p+qCH;ZIdQVnkMAoG)YTe zLP`;;!~w?kCSG+P?mn7Sfan2$tIw#^*LLXA^U7 zV9rh4co%ow!kpWJDr?BoTXq4h5!{xYIh5S0=ANJ)=ffPZCXND&Uf z={tnR4F+TV{(N0QtwK|An;QOBwv?t@)zn9B*smCdqO0L(;8-f`^AogSIt|6bTcnJ* z`HktYH50b3gss`IH5az7hOPOqbuDZypjOw$v=zE;nLC{I3c44(J=Aj`=)s?eH@XeW+(qev z3JSihm<$e)vF$~dod1}rGZ$BliNoYcqVs4dm zlPjm;>WZb-I9&xzF?O7WL~x}|Zsk$?6yq1n&$aREVR}9@m&G%gS%WHDE!A*H$2hB0 zQVDsqX6o=xpeu$0tS1EFjXBxs3>!$rs%{hRdESUJtS}=8!E+zUN82%*97mjc zzoE#;PqOaXjtm=%+U9*zS7b|h z1cT`)b=iN!A)DK>6U_l&DY9WY@C8oRiuJWcPS8Zf+= zR$-)dn2U-9qY4Zr^eH`3-fh5gY{LS(R1t8Ra};JNkLLGT9?f@9Tf{8u@hxK(77ngz zp!SdqIK~9*TAIx0sS`J{5snS+SB<*TRE#<>YP=_ixhcY&;qJBxN;OCq85L*KsC+P} z$v-lb9pI>sDMf~uSiF-(T+_7Gs5o*WuPk>UxDW{D$Sc%MH&S+GNm!h4YlyBeQ6sA~ z8xUbFajLR257UX0(7(XxXCv88>s3bfIyIJ8y3h0G@hUNaE$n)%Evp%9$ogmT`ITv=+;Q zo$2JwQeK)%@RG>0xO^;f=Fm~+7Qg+l_^ma71!@l7`NdW`8Fbk?k~O+p@#r>y4a+zg z#vv$MWnk3(^M1@P{KjCNx8r)ZFj<9ta;UZZSgARtm7&VLOtmLy?Lt1wC#BA~mpWdSc*VtD01B{7 z+_4nk;4<-Yn`}7B)l~<3{4Fq;HN9uHV*16(SO{QM_#NJ7pfM2u697doCmYyTtg)9C z-F3^q%$Ftda8@9HlOunVmM_q+9We1;`-&3h7CR>c2#scqk{E;_c(WknzeoR%L8#Qu zn*D;1Z^SDAp_0HT9tfp2>Q#dfy~*zg^6F65oS9oUHCH#%Z*G`M?ViBgrrJZS*E)ts zFNf1YWCw`jKbAy_dSSck@l&A8O^(c)Y;@Y747neEN|?jcfEZwho|MSvC4X)#B}8)t zDaegTCApe~d(wg30CG$tINdzp@!B;%-`HR=PF{-@ib~&+?39F(I>)^m&Jxw vNcun8EoA*wb1*-T4|fkBd~jHc{roumv2pm*;_JAvjA zyYrs(c9B2=H9xHf?)==jbLY;?ojX5oR;Ru>@APATwfOrg%WYIS>g?!j<#FH*#0ld3 zN?nGC3vhOHbW|giLiBC-2h;<aGA9V~aprV0!5*H6p%hV$i&J_?p~f z|7ZlhaQSJ5mjf3unWNMW)IO+ot1gjaw?EPIZ&2S9J*6 z)HcPBELeSv%Q$bo?LbOif_#N>IkAR1mA~MKjD5>Z2J#D+@S_&6Qb8|4Fy8xZ^zY( z3~_^FHG&SVLCjG9g4CCwKd?mGdwPdrXa4fRDS^ButiVZfdP{pjIi9BHL~kZaUIX?s;% z^{L;JT-QWWK{XCP&F+{mH)oREW$r>uY8dCDzbGnRTU;EtuA|hBE^}WARe)i)5!cwRAgeBo8LzIkcD%w0EKlnk722h( z`t71pt+Sk|KE{Pnn$}?!4W!~lXrD8=%)L^5T$x!kR&QkzUZp<4)l`tEF^k_gW|@19 z`b(~{*_2MMPVzeSxZ2=ooyA%D$7cDVy0?jbl0^+{Vxjb`G2f=To2I#wmaTaLe3z z>a*NXN&2*GkCb{twnsE0bR#D5G%JFCU62>Vb4pJ{KN+4}C!+tqj5j!I#+>fwT#UE$ z!!PU%8~@2k@SmCl|M(>M*%RWicw&rAy`z?@b-mD)3Gv)`8>&d}pe_1`U2f%1=ZrF( zm-a}QpLR<)KRruAl~xiiNav2mWCgn)>tc+1cv$WDaH=Oc_z<@FMKE}uGu)`da4&-X zar3Vow-VfBpB;VH@TzB_m_^SR>MixEY|3FYP)5Z8U4U-DPCx>%3-B&L51L9$a3^3N;4Z*^^v(8$()!`<-H0^|mTu|o?m?_^hmC8h zD{W5f=|x|)H?1#iiVycmG%Qh2wl$ST`{IL$ZQfzWT88X0ZHe;I=44+A*>yw09HrY5 zAwiB}XYDLi9?wmBf922EU(Ipx zq@*3sUQ0pPfKqd1>*0gH6Z=VSL*~KfIm@fw`sC05c}rJYZKvQ@3x19GM+B3W)0*bF z5-Ni2in<3m&$?L`MY>n0?-TzqDi(vB1xULkZD33E z3uL;rq6v|7f*_eL$~14#v(-=hItI9u&X1E?X~G_9Mv-$N13y6 zJiBJ&IQ6n|81r**9KUQj&YNr;$21$qvvD?#isQunMo!U&S_HgOI^{x&eV|i0NU`-g zc4$r{*EWvDT@4qTY7tVranPwkq}Yc#bp_(sj9RJ1Nb$abdF9?R68jH zTIPPn&xll~4l}NHi0`F;N@RXqw?$+=zDsg%pdWje#7o52ala)qb+iDQt`ud?(J~hb zpUADGPfObeh8TbG0s5zR3ZJ;-O8+a}&!%9uihl?Fh#n)6`KYujEv0lnD=8b;M@rq# zu^z^i=Aip|EitApwZM{@GpRssnjHk8Cw@5rie?X+N zB&j2&P5Sw`$ZTr;k$y1sC`;>(?Iooty?sLZIW014-Oyz%ecMh-RcOh~`Cgz_z^BZ) zTIPWxLL<7T$LrVtF|l_`Ez;_d+ZYe*r|%bez>}Oe(LW(vrPP45C?@{MJ0-V>z9}>#(w2Q9b41I0lkm}$WsHwVFR2PkX4=jI zxus-3&(bpYh|Fr6aE{Rr$Q<-P$hg*-(;~C~Zer3}H?+)K1S8|3XKPxdI-_OQb5JSr z5t)z6O!?6LEOlJ#v)Bz&_^l9m(V=@PI|7a_h7OftUTurI_;gs}-(*3MuZXlnCjIX9ty3g%7 z$aSbdZh|TEY%TLE(kI$(XqnT}>KFe+r0S%vZJl4FjR?IGTdGGVEi#+8lTy!6YwT_$ zM$fE>=zL5@N=ZMTmYF^xwoYjszDjBoZs>E}&s;4F!GWi0F@B za!+ZUzlAh<#QmblXJn)v7acn;b5@ByN3@<42~Rx-?KQfNQQJmcZ$$dpD`Sz?<1UmZq@M?*Mdp1hYl@uOK1Xyv zE8_K7%N+bR^!PNC;|xwaf2}6^x6zfao}@Wc5qg%p5<90H9p`ohZuB)ps`Y>`8S?S1 zy(f`K1*v)eJ8rw`!A0iKMc>0O#{D}FjhxT=@HjO&U$PqBj`|b$m%>Hr#W-HqvUjNG zQ>~vn)Nfh!Z^Czn?SO5NVMq<*V3$HTbytY`X@9w=m}>ppzcyP(z)pN=Xh-dB2t!k^ zc8n4yCWCtes?AjEH$nRk06Hoj_nqtxw!!Abb&&1ixZ3^8dC7ACcmLe;^E;gV{f~Qj z`=rU;I@`#d`T4&8u{?J)MSx-e)138JS@Bf}uK}zEtO2YAlmf~CxNha;uxJhYtsGDR zs04%ooI<$MRn>rN0oMU=iK%J;8v#7#MgVnydO#G=0B8g>0X6}e0WE;*0q+2825bRr z1yI&Dgf{@T0onoE0XG6}0_*^g<`#tS1l$Vf0Ne)nBS0r028aW?0NsF{fCOL{;9Y1W;#FfMEdX??ku{aF>-nfbed>LBJskmqut5Km*Po@)eg- z|B8^>fbyeXN4PwP2(2U~55D?g<`g4+6!0YC2Fi}B9ZQWr1Ypk8ogbvEjOs_#)4W)N z*GjQ5jGx!(>bGDJH3JfBoGt9jR@ygKgtz?W`^RGM*D>U8&@o$j z1G*Pb2LSvR0#soJRAW|XOdul`wXoy4HWkAP%oA#Z?kmIKY;mQjJENn1^p3~}+b$#) zm6k?-#b0URnuS2OA)D5wXPE6sn~h_dcWYT}!4h|L=c;1M&9!pI8Z}jh(6aPb)A!!=16W=l_(A!3F03ly!R&Ud9V7cdGFclDzWChuXj50-tHO8jBQF{6TB@kG~AaOQfN%ua93Y%q}yyC z?lQeGEHQ!dP#{nlQo&$(W!0){=Bm7wT_z7FDmApKC|VaPQrDC<3?>H}l56kmSEjMR zGz!eHp#qzGhf*#5JKc$W>cybBy(i)7_f>C;_rEK#%3oAcUt*NCC;C<;x>J?0(2`iF z;vK5_Zv*8Y2~<=+6R5c6BZ11`Gl9xm3&T|(KU5gLwXmx4P~rMp3qKPK7$5)J{Z)?? z21oaQt@@F|@{?Z)2EJSPa?Q}${Ywu7!<{P+`3@ckJRf-U`rkbK^npl@@=>~RNYnHv$C;&r}4}OPF6j8@5$ z>%ab4bdE37vg~W$uJx7pJ{SGv8ehfwg>6jqN7wkC3IDfbe00SUPt`ZCKG1Mzxo04H z=-tbn>0IIoo(&}P*Le=ySL%7bv()oi)645T>pVYQ{e0(IPw3HG)_GoA=eY)1Ydsaq z*D&kNYdqiV+~5hfw%2-UJ=c1E{XA0ZFJG=x->mts6X9=1gVm1)HDdI&nrl5HpFgA4 z-LFmCkx|<~GJYk%-ap8`L(U+~8Fx0lGmIeH zna++M8!wK{qFZQ*%BHi^Zk0yv2mk%CC~g@_aM0+$W`39TZ#A}7cgZ#>j^jlfM~ZH2 zxh{E|u}T%)t3DJF6WZal{L;ZMX3Qj`(wq zxXGQi#b@xwG!jk#;USz94g)PGJ)QvRbeLmp!d)0Kvec(Aw&gARNGVwD5ic#Xa8{co z6@c$77qMs_JE=jTaCFNpSDMEhI8b-A8AxCa=&|KW_7uCx1}GiIvor!CnHU7_Rt-*W~L zH;e+$|0ke7WE4XB$GF|0oK&fj2d}PW4s8eBMCX4RT%9{zpA(Lpa{-f||E)fooVl)k zD(8Q_Hn5?;E4NCT5zb@%jJh^()zmTGPUx70D2OwR=Rhzgf2k`%LNPJp>zqc} z8j%NXw&RO^jH0PRkB`VfMYB(PQ}zj<@thvU-fnQ$QX^LeS7_9uTAcF%=rCU z|Mzj$S?lB}M|>6SgN08!;x8iZ2A)$ffZ1yAWvV!Hf#+T(V#R4^KIDj>am1TFnw~Vr z9r0f{;%&49mJE+O;<5}|_?x*TTk(ro|Lw9p*bCV45l6g`9~LbB1CID}j<^ZqYxl`M z#5s!$<0xVuSb)-SPvZLo4@YK068rNo(wVEeiB)}tx|sEUs(f8z`-)udD?%0L$l%;r zOkLibOuiM>GsM@O$+t2%Lws{H`G%`zh_5G;Z&l?C@trls*TZoO2141ob8+M5&EgxZ zo*BNgv-p;ucLzIlJkmc=(bLwa_3 z7T@af^U0fp?c_=I0}CP(*iCz`2FFfA7qXkhjNeW`r2?PkcbZ6*Hp`*>*E%+09GshitnUoS|{cwwo0*)DQkF zd%V7KX8LztCg1YF49$!DEWYJ4q-XQ9_=c_h#HH%Pf-Jt(Gh}xbX7a5FombDej;3*% z<4J@kJchVCxcP~5K4a?_0n`0zSd44&GJJO|#@mBpyq&og7w2`jI*;PbObgC{hj4X1 z5oQZ=qo8ZWdl^lmfB)QpGW->G7^N6%M63+&aW>;$F))0gHjFFyK4l^|j#Mu$<4xRQ z^4H@gN)F&(pJ3y72h$6Df7Uy$*C)6KE{Z3Z{S8^Ljllp91#h5)oCc4mMZdOOhwIyJ%+>gkMN4(?s}LBXxu*d=>h27WVz_jw3?a*wBP4e9G|TAcUx-v`LP zCuiP;oZ;+vD_-(o4qo<6_HJ|mdVM(SqgfF4XTEFlGNYq>S|*OyN-M=+`Oux?PeaLe z?*wcYxiaZSNBK&HPCkTbRt5N;GSMqfGClVL-{|OK*JLF|M|lZO*Gx%Y#ZBtyXaG^e z=z)Ks?)<-$&kp!)wud*46V=CYo(TWDz#p-n;Adr#p6kkuq=!dB3w^ z?emWuddHutM_jibJHE)qGvt?#hrV~@$kBz{f5|kGs`Za&t^Lx{Uq_z)?yvT@ed1%= zi6#kkB-HC<6e&usJ z|K!HqKlH2FkYhB*P@Ro?<9)+;ky7{)in#TY^;Z^;#X~`xVx7bkucTwbIu1G7w<^UHC&9uy6cg%mEr5 zT?7txds6u^L@wK$AM^1OBEQOW7xOH=*S%)P*xhJ0LP4>^i^JwGV2GP6R`x;u) z8)XAkd8FZ<^t?OM#yt%otol_Afr@A;mV5jPJQxVpo2B&)jg{$!y1Iqw`igXJ=x9UT zKwnR9cSlZXD81dCi}ks^wYscfGd7g?DfwV>DCymmGIR3H>au{>Z0$0hFgN#hofwP{ z-j&{fUmm;u{%DSxebdb zzh_bC!;6-VSG4=w;Xvk35Vn z97-?u%?TCGX)S)WXkKgW)wL_q_&sKBwATM+DCGs*!|zy)pWD+2Y13oC&e}2k@fV95 zaGDceCrtd0FDdw)I1NrV;8W2dpfUh_4&m+kVUVeX0R0&r`xqkNzN!QD^%vgCUs-)y zn_F%=6daFiX^C!Y zZ3hNo5W?^p!<UKVadeANU_uB#BI zECYR*%6curReE_xYg1E8v@sa$XuLVvxVfzH=0-M`VUb4c7 zU~P{=1hP5=3g_Z$HOqwA77PYV8%G+kF4oPC*C@meQ-Bus2poICs!!cv;r_-7+cb&g zQ-IB(Xh?2Nce{#=aN_q@klmV_=gw`m zg^o&v{=!*NTN6o6+jH(|COy>HQ!3*~lFmdPD?{g(SiELU}GR!Szg*u9j+{` z2-G!|R@H|ZOT$e~jn#orMX(~+a1gI@804$-j?Lf z;l4zTW8miIZFRms3SL;;b11NJ67AAsqF0V{h_Vp3BYnMv%lxZ*cjDAPJ-6T@>hD7p zT@%(ny}C)w_g9=(a{=rF;x6Ry-cNnYGK0C$sbRF5w;jB%X~DhKE^M?0C%ym3UCj`UDoSS!Rb8;wUHttI$`gbM<&6fUM$=l}Ujp=)^=0JH>d8i>= z5h#r|RR>Cg!6;@mKe)3U8K~t~2m!PkWb}{kKRo{zN>kLIN8eoBRwi+COdFJd?MY43 z9#x@Pv_H0+iv0UQByZUf8rUB2u6Mw?#hyxeCk_AHr(HKgXWnFS9zLeK&P>LO`03Vv zK3*4-cPaJj-+MYaydD4l)C0I@!w=wlckQZ@AA5+QFOx;DtV+FJ{lpy?qmXZx`Ge_! F{{boAFZ}=j diff --git a/Rlib/textometrieR/tests/authors b/Rlib/textometrieR/tests/authors deleted file mode 100644 index 4bb1caf..0000000 --- a/Rlib/textometrieR/tests/authors +++ /dev/null @@ -1,14 +0,0 @@ - a b c d e f g h i j k l m n o p q r s t u v w x y z -TD-Buck 550 116 147 374 1015 131 131 493 442 2 52 302 159 534 516 115 4 409 467 632 174 66 155 5 150 3 -EW-Buck 557 129 128 343 996 158 129 571 555 4 76 291 247 479 509 92 3 413 533 632 181 68 187 10 184 4 -Dr-Mich 515 109 172 311 827 167 136 376 432 8 61 280 146 470 561 140 4 368 387 632 195 60 156 14 137 5 -As-Mich 554 108 206 243 797 164 100 328 471 4 34 293 149 482 532 145 8 361 402 630 196 66 149 2 80 6 -LW-Clar 590 112 181 265 940 137 119 419 514 6 46 335 176 403 505 147 8 395 464 670 224 113 146 13 162 10 -PF-Clar 592 151 251 238 985 168 152 381 544 7 39 416 236 526 524 107 9 418 508 655 226 89 106 15 142 20 -FA-Hemi 589 72 129 339 866 108 159 449 472 7 59 264 158 504 542 95 0 416 314 691 197 64 225 1 155 2 -Is-Hemi 576 120 136 404 873 122 156 593 406 3 90 281 142 516 488 91 3 339 349 640 194 40 250 3 104 5 -SF7-Faul 541 109 136 228 763 126 129 401 520 5 72 280 209 471 589 84 2 324 454 672 247 71 160 11 280 1 -SF6-Faul 517 96 127 356 771 115 189 478 558 6 80 322 163 483 617 82 8 294 358 685 225 37 216 12 171 5 -Pe3-Holt 557 97 145 354 909 97 121 479 431 10 94 240 154 417 477 100 3 305 415 597 237 64 194 9 140 4 -Pe2-Holt 541 93 149 390 887 133 154 463 518 4 65 265 194 484 545 70 4 299 423 644 193 66 218 2 127 2 - diff --git a/Rlib/textometrieR/tests/bfmrepartition.R b/Rlib/textometrieR/tests/bfmrepartition.R deleted file mode 100644 index 7bc0d34..0000000 --- a/Rlib/textometrieR/tests/bfmrepartition.R +++ /dev/null @@ -1,29 +0,0 @@ -library("textometrieR") - -x1 <- c(100, 133, 284, 482, 568, 667, 838, 878, 957, 1030, 1102, 1122, 1204, 1344, 1459, 1704, 1932, 2134, 2168, 2270, 2400, 3052, 3508, 3619, 3680, 3703, 4066, 4124, 4167, 4299, 5000, 5041, 5102, 5773, 5870, 7042, 7104, 7452, 7475, 7511, 8043, 8068, 8363, 8531, 8736, 9035, 9036, 9099, 9308, 9656, 9890, 9956, 10153, 23533, 23561, 23843, 23992, 24120, 24571, 24591, 24717, 24757, 25048, 25393, 25407, 25542, 25716, 25741, 25836, 25867, 26207, 26523, 26641, 26662, 27307, 27488, 27616, 27788, 27927, 27937, 28532, 28609, 29412, 29870, 29902, 30054, 30239, 30258, 30278, 30394, 33873, 49658, 49696, 49728, 50139, 50155, 50232, 50361, 50366, 50397, 50452, 50812, 51012, 51097, 51184, 51313, 52481, 52527, 52619, 52741, 52979, 55049, 55151, 55384, 55394, 55655, 56138, 56231, 56495, 56807, 56851, 57040, 57149, 57245, 57287, 57409, 57461, 57519, 59175, 59354, 59540, 59652, 59687, 59838, 60456, 60461, 60886, 61212, 61344, 61345, 62173, 62575, 62609, 62717, 63306, 64136, 64174, 64545, 67604, 67732, 67777, 67938, 69307, 70442, 76990, 77178, 77234, 86003, 104435, 104451, 104562, 104653, 104935, 105117, 105251, 105324, 105361, 105419, 105446, 105498, 105657, 105785, 105874, 105919, 105986, 106108, 106258, 106388, 106457, 106615, 106691, 106813, 106833, 107260, 107379, 107387, 107688, 107778, 107873, 108020, 108145, 108240, 108316, 108430, 108459, 108601, 108646, 108940, 109193, 109382, 109543, 109558, 109582, 109703, 109822, 109960, 110059, 110154, 110236, 110325, 110346, 110397, 110416, 110754, 111019, 111097, 111118, 111278, 111308, 111473, 111648, 111663) - -x2 <- c(622, 1139, 3616, 3781, 4122, 4215, 4241, 4373, 4551, 4777, 4820, 5513, 5547, 5632, 5816, 7997, 8470, 8495, 9561, 9592, 10197, 10935, 10952, 11182, 11315, 11442, 11811, 11875, 11909, 12233, 12718, 12847, 12977, 13016, 13070, 13177, 13226, 13255, 13294, 13386, 14512, 14772, 14812, 14853, 14900, 15122, 15247, 15279, 15305, 15383, 15558, 15625, 15673, 15728, 15788, 16301, 16750, 16766, 16832, 16936, 17016, 17069, 17138, 17154, 17264, 17315, 17377, 17400, 17739, 17759, 17924, 17970, 18002, 18036, 18094, 18122, 18249, 18424, 18472, 18534, 18614, 18643, 18696, 18771, 19224, 19431, 19511, 19763, 19822, 19878, 20052, 20075, 20088, 20224, 20889, 20982, 21321, 21364, 21386, 21422, 21499, 21533, 21691, 21767, 21800, 22431, 22500, 23029, 23264, 23495, 23503, 23575, 23704, 23748, 33982, 36737, 49559, 59023, 59230, 59248, 61748, 63362, 66998, 83960, 84153, 84953, 85043, 85059, 85100, 85409, 85535, 85773, 85901, 85993, 86639, 86768, 87277, 87415, 87916, 89597, 96699, 96959, 97196, 97275, 97359, 97422, 97524, 97590, 98146, 98285, 98471, 98608, 98709, 98878, 99372, 99506, 99737, 99797, 100700, 100978, 101026, 101256, 101295, 101335, 101980, 102644, 103107, 103557, 103743, 104270, 104363, 105115, 105144, 105200, 105232, 105886, 105933, 106288, 106464, 106590, 106726, 106835, 107072, 107185, 107267, 107322, 107358, 110388, 111645, 111658, 111773, 111895, 112068, 112123, 112237, 112278, 112505, 112506, 112684, 112763, 112798, 113126, 113248, 113405, 113443, 113773, 113835, 113945, 114601, 114948, 115050, 115458, 115624, 115967, 116042, 116132, 116411, 116459, 116501, 116550, 116748, 116804, 116879, 117093, 117113, 117153, 117244, 117291, 117603, 117794, 117860, 117965, 118026, 118148, 118177, 118321, 118354, 118406, 118492, 118636) - -x3 <- c(23535, 23613, 23862, 24039, 24079, 24114, 30381, 30389, 30516, 30710, 30844, 31121, 31249, 33622, 33639, 33774, 34016, 34077, 34260, 34411, 34745, 34889, 34987, 35143, 36797, 36941, 37349, 37374, 37410, 37462, 37480, 37532, 37623, 37707, 38016, 38096, 38145, 38201, 38233, 38286, 38348, 38408, 38519, 38584, 38626, 38705, 38789, 39135, 39197, 39301, 39369, 39420, 39622, 39663, 40005, 40022, 40356, 40518, 40703, 41101, 41139, 41214, 41325, 41328, 41455, 41478, 41481, 41714, 41832, 41960, 42011, 42120, 42149, 42201, 42353, 42683, 42708, 42787, 42868, 42989, 43011, 43071, 43139, 43273, 43901, 44507, 44661, 44953, 44967, 45151, 45595, 45929, 46487, 46490, 46579, 46937, 47122, 47345, 47359, 47402, 47708, 47793, 47962, 48171, 48339, 48845, 48961, 49186, 49271, 49307, 49501, 61763, 63365, 67000, 83037, 83180, 83593, 83655, 83696, 83731, 83799, 85512, 85828, 86397, 86537, 87204, 87451, 88434, 88550, 96577, 96625, 96685, 96770, 97588, 98119, 99696, 99730, 99740, 100695, 100855, 101081, 101829, 102513, 102520, 102654, 102984, 103052, 103745, 104268, 105086, 105148, 112845, 113085, 113349, 115389, 116507, 116750, 117040, 117089, 117385, 118324, 118487, 118561, 118612) - -x4 <- c() - -structure <- c(10000, 25000, 30000, 49557, 73805, 103550, 110000) -snames <- c("pas tres", "spo tres", "s333333333333333333", "s4444444444444444444", "s555555555555555", "s666666666666", "s7") - -positions = list(x1, x2, x3, x4) - -colors = c("blue", "red", "black", "grey") -styles = c(1,2,3,4) -widths = c(2,2,2,2) - -names = c("Lancelot", "Galaad", "Perceval", "Boort") - -corpusname = "Graal" -Xmin = 0 -Xmax = 119000 - -#library("RSvgDevice"); -#devSVG("/home/mdecorde/Bureau/test.svg") -printrepartition(positions, names, colors, styles, widths, corpusname, Xmin, Xmax, "true", structure, snames, "Graph test de répartition titre donné par TXM normalement", 1000) -#dev.off(); diff --git a/Rlib/textometrieR/tests/ca.R b/Rlib/textometrieR/tests/ca.R deleted file mode 100644 index b223268..0000000 --- a/Rlib/textometrieR/tests/ca.R +++ /dev/null @@ -1,20 +0,0 @@ -table <- read.table("clipboard"); -myca <- ca(table) - -myca$rowmass -myca$rowdist -myca$rowinertia -myca$rowcoord - -myca$colmass -myca$coldist -myca$colinertia -myca$colcoord - -plot(myca, dim = c(1,2), map = "symmetric", what = c("all", "all"), mass = c(TRUE, TRUE), contrib = c("relative", "relative"), col = c("#0000FF", "#FF0000")) -mtext("side1", side = 1, line = 2); -mtext("side2", side = 2, line = 2) - - -table[order(table[ ,1]), ]; -plot3d.ca(ca(table, nd=3)) diff --git a/Rlib/textometrieR/tests/specificites.R b/Rlib/textometrieR/tests/specificites.R deleted file mode 100644 index 3a2febe..0000000 --- a/Rlib/textometrieR/tests/specificites.R +++ /dev/null @@ -1,4 +0,0 @@ -library(textometrieR); -# checking that the output of specificites() remains the same... -data(robespierre); # loading the sample data set -specificites(robespierre); diff --git a/Rlib/textometrieR/tests/specificites.Rout.save b/Rlib/textometrieR/tests/specificites.Rout.save deleted file mode 100644 index ab5a39b..0000000 --- a/Rlib/textometrieR/tests/specificites.Rout.save +++ /dev/null @@ -1,40 +0,0 @@ - -R version 2.9.1 (2009-06-26) -Copyright (C) 2009 The R Foundation for Statistical Computing -ISBN 3-900051-07-0 - -R est un logiciel libre livré sans AUCUNE GARANTIE. -Vous pouvez le redistribuer sous certaines conditions. -Tapez 'license()' ou 'licence()' pour plus de détails. - -R est un projet collaboratif avec de nombreux contributeurs. -Tapez 'contributors()' pour plus d'information et -'citation()' pour la façon de le citer dans les publications. - -Tapez 'demo()' pour des démonstrations, 'help()' pour l'aide -en ligne ou 'help.start()' pour obtenir l'aide au format HTML. -Tapez 'q()' pour quitter R. - -[Sauvegarde de la session précédente restaurée] - -> library(textometrieR); -> data(robespierre); -> specificites(robespierre); - D1 D2 D3 D4 D5 D6 D7 D8 -de 1.2477 2.6891 -0.5534 1.6471 -0.5096 0.3114 -0.6132 -0.8098 -peuple 0.6161 1.1466 -0.6709 -4.1743 2.1122 1.2906 -0.7980 1.3632 -republique 0.9753 0.4424 0.6038 0.9023 0.4706 -1.2797 -2.2003 1.9736 -ennemi 1.2133 1.6778 0.3146 0.3091 0.3364 -0.5024 -2.0550 0.4965 -patrie -4.2432 -0.4160 1.4491 -2.0903 0.6178 -0.3834 1.5961 0.8409 -others -1.2657 -3.6429 0.3542 -0.5984 -0.5387 0.3333 1.2439 -0.5569 - D9 D10 -de 0.3884 -2.2050 -peuple -0.3977 -0.8410 -republique -0.5366 -0.6335 -ennemi -0.3552 -0.4359 -patrie -0.3079 0.6414 -others 0.3377 2.4355 -> -> proc.time() -utilisateur système écoulé - 0.304 0.024 0.333 diff --git a/Rlib/textometrieR/tests/specificites.lexicon.new.R b/Rlib/textometrieR/tests/specificites.lexicon.new.R deleted file mode 100644 index 5cfd41e..0000000 --- a/Rlib/textometrieR/tests/specificites.lexicon.new.R +++ /dev/null @@ -1,8 +0,0 @@ -library(textometrieR); -sublexicon <- c(1, 2, 1, 3, 2, 1); -names(sublexicon) <- c("A", "D", "G", "J", "B", "C"); - -lexicon <- c(1, 2, 1, 3, 2, 1, 2, 2, 2, 2, 1, 3, 4); -names(lexicon) <- LETTERS[1:length(lexicon)]; - -specificites.lexicon.new(lexicon, sublexicon); diff --git a/Rlib/textometrieR/tests/specificites.probabilities.R b/Rlib/textometrieR/tests/specificites.probabilities.R deleted file mode 100644 index 924269d..0000000 --- a/Rlib/textometrieR/tests/specificites.probabilities.R +++ /dev/null @@ -1,4 +0,0 @@ -library(textometrieR); -# checking that the output of specificites.probabilities() remains the same... -data(robespierre); # loading the sample data set -specificites.probabilities(robespierre); diff --git a/Rlib/textometrieR/tests/specificites.probabilities.Rout.save b/Rlib/textometrieR/tests/specificites.probabilities.Rout.save deleted file mode 100644 index e1aa951..0000000 --- a/Rlib/textometrieR/tests/specificites.probabilities.Rout.save +++ /dev/null @@ -1,41 +0,0 @@ - -R version 2.9.1 (2009-06-26) -Copyright (C) 2009 The R Foundation for Statistical Computing -ISBN 3-900051-07-0 - -R est un logiciel libre livré sans AUCUNE GARANTIE. -Vous pouvez le redistribuer sous certaines conditions. -Tapez 'license()' ou 'licence()' pour plus de détails. - -R est un projet collaboratif avec de nombreux contributeurs. -Tapez 'contributors()' pour plus d'information et -'citation()' pour la façon de le citer dans les publications. - -Tapez 'demo()' pour des démonstrations, 'help()' pour l'aide -en ligne ou 'help.start()' pour obtenir l'aide au format HTML. -Tapez 'q()' pour quitter R. - -[Sauvegarde de la session précédente restaurée] - -> library(textometrieR); -> # checking that the output of specificites.probabilities remains the same... -> data(robespierre); # loading the sample data set -> specificites.probabilities(robespierre); - D1 D2 D3 D4 D5 -de 9.434651e-01 0.9979542117 0.2796099 9.774612e-01 0.3093355 -peuple 7.579362e-01 0.9286527817 0.2133715 6.693709e-05 0.9922765 -republique 8.941447e-01 0.6389224800 0.7509756 8.747769e-01 0.6616432 -ennemi 9.388100e-01 0.9790007110 0.5153405 5.092428e-01 0.5390590 -patrie 5.711981e-05 0.3837343979 0.9644425 8.122879e-03 0.7588987 -others 5.423605e-02 0.0002275630 0.5576156 2.521024e-01 0.2893006 - D6 D7 D8 D9 D10 -de 0.51176477 0.243664820 0.1549604 0.5911002 0.006236862 -peuple 0.94878218 0.159231855 0.9566718 0.4001917 0.144224817 -republique 0.05251719 0.006305835 0.9893744 0.2906916 0.232545209 -ennemi 0.31450047 0.008810362 0.6811968 0.4413409 0.366560964 -patrie 0.41364577 0.974655165 0.8557652 0.4921304 0.771637262 -others 0.53580477 0.942970424 0.2774148 0.5405062 0.996331474 -> -> proc.time() -utilisateur système écoulé - 0.392 0.024 0.499 diff --git a/Rscripts/CHD.R b/Rscripts/CHD.R index 68edd4e..a480df9 100644 --- a/Rscripts/CHD.R +++ b/Rscripts/CHD.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 2008-2011 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #License: GNU/GPL pp<-function(txt,val) { diff --git a/Rscripts/CHD.R.old b/Rscripts/CHD.R.old deleted file mode 100644 index f81e346..0000000 --- a/Rscripts/CHD.R.old +++ /dev/null @@ -1,245 +0,0 @@ -#library(ca) -#library(MASS) -#source('/home/pierre/workspace/iramuteq/Rscripts/afc.R') -#data<-read.table('output/corpus_bin.csv',header=TRUE,sep='\t') -source('/home/pierre/workspace/iramuteq/Rscripts/anacor.R') - -CHD<-function(data,x=9){ - dataori=data - dtable=data - listcol<-list() - listmere<-list() - a<-0 - print('vire colonnes vides en entree')#FIXME : il ne doit pas y avoir de colonnes vides en entree !! - for (m in 1:length(dtable)) { - if (sum(dtable[m-a])==0) { - print('colonne vide') - dtable<-dtable[,-(m-a)] - a<-a+1 - } - } - for (i in 1:x) { - clnb<-(i*2) - listmere[[clnb]]<-i - listmere[[clnb+1]]<-i - listcol[[clnb]]<-vector() - listcol[[clnb+1]]<-vector() - #extraction du premier facteur de l'afc - print('afc') - #afc<-ca(dtable,nd=1) - #afc<-corresp(dtable,nd=1) - #afc<-fca(dtable) - afc<-boostana(dtable,nd=1) - #coordonnees des colonnes sur le premier facteur - #coordrow=afc$rowcoord - #coordrow=as.matrix(afc$rscore) - #coordrow<-as.matrix(afc$rproj[,1]) - coordrow<-as.matrix(afc$row.scores) - #row.names(coordrow)<-afc$rownames - row.names(coordrow)<-rownames(dtable) - #classement en fonction de la position sur le premier facteur - #listclasse<-ifelse(coordrow<0,paste('CLASSE',clnb,sep=''),paste('CLASSE',clnb+1,sep='')) - - print('deb recherche meilleur partition') - coordrow<-as.matrix(coordrow[order(coordrow[,1]),]) - #print(rownames(coordrow)) - zeropoint<-which.min(abs(coordrow)) - print(zeropoint) - g<-length(coordrow[coordrow[,1]coordrow[zeropoint]]) - prct<-1 - g<-round(g*prct) - d<-round(d*prct) - print(g) - print(d) - temptable<-as.matrix(coordrow[(zeropoint-g):(zeropoint+d)]) - row.names(temptable)<-rownames(coordrow)[(zeropoint-g):(zeropoint+d)] - #print(temptable) - missing<-zeropoint-g - listchi<-vector() - chtable<-matrix(0,2,(ncol(dtable))) - totforme<-chtable[1,] - for (forme in 1:(ncol(dtable))) { - totforme[forme]<-sum(dtable[,forme]) - } - chtable[2,]<-totforme - for (l in 1:length(temptable)) { - # print(rownames(temptable)[l]) - linetoswitch=as.matrix(dtable[rownames(temptable)[l],]) - # print(linetoswitch) - chtable[1,]<-chtable[1,]+linetoswitch - chtable[2,]<-chtable[2,]-linetoswitch - valchi<-chisq.test(chtable)$statistic - if (is.na(valchi)){ - valchi<-0 - } - listchi<-append(listchi,valchi) - } - #listchi<-listchi[!is.na(listchi)] - maxchi<-which(listchi==max(listchi)) - print(max(listchi)) - print(maxchi) - maxchi<-maxchi+missing - #print(listchi) - #listclasse - print('liste classe') - print(coordrow[(maxchi)]) - listclasse<-ifelse(coordrow<=coordrow[(maxchi)],clnb,clnb+1) -# listclasse<-ifelse(coordrow<0,clnb,clnb+1) - listchi<-as.matrix(listchi) - listchi<-cbind(listchi,temptable) - filename<-paste('graphechi',as.character(i)) - filename<-paste(filename,'.jpeg') - jpeg(filename) - plot(listchi[,1]~listchi[,2]) - abline(v=0) - print(coordrow[zeropoint-g]) - abline(v=coordrow[zeropoint-g]) - abline(v=coordrow[zeropoint+d]) - abline(v=coordrow[(maxchi)]) - dev.off() - - #ajout du classement au tableau - dtable<-transform(dtable,cl1=listclasse) - - #calcul de la specificite des colonnes - t1<-dtable[dtable$cl1==clnb,] - t2<-dtable[dtable$cl1==clnb+1,] - - for (k in 1:(ncol(dtable)-1)) { - t<-matrix(0,2,2) - t[1,1]<-sum(t1[,k]) - t[1,2]<-sum(t2[,k]) - t[2,1]<-nrow(t1)-t[1,1] - t[2,2]<-nrow(t2)-t[1,2] - chi<-chisq.test(t) - if (chi$statistic>6){#FIXME : valeur a mettre en option base :2.7 - if (chi$expected[1,1]1) { - plusgrand<-plusgrand[1] - } - #???????????????????????????????????? - - #constuction du prochain tableau a analyser - print('construction tableau suivant') - classe<-classes[plusgrand] - dtable<-dataori[dataori[length(dataori)]==classe,] - dtable<-dtable[,1:(length(dtable)-i)] - - - listcolelim<-listcol[[as.integer(classe)]] - mother<-listmere[[as.integer(classe)]] - while (mother!=1) { - listcolelim<-append(listcolelim,listcol[[mother]]) - print(listcolelim) - mother<-listmere[[mother]] - } - - listcolelim<-sort(unique(listcolelim)) - print(listcolelim) - print('avant') - print(ncol(dtable)) - if (!is.logical(listcolelim)){ - print('elimination colonne') - a<-0 - for (col in listcolelim){ - dtable<-dtable[,-(col-a)] - a<-a+1 - } - } - print('apres') - print(ncol(dtable)) - #elimination des colonnes ne contenant que des 0 - print('vire colonne vide dans boucle') - a<-0 - for (m in 1:ncol(dtable)) { - if (sum(dtable[,m-a])==0) { - dtable<-dtable[,-(m-a)] - a<-a+1 - } - } - #elimination des lignes ne contenant que des 0 -# print('vire ligne vide dans boucle') -# a<-0 -# for (m in 1:nrow(dtable)) { -# if (sum(dtable[m-a,])==0) { -# print('ligne vide') -# dtable<-dtable[-(m-a),] -# a<-a+1 -# } -# } - } - dataori[(length(dataori)-x+1):length(dataori)] -} - -#dataout<-CHD(data,9) - -#library(cluster) -#dissmat<-daisy(dataout, metric = 'gower', stand = FALSE) -#chd<-diana(dissmat,diss=TRUE,) - - -#pour tester le type, passer chaque colonne en matice et faire mode(colonne) -#for (i in 1:13) {tmp<-as.matrix(data[i]);print(mode(tmp))} diff --git a/Rscripts/CHDKmeans.R b/Rscripts/CHDKmeans.R index c0a0d01..a104b23 100644 --- a/Rscripts/CHDKmeans.R +++ b/Rscripts/CHDKmeans.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 2008 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #Lisense: GNU/GPL diff --git a/Rscripts/CHDPOND.R b/Rscripts/CHDPOND.R index a1a3ea6..231c87c 100644 --- a/Rscripts/CHDPOND.R +++ b/Rscripts/CHDPOND.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 2008 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #Lisense: GNU/GPL #library(ca) diff --git a/Rscripts/afc_graph.R b/Rscripts/afc_graph.R index 67a4999..789c5bb 100644 --- a/Rscripts/afc_graph.R +++ b/Rscripts/afc_graph.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 20010-2013 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #License: GNU/GPL diff --git a/Rscripts/afc_lex.R b/Rscripts/afc_lex.R index a890db1..5c52e4a 100644 --- a/Rscripts/afc_lex.R +++ b/Rscripts/afc_lex.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 20011 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #License: GNU/GPL diff --git a/Rscripts/chd.R.notuse b/Rscripts/chd.R.notuse deleted file mode 100644 index 9d79ac6..0000000 --- a/Rscripts/chd.R.notuse +++ /dev/null @@ -1,87 +0,0 @@ -#chd.R -source('%s') -source('%s') -source('%s') -source('%s') -classif.mode <- %i -file.data1 <- '%s' -file.data2 <- '%s' -file.listuce1 <- '%s' -file.listuce2 <- '%s' -file.uce <- '%s' -mincl <- %i -graph.arbre1 <- '%s' -graph.arbre2 <- '%s' -graph.dendro1 <- '%s' -graph.dendro2 <- '%s' -data.out <- %s - -data1<-read.csv2(file.data1, header = FALSE) - -if (classif.mode == 0) { - data2<-read.csv2(file.data2, header = FALSE) -} -chd1<-CHD(data1) - -if (classif.mode == 0) { - chd2<-CHD(data2) -} else { - chd2<-chd1 -} - -#lecture des uce -listuce1<-read.csv2(file.listuce1) - -if (classif.mode == 0) { - listuce2<-read.csv2(file.listuce2) -} - -rm(data1) - -if (classif.mode == 0) rm(data2) - -chd.result <- Rchdtxt(file.uce,mincl=mincl,classif_mode=classif.mode) -n1 <- chd.result$n1 -classeuce1 <- chd.result$cuce1 -classeuce2 <- chd.result$cuce2 - -tree.tot1 <- make_tree_tot(chd1) -open_file_graph(graph.arbre1, widt = 600, height=400) -plot(tree.tot1$tree.cl) -dev.off() - -if (classif.mode == 0) { - tree.tot2 <- make_tree_tot(chd2) - open_file_graph(graph.arbre2, width = 600, height=400) - plot(tree.tot2$tree.cl) - dev.off() -} -tree.cut1 <- make_dendro_cut_tuple(tree.tot1$dendro_tuple, chd.result$coord_ok, classeuce1, 1) -classes<-n1[,9] -open_file_graph(graph.dendro1, width = 600, height=400) -plot.dendropr(tree.cut1$tree.cl,classes) -dev.off() - -if (classif.mode == 0) { - tree.cut2 <- make_dendro_cut_tuple(tree.tot2$dendro_tuple, chd.result$coord_ok, classeuce2, 2) - open_file_graph(graph.dendro2, width = 600, height=400) - plot(tree.cut2$tree.cl) - dev.off() -} -save.image(file=data.out) - - -(RscriptPath['CHD'], RscriptPath['chdtxt'], RscriptPath['anacor'], RscriptPath['Rgraph']) - - """ % DicoPath['TableUc1'] - - """ % DicoPath['TableUc2'] -""" % DicoPath['listeuce1'] - - """ % DicoPath['listeuce2'] -""" % (DicoPath['uce'], mincl, classif_mode) -"""%DicoPath['arbre1'] - """ %DicoPath['arbre2'] -""" % DicoPath['dendro1'] - """ % DicoPath['dendro2'] -% DicoPath['RData'] diff --git a/Rscripts/chdquest.R b/Rscripts/chdquest.R index 6a271aa..b4c4a49 100644 --- a/Rscripts/chdquest.R +++ b/Rscripts/chdquest.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 2008-2009 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #License: GNU/GPL fille<-function(classe,classeuce) { diff --git a/Rscripts/chdtxt.R b/Rscripts/chdtxt.R index 0a6350a..b3b6839 100644 --- a/Rscripts/chdtxt.R +++ b/Rscripts/chdtxt.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 2008-2009 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #License: GNU/GPL diff --git a/Rscripts/distance-labbe.R b/Rscripts/distance-labbe.R index eccb3ae..3d7c296 100644 --- a/Rscripts/distance-labbe.R +++ b/Rscripts/distance-labbe.R @@ -1,5 +1,5 @@ #Author: Pierre Ratinaud -#Copyright (c) 2015-2016 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud #License: GNU/GPL #Distance de Labbe diff --git a/analyse_merge.py b/analyse_merge.py index 549ac79..b30976a 100644 --- a/analyse_merge.py +++ b/analyse_merge.py @@ -1,14 +1,26 @@ # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2015 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL +#------------------------------------ +# import des modules python +#------------------------------------ import os +from time import sleep + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ from chemins import PathOut from functions import exec_rcode, check_Rresult from dialog import MergeDialog -import wx -from time import sleep from PrintRScript import MergeGraphes def merge_graphes(lgraphes): @@ -30,8 +42,7 @@ class AnalyseMerge : if self.doparametres(dlg=dlg) is not None : script = merge_graphes(self.parametres['graphs']) self.doR(script.scriptout, dlg=False) - print 'fini' - + print('fini') def doparametres(self, dlg=None): if dlg is not None : @@ -40,6 +51,7 @@ class AnalyseMerge : if res == wx.ID_OK : self.parametres['graphs'] = [graph.GetPath() for graph in dial.graphs if graph.GetPath() != ''] return True + # pas besoin d'un dial.Destroy() ??? return True def doR(self, Rscript, wait = False, dlg = None, message = '') : diff --git a/analysematrix.py b/analysematrix.py index 5daf6ae..cae6ff8 100644 --- a/analysematrix.py +++ b/analysematrix.py @@ -1,17 +1,26 @@ -#!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2013 Pierre Ratinaud -#License: GNU GPL - - +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 +#License: GNU/GPL +#------------------------------------ +# import des modules python +#------------------------------------ import logging import os from uuid import uuid4 +from time import time, sleep + +#------------------------------------ +# import des modules wx +#------------------------------------ + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ from chemins import PathOut from functions import exec_rcode, check_Rresult, DoConf, progressbar -from time import time, sleep from openanalyse import OpenAnalyse @@ -72,10 +81,10 @@ class AnalyseMatrix : def doanalyse(self) : pass - + def doparametres(self, dlg = None): pass - + def doR(self, Rscript, wait = False, dlg = None, message = '') : #log.info('R code...') pid = exec_rcode(self.ira.RPath, Rscript, wait = wait) @@ -85,5 +94,4 @@ class AnalyseMatrix : sleep(0.2) else : sleep(0.2) - return check_Rresult(self.ira, pid) - + return check_Rresult(self.ira, pid) \ No newline at end of file diff --git a/analysetxt.py b/analysetxt.py index f9b3973..f11a596 100755 --- a/analysetxt.py +++ b/analysetxt.py @@ -1,42 +1,52 @@ # -*- coding: utf-8 -*- -# Author: Pierre Ratinaud -# lisence : GNU GPL -# copyright : 2012-2013 (c) Pierre Ratinaud +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 +#License: GNU/GPL +#------------------------------------ +# import des modules python +#------------------------------------ import logging -from chemins import PathOut -from functions import exec_rcode, check_Rresult, DoConf, ReadDicoAsDico, progressbar from shutil import copy from time import time, sleep from uuid import uuid4 import os + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +from chemins import PathOut +from functions import exec_rcode, check_Rresult, DoConf, ReadDicoAsDico, progressbar from openanalyse import OpenAnalyse from dialog import StatDialog + + log = logging.getLogger('iramuteq.analyse') + + class AnalyseText : - def __init__(self, ira, corpus, parametres=None, dlg=False, lemdial=True) : + + def __init__(self, ira, corpus, parametres=None, dlg=False, lemdial=True): self.corpus = corpus self.ira = ira self.parent = ira self.dlg = dlg self.dialok = True self.parametres = parametres - #print(parametres) self.lemdial = lemdial self.val = False self.keys = DoConf(self.ira.ConfigPath['key']).getoptions() - if not 'pathout' in self.parametres : + if not 'pathout' in self.parametres: self.pathout = PathOut(corpus.parametres['originalpath'], analyse_type=parametres['type'], dirout=corpus.parametres['pathout']) - else : + else: self.pathout = PathOut(filename=corpus.parametres['originalpath'], dirout=self.parametres['pathout'], analyse_type=self.parametres['type']) self.parametres = self.lemparam() - if self.parametres is not None : + if self.parametres is not None: self.parametres = self.make_config(parametres) - #print 'paramtre aprs make_config', self.parametres - log.info(self.pathout.dirout) - if self.parametres is not None : + if self.parametres is not None: self.keys = DoConf(self.ira.ConfigPath['key']).getoptions() gramact = [k for k in self.keys if self.keys[k] == 1] gramsup = [k for k in self.keys if self.keys[k] == 2] @@ -47,13 +57,12 @@ class AnalyseText : self.parametres['uuid'] = str(uuid4()) self.parametres['name'] = os.path.split(self.parametres['pathout'])[1] self.parametres['type'] = parametres['type'] - self.parametres['encoding'] = self.ira.syscoding + #self.parametres['encoding'] = self.ira.syscoding self.t1 = time() - if not self.parametres.get('dictionary', False) : - print self.parametres + if not self.parametres.get('dictionary', False): self.corpus.make_lems(lem=self.parametres['lem']) - else : - print 'read new dico' + else: + print('read new dico') dico = ReadDicoAsDico(self.parametres['dictionary']) self.corpus.make_lems_from_dict(dico, dolem=self.parametres['lem']) dictname = os.path.basename(self.parametres['dictionary']) @@ -61,10 +70,10 @@ class AnalyseText : copy(self.parametres['dictionary'], dictpath) self.parametres['dictionary'] = dictpath self.corpus.parse_active(gramact, gramsup) - if dlg : - self.dlg = progressbar(self.ira, dlg) +# if dlg: +# self.dlg = progressbar(self.ira, dlg) result_analyse = self.doanalyse() - if result_analyse is None : + if result_analyse is None: self.time = time() - self.t1 minutes, seconds = divmod(self.time, 60) hours, minutes = divmod(minutes, 60) @@ -73,12 +82,13 @@ class AnalyseText : DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira']) self.ira.history.add(self.parametres) if dlg : - if not isinstance(dlg, int) : - dlg.Destroy() - self.dlg.Destroy() +# if not isinstance(dlg, int) : +# dlg.Destroy() + self.dlg = progressbar(self.ira, dlg) OpenAnalyse(self.parent, self.parametres['ira']) self.ira.tree.AddAnalyse(self.parametres) self.val = 5100 + self.dlg.Destroy() else : self.val = False if dlg : @@ -135,12 +145,19 @@ class AnalyseText : pass def doR(self, Rscript, wait=False, dlg=None, message='') : - log.info('R code...') + log.info('R code... ') + # idéalement, la fonction prendrait en charge la création/destruction de sa propre fenêtre de progression + if isinstance(dlg, int): + dialProgression = progressbar(self, dlg) + else: + dialProgression = dlg pid = exec_rcode(self.ira.RPath, Rscript, wait=wait) while pid.poll() is None : if dlg : - self.dlg.Pulse(message) + dialProgression.Pulse(message) sleep(0.2) else : sleep(0.2) + if isinstance(dlg, int): + dialProgression.Destroy() return check_Rresult(self.ira, pid) diff --git a/app.fil b/app.fil deleted file mode 100644 index 6bc2801..0000000 --- a/app.fil +++ /dev/null @@ -1,67 +0,0 @@ -analysematrix.py -analysetxt.py -bestsvg.py -build_dictionnaries.py -cable.py -checkinstall.py -checkversion.py -chemins.py -colors.py -configparser_helpers.py -configparser.py -corpus.py -dialog.py -extract.py -functions.py -guifunct.py -guiparam3d.py -HTML.py -iracmd.py -iramuteq.py -iraopen.py -KeyFrame.py -layout.py -Liste.py -listlex.py -mki18n.py -newsimi.py -ooolib.py -openanalyse.py -OptionAlceste.py -parse_factiva_html.py -parse_factiva_mail.py -parse_factiva_txt.py -parse_factiva_xml.py -PrintRScript.py -profile_segment.py -ProfList.py -putcorpusindb.py -search_list.py -search_tools.py -setup.py -setup.py.win -sheet.py -tabafcm.py -tabchdalc.py -tabchddist.py -tabchi2.py -tabfrequence.py -tableau.py -tabrsimple.py -tabsimi.py -tabstudent.py -tabverges.py -textafcuci.py -textaslexico.py -textchdalc.py -textcheckcorpus.py -textclassechd.py -textdist.py -textsimi.py -textstat.py -textwordcloud.py -tools.py -tree.py -ttparser.py -usecorpusNG.py -word_stat.py diff --git a/aui/__init__.py b/aui/__init__.py deleted file mode 100644 index ba3b51d..0000000 --- a/aui/__init__.py +++ /dev/null @@ -1,290 +0,0 @@ -""" -AUI is an Advanced User Interface library that aims to implement "cutting-edge" -interface usability and design features so developers can quickly and easily create -beautiful and usable application interfaces. - - -Vision and Design Principles -============================ - -AUI attempts to encapsulate the following aspects of the user interface: - -* **Frame Management**: Frame management provides the means to open, move and hide common - controls that are needed to interact with the document, and allow these configurations - to be saved into different perspectives and loaded at a later time. - -* **Toolbars**: Toolbars are a specialized subset of the frame management system and should - behave similarly to other docked components. However, they also require additional - functionality, such as "spring-loaded" rebar support, "chevron" buttons and end-user - customizability. - -* **Modeless Controls**: Modeless controls expose a tool palette or set of options that - float above the application content while allowing it to be accessed. Usually accessed - by the toolbar, these controls disappear when an option is selected, but may also be - "torn off" the toolbar into a floating frame of their own. - -* **Look and Feel**: Look and feel encompasses the way controls are drawn, both when shown - statically as well as when they are being moved. This aspect of user interface design - incorporates "special effects" such as transparent window dragging as well as frame animation. - -AUI adheres to the following principles: - -- Use native floating frames to obtain a native look and feel for all platforms; -- Use existing wxPython code where possible, such as sizer implementation for frame management; -- Use standard wxPython coding conventions. - - -Usage -===== - -The following example shows a simple implementation that uses L{AuiManager} to manage -three text controls in a frame window:: - - class MyFrame(wx.Frame): - - def __init__(self, parent, id=-1, title="AUI Test", pos=wx.DefaultPosition, - size=(800, 600), style=wx.DEFAULT_FRAME_STYLE): - - wx.Frame.__init__(self, parent, id, title, pos, size, style) - - self._mgr = aui.AuiManager() - - # notify AUI which frame to use - self._mgr.SetManagedWindow(self) - - # create several text controls - text1 = wx.TextCtrl(self, -1, "Pane 1 - sample text", - wx.DefaultPosition, wx.Size(200,150), - wx.NO_BORDER | wx.TE_MULTILINE) - - text2 = wx.TextCtrl(self, -1, "Pane 2 - sample text", - wx.DefaultPosition, wx.Size(200,150), - wx.NO_BORDER | wx.TE_MULTILINE) - - text3 = wx.TextCtrl(self, -1, "Main content window", - wx.DefaultPosition, wx.Size(200,150), - wx.NO_BORDER | wx.TE_MULTILINE) - - # add the panes to the manager - self._mgr.AddPane(text1, AuiPaneInfo().Left().Caption("Pane Number One")) - self._mgr.AddPane(text2, AuiPaneInfo().Bottom().Caption("Pane Number Two")) - self._mgr.AddPane(text3, AuiPaneInfo().CenterPane()) - - # tell the manager to "commit" all the changes just made - self._mgr.Update() - - self.Bind(wx.EVT_CLOSE, self.OnClose) - - - def OnClose(self, event): - - # deinitialize the frame manager - self._mgr.UnInit() - - self.Destroy() - event.Skip() - - - # our normal wxApp-derived class, as usual - - app = wx.PySimpleApp() - - frame = MyFrame(None) - app.SetTopWindow(frame) - frame.Show() - - app.MainLoop() - - -What's New -========== - -Current wxAUI Version Tracked: wxWidgets 2.9.0 (SVN HEAD) - -The wxPython AUI version fixes the following bugs or implement the following -missing features (the list is not exhaustive): - -- Visual Studio 2005 style docking: http://www.kirix.com/forums/viewtopic.php?f=16&t=596 -- Dock and Pane Resizing: http://www.kirix.com/forums/viewtopic.php?f=16&t=582 -- Patch concerning dock resizing: http://www.kirix.com/forums/viewtopic.php?f=16&t=610 -- Patch to effect wxAuiToolBar orientation switch: http://www.kirix.com/forums/viewtopic.php?f=16&t=641 -- AUI: Core dump when loading a perspective in wxGTK (MSW OK): http://www.kirix.com/forums/viewtopic.php?f=15&t=627 -- wxAuiNotebook reordered AdvanceSelection(): http://www.kirix.com/forums/viewtopic.php?f=16&t=617 -- Vertical Toolbar Docking Issue: http://www.kirix.com/forums/viewtopic.php?f=16&t=181 -- Patch to show the resize hint on mouse-down in aui: http://trac.wxwidgets.org/ticket/9612 -- The Left/Right and Top/Bottom Docks over draw each other: http://trac.wxwidgets.org/ticket/3516 -- MinSize() not honoured: http://trac.wxwidgets.org/ticket/3562 -- Layout problem with wxAUI: http://trac.wxwidgets.org/ticket/3597 -- Resizing children ignores current window size: http://trac.wxwidgets.org/ticket/3908 -- Resizing panes under Vista does not repaint background: http://trac.wxwidgets.org/ticket/4325 -- Resize sash resizes in response to click: http://trac.wxwidgets.org/ticket/4547 -- "Illegal" resizing of the AuiPane? (wxPython): http://trac.wxwidgets.org/ticket/4599 -- Floating wxAUIPane Resize Event doesn't update its position: http://trac.wxwidgets.org/ticket/9773 -- Don't hide floating panels when we maximize some other panel: http://trac.wxwidgets.org/ticket/4066 -- wxAUINotebook incorrect ALLOW_ACTIVE_PANE handling: http://trac.wxwidgets.org/ticket/4361 -- Page changing veto doesn't work, (patch supplied): http://trac.wxwidgets.org/ticket/4518 -- Show and DoShow are mixed around in wxAuiMDIChildFrame: http://trac.wxwidgets.org/ticket/4567 -- wxAuiManager & wxToolBar - ToolBar Of Size Zero: http://trac.wxwidgets.org/ticket/9724 -- wxAuiNotebook doesn't behave properly like a container as far as...: http://trac.wxwidgets.org/ticket/9911 -- Serious layout bugs in wxAUI: http://trac.wxwidgets.org/ticket/10620 -- wAuiDefaultTabArt::Clone() should just use copy contructor: http://trac.wxwidgets.org/ticket/11388 -- Drop down button for check tool on wxAuiToolbar: http://trac.wxwidgets.org/ticket/11139 - -Plus the following features: - -- AuiManager: - - (a) Implementation of a simple minimize pane system: Clicking on this minimize button causes a new - AuiToolBar to be created and added to the frame manager, (currently the implementation is such - that panes at West will have a toolbar at the right, panes at South will have toolbars at the - bottom etc...) and the pane is hidden in the manager. - Clicking on the restore button on the newly created toolbar will result in the toolbar being - removed and the original pane being restored; - (b) Panes can be docked on top of each other to form `AuiNotebooks`; `AuiNotebooks` tabs can be torn - off to create floating panes; - (c) On Windows XP, use the nice sash drawing provided by XP while dragging the sash; - (d) Possibility to set an icon on docked panes; - (e) Possibility to draw a sash visual grip, for enhanced visualization of sashes; - (f) Implementation of a native docking art (`ModernDockArt`). Windows XP only, **requires** Mark Hammond's - pywin32 package (winxptheme); - (g) Possibility to set a transparency for floating panes (a la Paint .NET); - (h) Snapping the main frame to the screen in any positin specified by horizontal and vertical - alignments; - (i) Snapping floating panes on left/right/top/bottom or any combination of directions, a la Winamp; - (j) "Fly-out" floating panes, i.e. panes which show themselves only when the mouse hover them; - (k) Ability to set custom bitmaps for pane buttons (close, maximize, etc...); - (l) Implementation of the style ``AUI_MGR_ANIMATE_FRAMES``, which fade-out floating panes when - they are closed (all platforms which support frames transparency) and show a moving rectangle - when they are docked and minimized (Windows < Vista and GTK only); - (m) A pane switcher dialog is available to cycle through existing AUI panes; - (n) Some flags which allow to choose the orientation and the position of the minimized panes; - (o) The functions [Get]MinimizeMode() in `AuiPaneInfo` which allow to set/get the flags described above; - (p) Events like ``EVT_AUI_PANE_DOCKING``, ``EVT_AUI_PANE_DOCKED``, ``EVT_AUI_PANE_FLOATING`` and ``EVT_AUI_PANE_FLOATED`` are - available for all panes *except* toolbar panes; - (q) Implementation of the RequestUserAttention method for panes; - (r) Ability to show the caption bar of docked panes on the left instead of on the top (with caption - text rotated by 90 degrees then). This is similar to what `wxDockIt` did. To enable this feature on any - given pane, simply call `CaptionVisible(True, left=True)`; - (s) New Aero-style docking guides: you can enable them by using the `AuiManager` style ``AUI_MGR_AERO_DOCKING_GUIDES``; - (t) A slide-in/slide-out preview of minimized panes can be seen by enabling the `AuiManager` style - ``AUI_MGR_PREVIEW_MINIMIZED_PANES`` and by hovering with the mouse on the minimized pane toolbar tool; - (u) New Whidbey-style docking guides: you can enable them by using the `AuiManager` style ``AUI_MGR_WHIDBEY_DOCKING_GUIDES``; - (v) Native of custom-drawn mini frames can be used as floating panes, depending on the ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style; - (w) A "smooth docking effect" can be obtained by using the ``AUI_MGR_SMOOTH_DOCKING`` style (similar to PyQT docking style). - -| - -- AuiNotebook: - - (a) Implementation of the style ``AUI_NB_HIDE_ON_SINGLE_TAB``, a la `wx.lib.agw.flatnotebook`; - (b) Implementation of the style ``AUI_NB_SMART_TABS``, a la `wx.lib.agw.flatnotebook`; - (c) Implementation of the style ``AUI_NB_USE_IMAGES_DROPDOWN``, which allows to show tab images - on the tab dropdown menu instead of bare check menu items (a la `wx.lib.agw.flatnotebook`); - (d) 6 different tab arts are available, namely: - - (1) Default "glossy" theme (as in `wx.aui.AuiNotebook`) - (2) Simple theme (as in `wx.aui.AuiNotebook`) - (3) Firefox 2 theme - (4) Visual Studio 2003 theme (VC71) - (5) Visual Studio 2005 theme (VC81) - (6) Google Chrome theme - - (e) Enabling/disabling tabs; - (f) Setting the colour of the tab's text; - (g) Implementation of the style ``AUI_NB_CLOSE_ON_TAB_LEFT``, which draws the tab close button on - the left instead of on the right (a la Camino browser); - (h) Ability to save and load perspectives in `AuiNotebook` (experimental); - (i) Possibility to add custom buttons in the `AuiNotebook` tab area; - (j) Implementation of the style ``AUI_NB_TAB_FLOAT``, which allows the floating of single tabs. - Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far - enough outside of the notebook to become floating pages; - (k) Implementation of the style ``AUI_NB_DRAW_DND_TAB`` (on by default), which draws an image - representation of a tab while dragging; - (l) Implementation of the `AuiNotebook` unsplit functionality, which unsplit a splitted AuiNotebook - when double-clicking on a sash; - (m) Possibility to hide all the tabs by calling `HideAllTAbs`; - (n) wxPython controls can now be added inside page tabs by calling `AddControlToPage`, and they can be - removed by calling `RemoveControlFromPage`; - (o) Possibility to preview all the pages in a `AuiNotebook` (as thumbnails) by using the `NotebookPreview` - method of `AuiNotebook`; - (p) Tab labels can be edited by calling the `SetRenamable` method on a `AuiNotebook` page; - (q) Support for multi-lines tab labels in `AuiNotebook`; - (r) Support for setting minimum and maximum tab widths for fixed width tabs; - (s) Implementation of the style ``AUI_NB_ORDER_BY_ACCESS``, which orders the tabs by last access time - inside the Tab Navigator dialog; - (t) Implementation of the style ``AUI_NB_NO_TAB_FOCUS``, allowing the developer not to draw the tab - focus rectangle on tne `AuiNotebook` tabs. - -| - -- AuiToolBar: - - (a) ``AUI_TB_PLAIN_BACKGROUND`` style that allows to easy setup a plain background to the AUI toolbar, - without the need to override drawing methods. This style contrasts with the default behaviour - of the `wx.aui.AuiToolBar` that draws a background gradient and this break the window design when - putting it within a control that has margin between the borders and the toolbar (example: put - `wx.aui.AuiToolBar` within a `wx.StaticBoxSizer` that has a plain background); - (b) `AuiToolBar` allow item alignment: http://trac.wxwidgets.org/ticket/10174; - (c) `AUIToolBar` `DrawButton()` improvement: http://trac.wxwidgets.org/ticket/10303; - (d) `AuiToolBar` automatically assign new id for tools: http://trac.wxwidgets.org/ticket/10173; - (e) `AuiToolBar` Allow right-click on any kind of button: http://trac.wxwidgets.org/ticket/10079; - (f) `AuiToolBar` idle update only when visible: http://trac.wxwidgets.org/ticket/10075; - (g) Ability of creating `AuiToolBar` tools with [counter]clockwise rotation. This allows to propose a - variant of the minimizing functionality with a rotated button which keeps the caption of the pane - as label; - (h) Allow setting the alignment of all tools in a toolbar that is expanded. - - -TODOs -===== - -- Documentation, documentation and documentation; -- Fix `tabmdi.AuiMDIParentFrame` and friends, they do not work correctly at present; -- Allow specification of `CaptionLeft()` to `AuiPaneInfo` to show the caption bar of docked panes - on the left instead of on the top (with caption text rotated by 90 degrees then). This is - similar to what `wxDockIt` did - DONE; -- Make developer-created `AuiNotebooks` and automatic (framemanager-created) `AuiNotebooks` behave - the same way (undocking of tabs) - DONE, to some extent; -- Find a way to dock panes in already floating panes (`AuiFloatingFrames`), as they already have - their own `AuiManager`; -- Add more gripper styles (see, i.e., PlusDock 4.0); -- Add an "AutoHide" feature to docked panes, similar to fly-out floating panes (see, i.e., PlusDock 4.0); -- Add events for panes when they are about to float or to be docked (something like - ``EVT_AUI_PANE_FLOATING/ED`` and ``EVT_AUI_PANE_DOCKING/ED``) - DONE, to some extent; -- Implement the 4-ways splitter behaviour for horizontal and vertical sashes if they intersect; -- Extend `tabart.py` with more aui tab arts; -- Implement ``AUI_NB_LEFT`` and ``AUI_NB_RIGHT`` tab locations in `AuiNotebook`; -- Move `AuiDefaultToolBarArt` into a separate module (as with `tabart.py` and `dockart.py`) and - provide more arts for toolbars (maybe from `wx.lib.agw.flatmenu`?) -- Support multiple-rows/multiple columns toolbars; -- Integrate as much as possible with `wx.lib.agw.flatmenu`, from dropdown menus in `AuiNotebook` to - toolbars and menu positioning; -- Possibly handle minimization of panes in a different way (or provide an option to switch to - another way of minimizing panes); -- Clean up/speed up the code, especially time-consuming for-loops; -- Possibly integrate `wxPyRibbon` (still on development), at least on Windows. - - -License And Version -=================== - -AUI library is distributed under the wxPython license. - -Latest revision: Andrea Gavana @ 21 Jun 2011, 22.00 GMT - -Version 1.3. - -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -from aui_constants import * -from aui_utilities import * -from auibar import * -from auibook import * -from tabart import * -from dockart import * -from framemanager import * -from tabmdi import * diff --git a/aui/aui_constants.py b/aui/aui_constants.py deleted file mode 100644 index 38f183d..0000000 --- a/aui/aui_constants.py +++ /dev/null @@ -1,2588 +0,0 @@ -""" -This module contains all the constants used by wxPython-AUI. - -Especially important and meaningful are constants for AuiManager, AuiDockArt and -AuiNotebook. -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx -from wx.lib.embeddedimage import PyEmbeddedImage - -# ------------------------- # -# - AuiNotebook Constants - # -# ------------------------- # - -# For tabart -# -------------- - -vertical_border_padding = 4 -""" Border padding used in drawing tabs. """ - -if wx.Platform == "__WXMAC__": - nb_close_bits = "\xFF\xFF\xFF\xFF\x0F\xFE\x03\xF8\x01\xF0\x19\xF3" \ - "\xB8\xE3\xF0\xE1\xE0\xE0\xF0\xE1\xB8\xE3\x19\xF3" \ - "\x01\xF0\x03\xF8\x0F\xFE\xFF\xFF" - """ AuiNotebook close button image on wxMAC. """ - -elif wx.Platform == "__WXGTK__": - nb_close_bits = "\xff\xff\xff\xff\x07\xf0\xfb\xef\xdb\xed\x8b\xe8" \ - "\x1b\xec\x3b\xee\x1b\xec\x8b\xe8\xdb\xed\xfb\xef" \ - "\x07\xf0\xff\xff\xff\xff\xff\xff" - """ AuiNotebook close button image on wxGTK. """ - -else: - nb_close_bits = "\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xf3\xcf\xf9" \ - "\x9f\xfc\x3f\xfe\x3f\xfe\x9f\xfc\xcf\xf9\xe7\xf3" \ - "\xff\xff\xff\xff\xff\xff\xff\xff" - """ AuiNotebook close button image on wxMSW. """ - -nb_left_bits = "\xff\xff\xff\xff\xff\xff\xff\xfe\x7f\xfe\x3f\xfe\x1f" \ - "\xfe\x0f\xfe\x1f\xfe\x3f\xfe\x7f\xfe\xff\xfe\xff\xff" \ - "\xff\xff\xff\xff\xff\xff" -""" AuiNotebook left button image. """ - -nb_right_bits = "\xff\xff\xff\xff\xff\xff\xdf\xff\x9f\xff\x1f\xff\x1f" \ - "\xfe\x1f\xfc\x1f\xfe\x1f\xff\x9f\xff\xdf\xff\xff\xff" \ - "\xff\xff\xff\xff\xff\xff" -""" AuiNotebook right button image. """ - -nb_list_bits = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f" \ - "\xf8\xff\xff\x0f\xf8\x1f\xfc\x3f\xfe\x7f\xff\xff\xff" \ - "\xff\xff\xff\xff\xff\xff" -""" AuiNotebook windows list button image. """ - - -#---------------------------------------------------------------------- -tab_active_center = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAbCAYAAAC9WOV0AAAABHNCSVQICAgIfAhkiAAAADNJ" - "REFUCJltzMEJwDAUw9DHX6OLdP/Bop4KDc3F2EIYrsFtrZow8GnH6OD1zvRTajvY2QMHIhNx" - "jUhuAgAAAABJRU5ErkJggg==") -""" Center active tab image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_active_left = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAglJ" - "REFUOI2Nkk9rE0EYh5/J7mpW06xE2iSmeFHxEoqIAc/FQ5CKgn4DP4KlIQG/QVsQbBEKgop+" - "Anvy4rV4bLT2JCGJPVXqwaZJd+f1kN26WTfJDrzszDLPPL/5o0jeFGAC54A0YKmEYAo4DzjA" - "LHAZmElqtIGrhmEsvtzcfPNtb6/V6524SWALKBiGsfhxe/uzFhGth5XEmgVubWxsvA1Az68k" - "1nngYbPZ7ASg69c06wxwe3V9/b3reVqHwGmwCZRs2370fX//wIuA0+CLwEKj0XilZTSu602G" - "FcP7vLe7+7XlRaCgPw62gGv5fP6p63raiwFdLWKOgdNArl6vV1UqpQgcYdcYbwooAPfb7c7h" - "mTWmUjGwCWTL5fL1K6VSLiqQyMTYyLVa/UEwe9IC0chFYKnb/XnkeiIDV+Q0UsG/qNkCnEql" - "crNQLDpaxpskJnYayD1bXl4S/xrDoPLHKjQOmsHwlCuHv44+ZJ2sLTrGGqzg7zEc+VK1Wl1w" - "HMcG0DFxw6sFsRVwAZhdWak9FoRJ+w2HCKzzwN3jXv+daVmGDkdWoMKb9fumHz0DFFfX1p5Y" - "lmXo6N0G48jzVEDOt97pdA9ezOXzGU+PzBmN6VuDqyoDN3Z2vjyfKxQynhYkJuJ/L02Ara3X" - "n3602r8HrpaTUy3HAy1/+hNq8O+r+q4WETirmFMNBwm3v+gdmytKNIUpAAAAAElFTkSuQmCC") -""" Left active tab image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_active_right = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAkpJ" - "REFUOI2NlM1rU0EUxX9zZ5KaWq3GKKnGutC0FEWCWAWLRUOxBetK/wdp6Re6F6TFXXGhuFdw" - "b7dCQUUpiFt1XbB2q7Uf1iTvunjzkpe0afNgmLnDnHvOPe/OWCALtAFC+Cktfha4CRwBDnhg" - "BQhaSrK19bf89dv35WfPX7y01haBbiAFmH3BlUA1Gm8WFt75BFkg0TK4VAl0Y3NL5+efvgIK" - "wOH92EVjxRljGBi4VgTOeLDbk7kcqEZju1TWX7/Xgtm5J6+BS8ChvdilLhAhkUya4eFbxVQq" - "1e3ZbUtgg8GKJd/Tk70/NjYCHCPsgX1kV8K5VA70z8amfvy0tAwMAcebSRfijikY8ez5/OlM" - "JrOncbIjp4K1lmRb0sw8eDgCpAm7rwlz46YIzjpGb48WveyDNPhDfCOuHmNwzpHL5dK9fX3n" - "mkmvaxJiayOCWMvM1PSdZtJrhiloLJMYIeESDFwf7Acyu0mXGLYmX0PpYi3ZbFdnoVDoBTpp" - "uCxCjFob1tYKzlnGJyZHd5Mu6uVGkqvMCmCwzjE4eOMqcALoINauUic37hjhLXPWcTSdThWL" - "QxcJX5yqdGk4H/cP9a4755iYnLpL+M/b8e0qjafrekb9TUskuNx/5TzQ5Y1zO9yOZEd1R7OI" - "JdXebh/Pzt3zCToAMZv/AjU1orDWWKAGVJVSqcTqysp6X+/ZaeAL8KNac9wsVQ8yNeOsdZw8" - "let4/2HpEdAPXDAb20HLj7xqeHT158ra4uLbz2bdg03krmetxrH9KDAmHP8Bn0j1t/01UV0A" - "AAAASUVORK5CYII=") -""" Right active tab image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_close = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAI9J" - "REFUKJG90MEKAWEUxfEfM4rxAFIommzZzNb7v4BsLJTsiGQlYjHfME3flrO75/xvnXv5p/qY" - "R/wcWTUktWCKFbrYB6/AAhecmwunAI/RwQAjbLGpoFakwjLATxzqMLQjC68A3/FohkljLkKN" - "Ha4YKg8+VkBag3Pll9a1GikmuPk+4qMMs0jFMXoR/0d6A9JRFV/jxY+iAAAAAElFTkSuQmCC") -""" Normal close button image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_close_h = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAOlJ" - "REFUKJGVkiFuw0AQRd849hUS7iPUwGEllhyjYJ+gaK9Q4CsY9QTFIY4shQQucI8Q7l6h3Z0S" - "r7UgjdrPZvVm52k0wpJLWe4y51qgVpECQFQnYPzabN4ra2cAAbgWxZMmyavAkTtROIn33fM0" - "fcilLHep92+/wXHTd5K8JJlzbYD3w8C2aVZo2zTsh4FF5Zg516ZAHYBb35MbszbkxnDr+3hQ" - "napIIUv1eT6vYPggvAGoSJE88r6XVFQnRA7BOdYIk8IUUZ1SYAQOsXOskRsT1+P/11pZO4v3" - "ncLpESzed5W1c1jQn0/jBzPfck1qdmfjAAAAAElFTkSuQmCC") -""" Hover close button image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_close_p = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAASxJ" - "REFUKJF9kbFLQlEYxX/nvbs55OAkiJAE7k7Nibo9xf+hrTlyr3Boipb+BCGq0bApJEQcG0Ms" - "aQ0Lmq5+Dc+nDtbZ7uHce37fd8VSlWwh50PfRKqClWJXI8y6bu5uHj5e3wEEcJDP75txLBSx" - "RYbdS7QfJ5PnsJIt5BbB4hQjkrQtjxlFILOXyvQDH/qmUCSJznDAYetkFTxsndAZDggkhCIf" - "+qaLmWP1bu8oN+qrC+VGnd7t3bpKqrp4wBjl+ux8FUweSLwlXCnYCv2PHGgE1BLmTYykad2i" - "kcOsi1TbZN7EKDfq67NZV5VsIeedvzQjCv5YK8R/4bw7Cl+/P7920+kJkBEq/hWWaPem45cQ" - "YDybTfdSmf5CizckwHaAH9ATZldu7i560/ELwC+6RXdU6KzezAAAAABJRU5ErkJggg==") -""" Pressed close button image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_inactive_center = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAbCAYAAAC9WOV0AAAABHNCSVQICAgIfAhkiAAAAElJ" - "REFUCJlVyiEOgDAUBNHp3qmX5iYkyMpqBAaFILRdDGn4qybZB98yy3ZZrRu1PpABAQiDSLN+" - "h4NLEU8CBAfoPHZUywr3M/wCTz8c3/qQrUcAAAAASUVORK5CYII=") -""" Center inactive tab image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_inactive_left = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAf5J" - "REFUOI2llE1rE1EUhp8bZwyhaZomk5DaD40hSWPQVkTd6KIIEUWlLqTEhTaLulBQ6sfKjeBC" - "ECULXQku/Alx7d6/U1EQae45LjJpJ5NOnOKBgYG5z33Px3sG/iPMIc87QAmYBZKHgdOu69a2" - "3/W2yrVGK5vPLTlxFV3Xrb3+8v1Ntd5oiSpWBmnEidKT972tar3R6ovSt4qoxoIdoFipNlpW" - "B6AVRYFEHNWn3a8dz/PK1rIHEgN2UpnMseVTK7fUGBME48CFe88+3sh5+SXr1xmMSbABvJXz" - "l9siYAVGWJ0Mu/OVZr5Q8CpWfFWzD2Imj2qu/fhtG4wRVUIZg0bDBsgtn15dt6qIKKBDQZ81" - "kWmnzly6OZ+ZzhSt7jfK6CBjFMwEk5TWOy82AVQGhzVUb5RJEkC2fLK6JgIiPhioeZJJUhev" - "3j2RTqdzooqge2ojCxwxqrnrG4/uq4Ida3HgAjMOJ4CZSq1+RVBUzCgQinDDstfa282jyeTU" - "rhUGF4CJgMPKhbXbmw9VFfG7fBA4LCao7AAzi8cXz1kF0dENMqH38KgWnnd7nSMJxxE5wI4+" - "MHyCaeeAYvPshQ0RJby3wVSDHxxgAVh99elb9/evndmfP3boW2FsqGNhMMCdBy8/fJ5KZ6at" - "qL+3Q1dEzFkNGMX82ZWh18e0/vVT/wuFmdYVv/ruKgAAAABJRU5ErkJggg==") -""" Left inactive tab image for the Chrome tab art. """ - -#---------------------------------------------------------------------- -tab_inactive_right = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAhBJ" - "REFUOI2llM9rE1EQxz8zb1dSTKNuYtW01kQDRoKFWi9FEEq1IooUUWoPokWCtVqkR69KsSBU" - "8OJRPOhBxZNe/At6FBER/HFUPEq1IGn3ecgm2ZjdJODCHPY9vvP9fufNDPzHZ4DDQBrYBKwB" - "ftfoJys/Kw9ef/1y8/6rh67rHgKS3WLl6cqqtcCGD58+vn+zdPXorUql8g5Y7wTWdd+y4Vus" - "teQK+yfKi8/KwM5umBXAAgioCIP54gTQBzgdwTbsQZR0JpOfXXw+0w27hn9EBGMcyRcPnulJ" - "pbKd2JvACKgKnpcePH99+TSwvT3YEphusKsqB4ZHp4FMNWUn5loSEVSFbZ63b8eeUhpwu5Md" - "JBFRjHHk7LXb08CuNuAaZTgEEaFQHJoEvDjpakOYmnURUFWSvam+0ujJfqAnmlnABhG2jlTZ" - "j19YuEzMm7dUu34hihrDQG7vGLCViPq0VruuvdquyWSvN3xsKhclvbXaoUQiihFlfLJ8iYiq" - "O/EtUC2xGGF3vjAObAnI6stCsZbYCLwnEonNY+dulALvHWSH2YN2PXLq4hz/9HpjnmOs18DZ" - "bP9IIL0+afV5juqzRgLFcV1n9u6LGWAgWnaMBFHBOIbi0MgU1S3jAcjyyw9xqpvzWou1Pj++" - "f/t8b/7EAvBW5u48agU37abWs99rv1YfL81fkT8V34YxbZ696d4CfwEszZSZx6Z26wAAAABJ" - "RU5ErkJggg==") -""" Right inactive tab image for the Chrome tab art. """ - -# For auibook -# ----------- - -AuiBaseTabCtrlId = 5380 -""" Base window identifier for AuiTabCtrl. """ - -AUI_NB_TOP = 1 << 0 -""" With this style, tabs are drawn along the top of the notebook. """ -AUI_NB_LEFT = 1 << 1 # not implemented yet -""" With this style, tabs are drawn along the left of the notebook. -Not implemented yet. """ -AUI_NB_RIGHT = 1 << 2 # not implemented yet -""" With this style, tabs are drawn along the right of the notebook. -Not implemented yet. """ -AUI_NB_BOTTOM = 1 << 3 -""" With this style, tabs are drawn along the bottom of the notebook. """ -AUI_NB_TAB_SPLIT = 1 << 4 -""" Allows the tab control to be split by dragging a tab. """ -AUI_NB_TAB_MOVE = 1 << 5 -""" Allows a tab to be moved horizontally by dragging. """ -AUI_NB_TAB_EXTERNAL_MOVE = 1 << 6 -""" Allows a tab to be moved to another tab control. """ -AUI_NB_TAB_FIXED_WIDTH = 1 << 7 -""" With this style, all tabs have the same width. """ -AUI_NB_SCROLL_BUTTONS = 1 << 8 -""" With this style, left and right scroll buttons are displayed. """ -AUI_NB_WINDOWLIST_BUTTON = 1 << 9 -""" With this style, a drop-down list of windows is available. """ -AUI_NB_CLOSE_BUTTON = 1 << 10 -""" With this style, a close button is available on the tab bar. """ -AUI_NB_CLOSE_ON_ACTIVE_TAB = 1 << 11 -""" With this style, a close button is available on the active tab. """ -AUI_NB_CLOSE_ON_ALL_TABS = 1 << 12 -""" With this style, a close button is available on all tabs. """ -AUI_NB_MIDDLE_CLICK_CLOSE = 1 << 13 -""" Allows to close `AuiNotebook` tabs by mouse middle button click. """ -AUI_NB_SUB_NOTEBOOK = 1 << 14 -""" This style is used by `AuiManager` to create automatic `AuiNotebooks`. """ -AUI_NB_HIDE_ON_SINGLE_TAB = 1 << 15 -""" Hides the tab window if only one tab is present. """ -AUI_NB_SMART_TABS = 1 << 16 -""" Use `Smart Tabbing`, like ``Alt`` + ``Tab`` on Windows. """ -AUI_NB_USE_IMAGES_DROPDOWN = 1 << 17 -""" Uses images on dropdown window list menu instead of check items. """ -AUI_NB_CLOSE_ON_TAB_LEFT = 1 << 18 -""" Draws the tab close button on the left instead of on the right -(a la Camino browser). """ -AUI_NB_TAB_FLOAT = 1 << 19 -""" Allows the floating of single tabs. -Known limitation: when the notebook is more or less full screen, tabs -cannot be dragged far enough outside of the notebook to become -floating pages. """ -AUI_NB_DRAW_DND_TAB = 1 << 20 -""" Draws an image representation of a tab while dragging. """ -AUI_NB_ORDER_BY_ACCESS = 1 << 21 -""" Tab navigation order by last access time. """ -AUI_NB_NO_TAB_FOCUS = 1 << 22 -""" Don't draw tab focus rectangle. """ - -AUI_NB_DEFAULT_STYLE = AUI_NB_TOP | AUI_NB_TAB_SPLIT | AUI_NB_TAB_MOVE | \ - AUI_NB_SCROLL_BUTTONS | AUI_NB_CLOSE_ON_ACTIVE_TAB | \ - AUI_NB_MIDDLE_CLICK_CLOSE | AUI_NB_DRAW_DND_TAB -""" Default `AuiNotebook` style. """ - -#---------------------------------------------------------------------- -Mondrian = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAHFJ" - "REFUWIXt1jsKgDAQRdF7xY25cpcWC60kioI6Fm/ahHBCMh+BRmGMnAgEWnvPpzK8dvrFCCCA" - "coD8og4c5Lr6WB3Q3l1TBwLYPuF3YS1gn1HphgEEEABcKERrGy0E3B0HFJg7C1N/f/kTBBBA" - "+Vi+AMkgFEvBPD17AAAAAElFTkSuQmCC") -""" Default icon for the Smart Tabbing dialog. """ - -# -------------------------- # -# - FrameManager Constants - # -# -------------------------- # - -# Docking Styles -AUI_DOCK_NONE = 0 -""" No docking direction. """ -AUI_DOCK_TOP = 1 -""" Top docking direction. """ -AUI_DOCK_RIGHT = 2 -""" Right docking direction. """ -AUI_DOCK_BOTTOM = 3 -""" Bottom docking direction. """ -AUI_DOCK_LEFT = 4 -""" Left docking direction. """ -AUI_DOCK_CENTER = 5 -""" Center docking direction. """ -AUI_DOCK_CENTRE = AUI_DOCK_CENTER -""" Centre docking direction. """ -AUI_DOCK_NOTEBOOK_PAGE = 6 -""" Automatic AuiNotebooks docking style. """ - -# Floating/Dragging Styles -AUI_MGR_ALLOW_FLOATING = 1 << 0 -""" Allow floating of panes. """ -AUI_MGR_ALLOW_ACTIVE_PANE = 1 << 1 -""" If a pane becomes active, "highlight" it in the interface. """ -AUI_MGR_TRANSPARENT_DRAG = 1 << 2 -""" If the platform supports it, set transparency on a floating pane -while it is dragged by the user. """ -AUI_MGR_TRANSPARENT_HINT = 1 << 3 -""" If the platform supports it, show a transparent hint window when -the user is about to dock a floating pane. """ -AUI_MGR_VENETIAN_BLINDS_HINT = 1 << 4 -""" Show a "venetian blind" effect when the user is about to dock a -floating pane. """ -AUI_MGR_RECTANGLE_HINT = 1 << 5 -""" Show a rectangle hint effect when the user is about to dock a -floating pane. """ -AUI_MGR_HINT_FADE = 1 << 6 -""" If the platform supports it, the hint window will fade in and out. """ -AUI_MGR_NO_VENETIAN_BLINDS_FADE = 1 << 7 -""" Disables the "venetian blind" fade in and out. """ -AUI_MGR_LIVE_RESIZE = 1 << 8 -""" Live resize when the user drag a sash. """ -AUI_MGR_ANIMATE_FRAMES = 1 << 9 -""" Fade-out floating panes when they are closed (all platforms which support -frames transparency) and show a moving rectangle when they are docked -(Windows < Vista and GTK only). """ -AUI_MGR_AERO_DOCKING_GUIDES = 1 << 10 -""" Use the new Aero-style bitmaps as docking guides. """ -AUI_MGR_PREVIEW_MINIMIZED_PANES = 1 << 11 -""" Slide in and out minimized panes to preview them. """ -AUI_MGR_WHIDBEY_DOCKING_GUIDES = 1 << 12 -""" Use the new Whidbey-style bitmaps as docking guides. """ -AUI_MGR_SMOOTH_DOCKING = 1 << 13 -""" Performs a "smooth" docking of panes (a la PyQT). """ -AUI_MGR_USE_NATIVE_MINIFRAMES = 1 << 14 -""" Use miniframes with native caption bar as floating panes instead or custom -drawn caption bars (forced on wxMac). """ -AUI_MGR_AUTONB_NO_CAPTION = 1 << 15 -""" Panes that merge into an automatic notebook will not have the pane -caption visible. """ - - -AUI_MGR_DEFAULT = AUI_MGR_ALLOW_FLOATING | AUI_MGR_TRANSPARENT_HINT | \ - AUI_MGR_HINT_FADE | AUI_MGR_NO_VENETIAN_BLINDS_FADE -""" Default `AuiManager` style. """ - -# Panes Customization -AUI_DOCKART_SASH_SIZE = 0 -""" Customizes the sash size. """ -AUI_DOCKART_CAPTION_SIZE = 1 -""" Customizes the caption size. """ -AUI_DOCKART_GRIPPER_SIZE = 2 -""" Customizes the gripper size. """ -AUI_DOCKART_PANE_BORDER_SIZE = 3 -""" Customizes the pane border size. """ -AUI_DOCKART_PANE_BUTTON_SIZE = 4 -""" Customizes the pane button size. """ -AUI_DOCKART_BACKGROUND_COLOUR = 5 -""" Customizes the background colour. """ -AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR = 6 -""" Customizes the background gradient colour. """ -AUI_DOCKART_SASH_COLOUR = 7 -""" Customizes the sash colour. """ -AUI_DOCKART_ACTIVE_CAPTION_COLOUR = 8 -""" Customizes the active caption colour. """ -AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR = 9 -""" Customizes the active caption gradient colour. """ -AUI_DOCKART_INACTIVE_CAPTION_COLOUR = 10 -""" Customizes the inactive caption colour. """ -AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR = 11 -""" Customizes the inactive gradient caption colour. """ -AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR = 12 -""" Customizes the active caption text colour. """ -AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR = 13 -""" Customizes the inactive caption text colour. """ -AUI_DOCKART_BORDER_COLOUR = 14 -""" Customizes the border colour. """ -AUI_DOCKART_GRIPPER_COLOUR = 15 -""" Customizes the gripper colour. """ -AUI_DOCKART_CAPTION_FONT = 16 -""" Customizes the caption font. """ -AUI_DOCKART_GRADIENT_TYPE = 17 -""" Customizes the gradient type (no gradient, vertical or horizontal). """ -AUI_DOCKART_DRAW_SASH_GRIP = 18 -""" Draw a sash grip on the sash. """ - -# Caption Gradient Type -AUI_GRADIENT_NONE = 0 -""" No gradient on the captions. """ -AUI_GRADIENT_VERTICAL = 1 -""" Vertical gradient on the captions. """ -AUI_GRADIENT_HORIZONTAL = 2 -""" Horizontal gradient on the captions. """ - -# Pane Button State -AUI_BUTTON_STATE_NORMAL = 0 -""" Normal button state. """ -AUI_BUTTON_STATE_HOVER = 1 << 1 -""" Hovered button state. """ -AUI_BUTTON_STATE_PRESSED = 1 << 2 -""" Pressed button state. """ -AUI_BUTTON_STATE_DISABLED = 1 << 3 -""" Disabled button state. """ -AUI_BUTTON_STATE_HIDDEN = 1 << 4 -""" Hidden button state. """ -AUI_BUTTON_STATE_CHECKED = 1 << 5 -""" Checked button state. """ - -# Pane minimize mode -AUI_MINIMIZE_POS_SMART = 0x01 -""" Minimizes the pane on the closest tool bar. """ -AUI_MINIMIZE_POS_TOP = 0x02 -""" Minimizes the pane on the top tool bar. """ -AUI_MINIMIZE_POS_LEFT = 0x03 -""" Minimizes the pane on its left tool bar. """ -AUI_MINIMIZE_POS_RIGHT = 0x04 -""" Minimizes the pane on its right tool bar. """ -AUI_MINIMIZE_POS_BOTTOM = 0x05 -""" Minimizes the pane on its bottom tool bar. """ -AUI_MINIMIZE_POS_MASK = 0x07 -""" Mask to filter the position flags. """ -AUI_MINIMIZE_CAPT_HIDE = 0 -""" Hides the caption of the minimized pane. """ -AUI_MINIMIZE_CAPT_SMART = 0x08 -""" Displays the caption in the best rotation (horz or clockwise). """ -AUI_MINIMIZE_CAPT_HORZ = 0x10 -""" Displays the caption horizontally. """ -AUI_MINIMIZE_CAPT_MASK = 0x18 -""" Mask to filter the caption flags. """ - -# Button kind -AUI_BUTTON_CLOSE = 101 -""" Shows a close button on the pane. """ -AUI_BUTTON_MAXIMIZE_RESTORE = 102 -""" Shows a maximize/restore button on the pane. """ -AUI_BUTTON_MINIMIZE = 103 -""" Shows a minimize button on the pane. """ -AUI_BUTTON_PIN = 104 -""" Shows a pin button on the pane. """ -AUI_BUTTON_OPTIONS = 105 -""" Shows an option button on the pane (not implemented). """ -AUI_BUTTON_WINDOWLIST = 106 -""" Shows a window list button on the pane (for AuiNotebook). """ -AUI_BUTTON_LEFT = 107 -""" Shows a left button on the pane (for AuiNotebook). """ -AUI_BUTTON_RIGHT = 108 -""" Shows a right button on the pane (for AuiNotebook). """ -AUI_BUTTON_UP = 109 -""" Shows an up button on the pane (not implemented). """ -AUI_BUTTON_DOWN = 110 -""" Shows a down button on the pane (not implemented). """ -AUI_BUTTON_CUSTOM1 = 201 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM2 = 202 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM3 = 203 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM4 = 204 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM5 = 205 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM6 = 206 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM7 = 207 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM8 = 208 -""" Shows a custom button on the pane. """ -AUI_BUTTON_CUSTOM9 = 209 -""" Shows a custom button on the pane. """ - -# Pane Insert Level -AUI_INSERT_PANE = 0 -""" Level for inserting a pane. """ -AUI_INSERT_ROW = 1 -""" Level for inserting a row. """ -AUI_INSERT_DOCK = 2 -""" Level for inserting a dock. """ - -# Action constants -actionNone = 0 -""" No current action. """ -actionResize = 1 -""" Resize action. """ -actionClickButton = 2 -""" Click on a pane button action. """ -actionClickCaption = 3 -""" Click on a pane caption action. """ -actionDragToolbarPane = 4 -""" Drag a floating toolbar action. """ -actionDragFloatingPane = 5 -""" Drag a floating pane action. """ - -# Drop/Float constants -auiInsertRowPixels = 10 -""" Number of pixels between rows. """ -auiNewRowPixels = 40 -""" Number of pixels for a new inserted row. """ -auiLayerInsertPixels = 40 -""" Number of pixels between layers. """ -auiLayerInsertOffset = 5 -""" Number of offset pixels between layers. """ -auiToolBarLayer = 10 -""" AUI layer for a toolbar. """ - -# some built in bitmaps - -if wx.Platform == "__WXMAC__": - - close_bits = "\xFF\xFF\xFF\xFF\x0F\xFE\x03\xF8\x01\xF0\x19\xF3\xB8\xE3\xF0" \ - "\xE1\xE0\xE0\xF0\xE1\xB8\xE3\x19\xF3\x01\xF0\x03\xF8\x0F\xFE\xFF\xFF" - """ Close button bitmap for a pane on wxMAC. """ - -elif wx.Platform == "__WXGTK__": - - close_bits = "\xff\xff\xff\xff\x07\xf0\xfb\xef\xdb\xed\x8b\xe8\x1b\xec\x3b\xee" \ - "\x1b\xec\x8b\xe8\xdb\xed\xfb\xef\x07\xf0\xff\xff\xff\xff\xff\xff" - """ Close button bitmap for a pane on wxGTK. """ - -else: - - close_bits = "\xff\xff\xff\xff\xff\xff\xff\xff\xcf\xf3\x9f\xf9\x3f\xfc\x7f\xfe" \ - "\x3f\xfc\x9f\xf9\xcf\xf3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - """ Close button bitmap for a pane on wxMSW. """ - -pin_bits = '\xff\xff\xff\xff\xff\xff\x1f\xfc\xdf\xfc\xdf\xfc\xdf\xfc\xdf\xfc' \ - '\xdf\xfc\x0f\xf8\x7f\xff\x7f\xff\x7f\xff\xff\xff\xff\xff\xff\xff' -""" Pin button bitmap for a pane. """ - -max_bits = '\xff\xff\xff\xff\xff\xff\x07\xf0\xf7\xf7\x07\xf0\xf7\xf7\xf7\xf7' \ - '\xf7\xf7\xf7\xf7\xf7\xf7\x07\xf0\xff\xff\xff\xff\xff\xff\xff\xff' -""" Maximize button bitmap for a pane. """ - -restore_bits = '\xff\xff\xff\xff\xff\xff\x1f\xf0\x1f\xf0\xdf\xf7\x07\xf4\x07\xf4' \ - '\xf7\xf5\xf7\xf1\xf7\xfd\xf7\xfd\x07\xfc\xff\xff\xff\xff\xff\xff' -""" Restore/maximize button bitmap for a pane. """ - -minimize_bits = '\xff\xff\xff\xff\xff\xff\x07\xf0\xf7\xf7\x07\xf0\xff\xff\xff\xff' \ - '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' -""" Minimize button bitmap for a pane. """ - -restore_xpm = ["16 15 3 1", - " c None", - ". c #000000", - "+ c #FFFFFF", - " ", - " .......... ", - " .++++++++. ", - " .......... ", - " .++++++++. ", - " ..........+++. ", - " .++++++++.+++. ", - " ..........+++. ", - " .++++++++..... ", - " .++++++++. ", - " .++++++++. ", - " .++++++++. ", - " .++++++++. ", - " .......... ", - " "] -""" Restore/minimize button bitmap for a pane. """ - -#---------------------------------------------------------------------- - -down_focus_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACaUlE" - "QVRIib2WvWsUQRjGn5mdnWxyTaqz9q+QlLnGToSgWAYDNjbpNCAGDGIvaRPbNJGQyiAEbK+w" - "sAo2qexyEhbxsvt+jMXc3u3liPfhmWeXnWVm9vc+vO/M7prVzTb+gxyA7Ye/nXPWWmvtXKBb" - "B9YBcM5lWZam6by4QNcBsNamaeq9d87NmWutdc59+NgGoKIizCwsxMTMFI8oZmZilzomZiFm" - "FWERaXbv7eyueO+TJEHM79LSkvfeWnv2qftgex2ASGDmkrUkKUspiIuCy5IL4qKQgnghdQVx" - "ScKsxCKiaH8lIu99NOwAEFGsG4Dv5xeiQYOKBBYVUWJlFhIVVmIlEZGQJKVIYBbWoKqqwQN5" - "nqdpuri42OMys6rGOG/X78yW0bXWNyLqcyyAEEIIYcYK3aB5Lazb4o5fsPc3ToFaloxBwMle" - "6+9Pjfd7stda6HR85+dCPC86Y6ETcQEcHz32eZ7meZrnx0ePJnlk0vwenm70r/PkTgWdjjuV" - "rnPPfvxaa+3NcL3GMaub7XdPtNFoZFn24tmX1/trAOLuM6aaFQwQYExAMPWNaUw1FW+eHj5/" - "dbfZbDYajY33F7e1L4gUA5uo3fd8AWbQH70bjGqEyxLq3LoMYhKCgakCIWZoLLdkMRE43Iy0" - "tWi9QOP8xoIFAyBUjF7dgOizb9iMhLmByxIAHbAGKYigUPX3hqog47hSvfCHfYRaDcNg3IzO" - "7GmydRaGi37zMujrut/9l58nijROQ9yd3ZXLy8urq6vZWFmW9f+Yhrje++XlZR2keDpZa4f+" - "H/pKkiR+/f9dDsDWgQW6QHcuxKg/ZbVtCjjzINkAAAAASUVORK5CYII=") -""" VS2005 focused docking guide window down bitmap. """ - -#---------------------------------------------------------------------- -down_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACY0lE" - "QVRIib2WwWrUUBSG/3tzc5s2m0JhXPsU0u1s3Lkpui4W3PgAuhAFi2/QbesTVEphwCIU3Hbh" - "wk2LG1fujJQgtMk55x4Xd2aS6VAzM479JyQhufnOz3/uzcQMBgP8BzkAeZ4756y11tqlQIui" - "cACcc1mWpWm6ZK61Nk1T771zbilcxBxiAs659x/OAAQJIswsLMTEzBR/UczMxC51TMxCzEGE" - "RaR39WB3b9N7nyTJkLu2tua9t9ZefLx69GYbgIgyc82hJqlrqYiriuuaK+Kqkop4JXUVcU3C" - "HIhFJODsCxF57xu/RBT7BuDb958SNGgQUZYgEogDs5AE4UAcSEREk6QWUWbhoCGEENQDZVmm" - "abq6ujrkMnMIIdZ5t31vsUC3+l+JaMyxAFRVVRds0C1azsS6O273hH24cwq0UjIGipP9/t+f" - "6vZ7st9fKQpf/FqJ28+iEzoTF8Dx0RNflmlZpmV5fPR4lkdmzffwdGe8XyZ3Luh83Ll0k3vx" - "4/dWf3+B/Q2OGQwGGxsbeZ5nWfbi2efXB1sA4uozZjRKDaAwRqGmvTCNGQ3F26eHz1/d7/V6" - "eZ6fn5/f1bogCmhsonU+9AWY5nr0bjCtKS6LtrltGcQQ1MCMCiEm1MmtWUwETh6mjq1qw0Jd" - "fmPD1ADQEWPYNyD6HBs2U2Vu4bIoEBpWE0EE6ej68NaoSBdXRi/8SR/a6qE29830yKFmm2c6" - "2fTbp8FYN/0evPw0U6UuTXB39zYvLy+vr68XY2VZNv5imuB679fX10MT8Xyy1k58P4yVJEn8" - "9/93OQBFURRFsRTcWH8An5lwqISXsWUAAAAASUVORK5CYII=") -""" VS2005 unfocused docking guide window down bitmap. """ - -#---------------------------------------------------------------------- -left_focus_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACVElE" - "QVRIibWWvW8TQRDF3+7Ors8ShSsaSpo0dEgoFcINVChSBFRUkajpIKKgiPgP0pqGJiAhITqE" - "FIk2BQUVHT2VK+y7ndmhWN/5Ixcbh8tYWvtO8vvdm5mdPXPv+RmuMgjA670/RGSttdZ2q354" - "YgkAERVF4b3vHABMCIC11nsfQiCiqwJYa4noxbNvOw/6AJIk62ySJMLMwhI5MnPMnxzMzJHJ" - "E0dmicxJhEXk+uTO0fFuCME5h1yDxbh5+zEz93q+LGOv50WUmStOVZSqkjJyWXJVcRm5LKWM" - "3PNURq6iMKfIIpJw9n08Hg8Gg36/3wL4+eu3iHpykcWTS5pElCWJpMiJWaIk4RQ5RRERda4S" - "UWbhpCmllDQA0+k0pZQFVwF3bzEAZ5N3jgje+0COnPVknbUAdm5cW5/1/eGPxcuL2saoAczC" - "DQWAV0/fr1c/HxcBFNC8QGEMMu3NuyddAfIjG9QLjKJTB3NIHV050EZuoQI6+93q4P7B6TYA" - "A2gW1xlC61K0OXi492HZ6EbAnGFqEmBmhlYc7A9HutRq/wgA5plSwDT9tORgfzgCNsmv2QfQ" - "OvEwps7BooOPpwebxFsB83wazdWdl321BjOGWWejrciZ0+wBMwef76LPnx6trXFrivIfVOsl" - "P2V7FwH4MhpuCTBLX7mjckU628naTImlrdDdLDJ59OT+XDDU8SwyTX+Y2bC7hIPVA+fty6/b" - "SmwBODreHY/H0+n0P0WLomjegJYAIYTBYNAcp5cOa20IoQXgnMuvAh0GATg8scAEmHQrneMv" - "3LAo6X/e0vAAAAAASUVORK5CYII=") -""" VS2005 focused docking guide window left bitmap. """ - -#---------------------------------------------------------------------- -left_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACTklE" - "QVRIibWWPWsUURSG3/u5u8RiKxtLmzR2gqQSttFKhKBWqQL+BQXL4D9IGxsrBUGEFCIEbC0s" - "rOzshYHt3Jl7PizuzsduJhs3Ts7C3Z2BfZ95zzn33DGnp6e4zvAAdnZ2vPfWWmvtsOpFUXgA" - "3vvxeBxCuC6AtTaEEGP03g8LQE5RTo73/sXzr7sPJwCExTorLMxExMSJEhGl/MlBRJTIB0+J" - "iBORMBMz3/xz7+h4L8bonFsCunH77lMiGo1CWabRKDArEVUkVeKq4jJRWVJVUZmoLLlMNAq+" - "TFQlJpJEzCz49n0+n0+n08lk0gP4+es3swbvEnHwTlSYlViYJZEQcWJhkkSSmJnVuYpZiZhE" - "RUREI7BYLESkTVE37t8hAM5KcM57hBCid97Z4K2zFsDurRubk74/+9G9vKhtjBrAdG4oALw6" - "eLdZ/XxcBFBA8wKFMci012+fDQXIj2xQLzCKQR20kDqGcqCNXKcCuvzd6+DB4dk2AANoFtcl" - "QutS9Dl49Pj9qtFLAS3D1CTALA2tOdifnehKq/0jAGgzpYBp+mnFwf7sBLhMfsM+gNaJhzF1" - "DroOPpwdXibeC2jzaTRXty37eg2WDLPJRl+RM6fZA6YFn++iTx+fbKxxb4ryH1TrJT9lfxcB" - "+Hwy2xJgVr5yR+WKDLaTtZkSK1thuFlk8ujJ/dkxNPAsMk1/mOWwu4KD9QPnzcsv20psATg6" - "3pvP54vF4j9Fx+Nx8wa0AogxTqfT5ji9clhrY4w9AOdcfhUYMDyAoiiKohhWt4m/9Qss43IB" - "CBMAAAAASUVORK5CYII=") -""" VS2005 unfocused docking guide window left bitmap. """ - -#---------------------------------------------------------------------- -right_focus_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACWElE" - "QVRIibWWv2/TQBTHv3e+uyRbJwZWFv4AJNSRLjChSkhlYqrEzFZVDAwVC3PXsrAUISTExlKJ" - "tQMSWzcmFqaqQqT2+8VwtuMkbiBp+mzF0pPz/dzX7z373IMXp7jJCABebf8JIXjvvffrVd8/" - "9gFACGE4HMYY1w4AxgGA9z7GmFIKIdwUwHsfQth7/vXuoxEAFfWFV1ERZhYWYmJmykcOZmbi" - "EAMTsxCzirCI3BrfPzjcTCkVRYFcg27cubfDzINBLEsaDKKIMXPFWpFUlZTEZclVxSVxWUpJ" - "PIihJK5ImJVYRBSn387Pzzc2NkajUQ/g7McvEYuhIJYYCjUVMRYVUWJlFhIVVmIlERErikrE" - "mIXVVFXVEnB5eamqWXAW8Gb39uKHevbzNwARZVFirUSIlFkqEVUD8Pb71P1Lt83LZ+8BAA7O" - "AYABMAPcFfcvDXj97ikA5wxmHVVrf64LyA7Mau1so770uVjRQa1lzaKtSc2ZWAR4uHsyn2xq" - "YBnjbFp4zsRCBw6Ptz/M5GoHgLla15AfUV8F/gEwA/Bk66jPgXNwMNhkyf199F816DIaB5bx" - "yB2aO2qFLsp/+Xiy22YmczA1Cq4hLQlwsK56xwHgumLWln0pgPv8aWcmNdVF7TKujkWAL0db" - "88nagXWb0xYgVn4XWf0CymdzWQNgapJzWC7HCnPQF5M5aBhXzthqgMkcoF57Zxx6YvaDMzO3" - "148pwMHhJhFdXFwQ0XVEh8NhuwOaAqSUUkoxxvaLulp471NKPYC80ci7gXVFALB/7IExMF6j" - "bht/AXIQRaTUgkiHAAAAAElFTkSuQmCC") -""" VS2005 focused docking guide window right bitmap. """ - -#---------------------------------------------------------------------- -right_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACVElE" - "QVRIibWWv2sUQRTHvzM7M3dHmlQWtjb+AYKkTaOVCEKsrAL+CxaWwcY6bWysRAQRUtgEbC0E" - "u3RWNsJCCILZfb8sZvdu925zej/yveMWHnvvM9837+2OOz09xU0qANjZ2QkheO+999vNXpZl" - "ABBCGI/HMcabAnjvY4wppRDCdgHIJcrFCSG8eP7l7sMJABX1hVdREWYWFmJiZsqfLGZm4hAD" - "E7MQs4qwiNz6c//oeC+lVBRFA+jqzr0DZh6NYlXRaBRFjJlr1pqkrqUiriqua66Iq0oq4lEM" - "FXFNwqzEIqL4+u3i4mJ3d3cymQwAzn/8ErEYCmKJoVBTEWNRESVWZiFRYSVWEhGxoqhFjFlY" - "TVVVLQFXV1eqOitRV68Pby+v6fnP3wBElEWJtRYhUmapRVQNwJvvvftXbpuXz94BABycAwAD" - "YAa4a+5fGfDq7VMAzhnMOllt+rMpIDswa3JnG81lyMWaDppc1i7a2tCCiWWAB4dni8F2Dyxj" - "nPUTL5hY6sDh0eP3c7HGAWCuyWvIJRragX8AzAA82T8ZcuAcHAw2W/JwH/3XHnQZrQPLeOQO" - "zR21Rhflv3w4O5xGZnPQGwXXklYEOFg3e8cB4LrJbLrtKwHcp48Hc6FeF02Xcb2WAT6f7C8G" - "GwfWbU5bglj7WWTNAyh/28sWAL1JzrK8HWvMwZBmc9Ayrp2x9QCzOUCz9s44DGj+hTM3t5ur" - "Bzg63iOiy8tLItok6Xg8np6AeoCUUkopxjh9o64n731KaQCQDxr5NLAtBQBlWZZlucWkXf0F" - "imtJnvbT2psAAAAASUVORK5CYII=") -""" VS2005 unfocused docking guide window right bitmap. """ - -#---------------------------------------------------------------------- -tab_focus_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAAC10lE" - "QVRIidWWT0gUcRTH387+ZveXZgzsbmvSsmqEfzBJSYz+gUsHCYJgISPytCQKFhJdpIN0qIUO" - "ezIUaU/roQ5eEzp46ZT/DhG4haCXdSUPK+Wuzvze+02HgdFmFqMtD76Bx8yb3/v8vr/3Zn4z" - "np6ReTgCYwAwdqfEGFMURVGU/wIdfaswAGCMcc5VVf1fXIBdBgCKoqiq+nxkobn3BABIkgBA" - "hIiEJFAgorAOyxARBTKVoUAkgSiJkIhO73a/nLjGOd/nWkrPXbqLiH6/CgBEJiIaKA1BhkG6" - "QF1Hw0BdoK6TLtCvMl2gIQhRCiQiCfPLm5ubtbW1YNXXtuzadyJTZV4AkKYkMpEkkRQoEUmQ" - "JJQCpSAiMr1eg8hEJJSmlFJK0wdQLBYR0cl9laj7l6LGY5/tc2ejsrmdgeGJbG5nYHgym9uJ" - "x9KHeGuMNd7B8fSMzCfvyerq6rHHn2bmEgPDE09G+/9WaSqZmRofisfSiadnotHoozclp94K" - "oGWznNxn/e8q4LqznNwXmb4KuO6s4643lZyugOvOcj8PDyrgurOOe30r05tKZv7ALavXmszt" - "rXZZL7EjhTmuU8lpRxNSyemZuUEAmJlLOPzU+CAAuKFluO7OWpF4LO1OPsTcejOOTcRepqXR" - "tngs7Y6U4bbcqNrIF6bGh6yt0prAgm7kC6E2fSNfWF9b2d7e1jStvqGlbMSmeRsuP7zZZvp8" - "PvCoW1s/a2qq7vddD57y3b7VZfmNfGFxadUQBgqztbWps7Pdy04uLq0WSyVJnoMRgUY45NM0" - "bXZZ7OvtaA8vLOdeT85mP+4eXN35K/6W5nBjxFz5tv7+w8LWF3+oTW+IBpsavStf1+xIfTTY" - "cNbknDPGfqsD5/xCa6AuDFe791xtEJyHIhHedTGw17tnj49EeFdH8GAkEAhwzgF+7HMZY5qm" - "cc6tD6rDGGOMMUS075aN2Ho9R/R/9gsXZ7dKHM+ODQAAAABJRU5ErkJggg==") -""" VS2005 focused docking guide window center bitmap. """ - -#---------------------------------------------------------------------- -tab_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAAC1klE" - "QVRIidWVTWgTQRTHJ5vZZEyMLKSx1RbSImJbioeiCKIechLBU8CCtadAaaGIFC/iQTxowENO" - "hUohp/Tiocdce/Gk/TiIpTm0JCnmA+OaFJs2u/PerIcp27IbKsZ66Ft47P5n3m/evLc768lm" - "s+Q/GCWEBINBSqmiKIqinApU13VKCKGUMsZUVT1lrqIoqqq+frYyeP8cIUSgIIQgAgACcuAA" - "wOUlDQCAA1UpcADkAAIREPHiwa2383cYY0TWwa7AlRuPAMDvVwkhiBYAmCBMjqaJBgfDANME" - "g4NhoMHBr1KDg8kRQHBAREE+r1er1Z6enkOubbn8d0RLpV5CiLAEogUoEAUHAYAcBYLgIDgi" - "ouX1mogWAIKwhBBCWD5Cms0mADi57xKX/6Ws8dgX+97ZqFxpb3JmPlfam5x5nyvtxWPpE7yc" - "I+c7OJ5sNhsOh4PB4Kunn5aWE5Mz87MvJv4201QyszA3HY+lE88vRaPRYrHozLcDaNsoJ/fl" - "xIcOuO4oJ/dNZqwDrjvqrOebSi52wHVHud+HJx1w3VFnvb6d5ZtKZv7AbZuvXMztZbvkR+wI" - "oY7nVHLR0YRUcnFpeYoQsrSccPiFuSlCiBvahuvurFTisbQ7+ARz55txHCL2NmWOtsVjabfS" - "hjt0L1Cu1BfmpuVRKReQ0HKlHhkxypV6Ib/ZaDQ0TesfGGqr2DTv+Ph4IBDw+XzEo9Zqv0Kh" - "wOOxu10XfA8f3JS+XKmvrm2Z3ARuDQ9fGx297qXnV9e2mvv7Aj3HFQ5md8Snadru7u7Rua6q" - "6sp6aTNXzX08OL67q7f9Q4PdTP1ZKCn5Qq321R8ZMQaiXf19VuGbJ1/8IZX+aNdAnxWJRHp7" - "e7e3t4+4oVCo0Wjout5qtdx9YIwxxlqtlj3aVgmHw5qmbWxsHNWXUqppGmNM/lCd/aWUUgoA" - "9mhbhTFGKT3sm67ruq7v7Oy4cR3bb5uW079be13FAAAAAElFTkSuQmCC") -""" VS2005 unfocused docking guide window center bitmap. """ - -#---------------------------------------------------------------------- -up_focus_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACTUlE" - "QVRIic2WP28TMRjGH/85c1miqEF8CnbUgSFdukVRmZGQ+gW6Vgwd+hW60Yq1gMQMQzpHGZAg" - "C6JS+QIMmUju/L5+Ge6ulzoRTcMh5TmdZfv8/vT4Pcu26h2N8R9kAZwMfltrtdZa60agx5fa" - "ArDWpmmaJElTXGBmAWitkyRxzllrG+Zqra21bz+OAQQOzETExJ48EfniKURE5MkmljwRe6LA" - "TMz8ZPbs9GzXOWeMQZHfW33/NOufvALALESUU8g95zlnnrKM8pwyT1nGmadHic085Z6Jgidm" - "Dhh/mU6nnU6n1WrFXAA/fv7iIEECsxAH5uApELHnwBQ8Bc/MLMbkzELEFCSEEII4YD6fhxAK" - "Tsx9/tQDEIgqOzRggAQQQEEBguIFgKoNqDdfvy1yYq41emG4QKkSpDQAiNQfFQClpBoZcaK2" - "s0awEHzXVVyri1gxN7FaFuILu6qwtAyokqWWwEvcxNTTKsIK95Cqs4JJzV02vMJvHS/1cFFQ" - "UGV+K3tSzWlZq/5bOWGllIio0mzpX+pZSJXdVRmOuabcItRC+ZfKcn+pFRvN65fvNihj9Y7G" - "o9FoMplcX18f9M5lUx30zofD4WQyubm56R2Nm9oYY20B98XeRfPcAro+ei1uf/DBt9u+3c7b" - "7f7gfTPc/cOr7HE36+5k3Z28u5N1u/uHV/dG3X+gfb7YW8dgpC1YD1vBjfP7oEW6Lvf0bHc6" - "nc7n881YaZre3pjucJ1znU7n9qx+qLTWzrkVXGNMcav4d1kAx5camAGzRoiF/gCKPmudbgYP" - "HQAAAABJRU5ErkJggg==") -""" VS2005 focused docking guide window up bitmap. """ - -#---------------------------------------------------------------------- -up_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACTklE" - "QVRIic2WP4vUQBjGn/mTMUtgWS6yvb29XGGzzXXHwdWCcGBzH8BCweK+wnWyWKtot6DNge0V" - "gjYnNn4BA9vdJvO+81ok2ewmi7d3RtgnZEgm8/545skwiZrNZvgPsgCSJLHWaq211r1Asyyz" - "AKy1cRxHUdQzV2sdRZFzzlrbCxdlDmUC1to3Hy8BBA7MRMTEnjwR+fIoRUTkyUaWPBF7osBM" - "zDy+fnR2vu+cM8ZU3KV+fLo+fPUUALMQUUGh8FwUnHvKcyoKyj3lOeee7kU291R4JgqemDng" - "8ut8Ph+NRoPBoM0F8PPXbw4SJDALcWAOngIRew5MwVPwzMxiTMEsRExBQgghiAMWi0UIoclh" - "VY8fegACUVWHBgwQAQIoKEBQngBQ3wPq9bfv7XzX7o1eGS5QqgIpDQAizUMFQCmpR3bf26qc" - "NYKV4nVX7aumaavNjayWlfrSriotdQF1WKoD7nAj00yrLCvdQ+rOGiYNt2t4g9+mXprhoqCg" - "qnxre1LPqatN762asFJKRFRltvIvzSykTndTwm2uqbYItdL+5aLbX2nDRvPiyds7tC2p2WyW" - "pmmSJHEcP3/25cPFSXfQNjqeTE9fPhiPx0mSXF1d9bMxdrUD3OPJtH9uCd0evRX38Oi9Hw79" - "cFgMh4dH7/rhHpxc5PfTPN3L070i3cvT9ODk4saqmz9on6eTbQy2tAPrYSe47XxvtUi35Z6d" - "78/n88VicTdWHMfLP6Y1rnNuNBotv9W3ldbaObeBa4wp/yr+XRZAlmVZlvWCW+oP2FUt8NYb" - "g5wAAAAASUVORK5CYII=") -""" VS2005 unfocused docking guide window up bitmap. """ - -#---------------------------------------------------------------------- -down = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACFUlE" - "QVRIidWVPWvbUBSG3+tv8KKpnYtH/4DuJtCti2nntBm7depQWih0zT9w/AtSQsDQ0JIfkKFD" - "wRC61Iu3uBgRiKXz1eFalizb8QfxkFdCurofz3l1zhVyg8EAe1BhH9BHyC3NWkTU/XYFQEVF" - "mFlYiImZyR9ezMzEpXKJiVmIWUVYRJ7cPT/uHizhFgqF6+93Lz8fAhAxZo5ZY5I4log4ijiO" - "OSKOIomIq+VSRByTMCuxiCiufo3H4yAI8txisQjgz98bUVNTEWNRESVWZiFRYSVWEhGxYjEW" - "MWZhNVVVtQoQhuESrtfXw6e7JbTd+k1E6dv3+/3dQPeo3+8/3n22Si+OLgFLn52D4aLTun/V" - "er8XnVZ1NKqM/lX9eTNaC92IC+D87HUlDMthWA7D87NXmyzZNL+nl0ez60Nyt4Jux91Kee71" - "8Lbd6uxwzXFcr9drNpv+4f2bn59O2gDMAMC5ZJY5wOCcwZxlV7tkKr68PX338Vmj0cBev7f8" - "d0GkSG0i0576Alza7707LGqBy2JZblYOPgnm4JJA8Blay41ZnAfO3xbumWjTQOv8+oKZA2AJ" - "Y1o3wPucGXYLYVZwWQzQlJWmwIMs6Z8OJUHWcUU1aWZ9WKaGlo67xZlTbbbPbL7oq7fBTHm/" - "Jx9+bBRpnea4x92D4XA4mUx2Y9VqteVcAEEQ1Ov13bhZ5fP7IFB4v/v41f8HFQ1ap0nfm7YA" - "AAAASUVORK5CYII=") -""" VS2005 unfocused docking guide window down bitmap. """ - -#---------------------------------------------------------------------- -down_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACaUlE" - "QVRIib2WvWsUQRjGn5mdnWxyTaqz9q+QlLnGToSgWAYDNjbpNCAGDGIvaRPbNJGQyiAEbK+w" - "sAo2qexyEhbxsvt+jMXc3u3liPfhmWeXnWVm9vc+vO/M7prVzTb+gxyA7Ye/nXPWWmvtXKBb" - "B9YBcM5lWZam6by4QNcBsNamaeq9d87NmWutdc59+NgGoKIizCwsxMTMFI8oZmZilzomZiFm" - "FWERaXbv7eyueO+TJEHM79LSkvfeWnv2qftgex2ASGDmkrUkKUspiIuCy5IL4qKQgnghdQVx" - "ScKsxCKiaH8lIu99NOwAEFGsG4Dv5xeiQYOKBBYVUWJlFhIVVmIlEZGQJKVIYBbWoKqqwQN5" - "nqdpuri42OMys6rGOG/X78yW0bXWNyLqcyyAEEIIYcYK3aB5Lazb4o5fsPc3ToFaloxBwMle" - "6+9Pjfd7stda6HR85+dCPC86Y6ETcQEcHz32eZ7meZrnx0ePJnlk0vwenm70r/PkTgWdjjuV" - "rnPPfvxaa+3NcL3GMaub7XdPtNFoZFn24tmX1/trAOLuM6aaFQwQYExAMPWNaUw1FW+eHj5/" - "dbfZbDYajY33F7e1L4gUA5uo3fd8AWbQH70bjGqEyxLq3LoMYhKCgakCIWZoLLdkMRE43Iy0" - "tWi9QOP8xoIFAyBUjF7dgOizb9iMhLmByxIAHbAGKYigUPX3hqog47hSvfCHfYRaDcNg3IzO" - "7GmydRaGi37zMujrut/9l58nijROQ9yd3ZXLy8urq6vZWFmW9f+Yhrje++XlZR2keDpZa4f+" - "H/pKkiR+/f9dDsDWgQW6QHcuxKg/ZbVtCjjzINkAAAAASUVORK5CYII=") -""" VS2005 focused docking guide window down bitmap. """ - -#---------------------------------------------------------------------- -left = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACMElE" - "QVRIib2WPYsTURSG3zv3ThKJRSqblDYLwU6wFMKCViIEtbKQ/QdWgrXt/oO4hZWCIEIKUfYH" - "WFgIATuraewHM3PPh8XNZCaTSWI2oydwMx/kfeY959wzMbPZDC3FaDTavOi23Wgron8n/Z8A" - "rnry/NmXk/vXAAhLZCNhYSYiJvbkiciHTwgiIk8uduSJ2BMJMzHzjd93zi9OmwEAbt5+TETd" - "bpxlvtuNmZWIcpLcc55z5inLKM8p85RlnHnqxi7zlHsmEk/MLPj6LUmS4XDYDPjx8xezxs56" - "4thZUWFWYmEWT0LEnoVJPIlnZlZrc2YlYhIVERHtAIvFYquDu7cIgI0kttY5xHHccdbZKHaR" - "jSIAJ8Pru5M+GX+vnm4rslEDmMoFBYCXT9/uVt+MbQAFNCxQGINAe/XmSVuA8MgGxQKjaNVB" - "CSmiLQe6kqtUQJfHjQ7unV0eAjCABnFdIrQoRZODBw/frRvdCygZpiABZmmo5mAynupaq/0l" - "ACgzpYBZ9dOag8l4CuyT37EPoEXiYUyRg6qD95dn+8QbAWU+jYbqlmWv12DJMLtsNBU5cFZ7" - "wJTgzS76+OHRzho3pij8QLVYwlM2dxGAT9PxgQCz9hU6KlSktZ2sqymxthXam0UmjJ7QnxVD" - "Lc8is+oPsxx2V3BQf+G8fvH5UIkDAOcXp0mSVF94V4ter5emab/frwMADAaDcOOYSNO00+mE" - "4zrgePWaiAMwn8+PF932//MPv0Uk8OspzrYAAAAASUVORK5CYII=") -""" VS2005 unfocused docking guide window left bitmap. """ - -#---------------------------------------------------------------------- -left_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACVElE" - "QVRIibWWvW8TQRDF3+7Ors8ShSsaSpo0dEgoFcINVChSBFRUkajpIKKgiPgP0pqGJiAhITqE" - "FIk2BQUVHT2VK+y7ndmhWN/5Ixcbh8tYWvtO8vvdm5mdPXPv+RmuMgjA670/RGSttdZ2q354" - "YgkAERVF4b3vHABMCIC11nsfQiCiqwJYa4noxbNvOw/6AJIk62ySJMLMwhI5MnPMnxzMzJHJ" - "E0dmicxJhEXk+uTO0fFuCME5h1yDxbh5+zEz93q+LGOv50WUmStOVZSqkjJyWXJVcRm5LKWM" - "3PNURq6iMKfIIpJw9n08Hg8Gg36/3wL4+eu3iHpykcWTS5pElCWJpMiJWaIk4RQ5RRERda4S" - "UWbhpCmllDQA0+k0pZQFVwF3bzEAZ5N3jgje+0COnPVknbUAdm5cW5/1/eGPxcuL2saoAczC" - "DQWAV0/fr1c/HxcBFNC8QGEMMu3NuyddAfIjG9QLjKJTB3NIHV050EZuoQI6+93q4P7B6TYA" - "A2gW1xlC61K0OXi492HZ6EbAnGFqEmBmhlYc7A9HutRq/wgA5plSwDT9tORgfzgCNsmv2QfQ" - "OvEwps7BooOPpwebxFsB83wazdWdl321BjOGWWejrciZ0+wBMwef76LPnx6trXFrivIfVOsl" - "P2V7FwH4MhpuCTBLX7mjckU628naTImlrdDdLDJ59OT+XDDU8SwyTX+Y2bC7hIPVA+fty6/b" - "SmwBODreHY/H0+n0P0WLomjegJYAIYTBYNAcp5cOa20IoQXgnMuvAh0GATg8scAEmHQrneMv" - "3LAo6X/e0vAAAAAASUVORK5CYII=") -""" VS2005 focused docking guide window left bitmap. """ - -#---------------------------------------------------------------------- -right = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACMklE" - "QVRIibWWvY7TUBCFz83vojSuKNiShgdAol8hQYWQkJaKAuUNtqWmoeANFgoqhJAQHRLaB6BA" - "orC0HWnSUEURK2LPmRmKayeO4wTysydWbI+c+e7xzDgOo9EIK0rTdDW4m0Ij4FBK07R1fdmj" - "rh3QqZ6cPf965+ENAKbWardMTZWkUoVCUuIniiSFnW6HQqqQpkpVvfnn3uu395sBAG7fPSXZ" - "73ezTPr9rqqTzGm5aJ5rJswy5jkzYZZpJux3O5kwFyVNqKqGb9/H4/Hx8XEz4PLnL1XvdtpC" - "7Xba5qbqVFM1oZEqakoTmqiqerudqzqpNDczM+8Bs9lsrYNXw1ub7+nl+DcAVaOa0HJVESM1" - "VzVzAG9+LF2/dZFfPHsPAAgIAQAcgDsQ1ly/NeDlu6cAQnC4V7L6/GtfQHTgXuSONopdk4sd" - "HRS5vFy0l6EVE5sAD4YXq8GyBh4xwZcTr5jY6CDg0eMPtVjhAPBQ5HXEW9RUgX8A3AE8OTlv" - "chACAhy+WHJzH/1XDaqM0oFHPGKHxo7aoYviTz5eDOeRxRwsjUIoSVsCAryaveIACNVkPi/7" - "VoDw+dNpLbTURfNlrNcmwJfzk9Vg4cCrzekbEDs/i7x4AMWt3B0AsDTJUR7LscMcNGkxByVj" - "7YztBljMAYq1V8ahQfU/nNrc7q/6e9FkMplOpyKyT9Kjo6MkSQaDQZqmdQdJkiRJsk92AFdX" - "V71eLx7XAQfRYDCYH68FHOr19C8Ad0k9S0aHzwAAAABJRU5ErkJggg==") -""" VS2005 unfocused docking guide window right bitmap. """ - -#---------------------------------------------------------------------- -right_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACWElE" - "QVRIibWWv2/TQBTHv3e+uyRbJwZWFv4AJNSRLjChSkhlYqrEzFZVDAwVC3PXsrAUISTExlKJ" - "tQMSWzcmFqaqQqT2+8VwtuMkbiBp+mzF0pPz/dzX7z373IMXp7jJCABebf8JIXjvvffrVd8/" - "9gFACGE4HMYY1w4AxgGA9z7GmFIKIdwUwHsfQth7/vXuoxEAFfWFV1ERZhYWYmJmykcOZmbi" - "EAMTsxCzirCI3BrfPzjcTCkVRYFcg27cubfDzINBLEsaDKKIMXPFWpFUlZTEZclVxSVxWUpJ" - "PIihJK5ImJVYRBSn387Pzzc2NkajUQ/g7McvEYuhIJYYCjUVMRYVUWJlFhIVVmIlERErikrE" - "mIXVVFXVEnB5eamqWXAW8Gb39uKHevbzNwARZVFirUSIlFkqEVUD8Pb71P1Lt83LZ+8BAA7O" - "AYABMAPcFfcvDXj97ikA5wxmHVVrf64LyA7Mau1so770uVjRQa1lzaKtSc2ZWAR4uHsyn2xq" - "YBnjbFp4zsRCBw6Ptz/M5GoHgLla15AfUV8F/gEwA/Bk66jPgXNwMNhkyf199F816DIaB5bx" - "yB2aO2qFLsp/+Xiy22YmczA1Cq4hLQlwsK56xwHgumLWln0pgPv8aWcmNdVF7TKujkWAL0db" - "88nagXWb0xYgVn4XWf0CymdzWQNgapJzWC7HCnPQF5M5aBhXzthqgMkcoF57Zxx6YvaDMzO3" - "148pwMHhJhFdXFwQ0XVEh8NhuwOaAqSUUkoxxvaLulp471NKPYC80ci7gXVFALB/7IExMF6j" - "bht/AXIQRaTUgkiHAAAAAElFTkSuQmCC") -""" VS2005 focused docking guide window right bitmap. """ - -#---------------------------------------------------------------------- -tab = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAACq0lE" - "QVRIidWWTWgTQRTHJ+3ETEugERrtF6QhFhKsIlgQRITm5LkBvdiDhBZKc5DiRXryoAEPPRUi" - "pTnVi4cee5NePAitFtFoVxSyheYDa02KCd3deW/Gw2Cy7MZaIz307TK7/Gfeb9587Nvx6LpO" - "TsA6TgJ6glyqHgcHB4/ub0ZvdRFCBApCCCIAICAHDgBcXcoAADhQLwUOgBxAIAIinju89iRz" - "gzHW5Pb09BBCImO3AcDn8xJCECUAWCAsjpaFJgfTBMsCk4NposnB56UmB4sjgOCAiIJsbJXL" - "5b6+PsYYtQev5b8hSi/tJIQIKRAloEAUHAQAchQIgoPgiIiys9NClAAIQgohhJBnCKnX6wDQ" - "jFfZ0+TA/8xpIv6+8e5cN61Qm05ltEJtOvVMK9QS8ewRpWqj2js4nsb+nbv3cnU9OZ3KzD2c" - "/NdIF9IrS4sziXg2+aA/FAr5/X5nvG1AW3o5ufOTL9rgur2c3Mcrd9rgur1Oe7wL6edtcN1e" - "7v1wtw2u2+u0z2978S6kV/7CbRmv6sxdquVSH7HTR/9tE+PLUsqp2cz27k/7PTWbkcezifHl" - "tbW1XC6n6zp1dONeWaUk4tnjTwtx5F81KEcSaQxzdT1p1xPxrFtpwY3d7C6WKkuLMypVqg4U" - "tFiqBEfNYqmi57er1WogEBgOx1oqDVoz/77e2Onu6hq7emGg/6w9imKp8ubt149a/mI0rGqV" - "8u7DlyuXRuzKp8/5yzG/yr9NrmEYm1uFba2svTq0c0eu+2LR88z7Qy905PW9vZwvOGqGQ73D" - "Q1Lf9eR3vitlONQbHpLBYHBwcJAx5rGfd6rV6v7+vmEY7nVgjDHGDMNo1LZUIpGIc34ppYFA" - "gDGmfqgOo5RSSgGgUdtSUSUANLmqWp0q/mTK82hFcX4Bm24GMv+uL+EAAAAASUVORK5CYII=") -""" VS2005 unfocused docking guide window center bitmap. """ - -#---------------------------------------------------------------------- -tab_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAAC10lE" - "QVRIidWWT0gUcRTH387+ZveXZgzsbmvSsmqEfzBJSYz+gUsHCYJgISPytCQKFhJdpIN0qIUO" - "ezIUaU/roQ5eEzp46ZT/DhG4haCXdSUPK+Wuzvze+02HgdFmFqMtD76Bx8yb3/v8vr/3Zn4z" - "np6ReTgCYwAwdqfEGFMURVGU/wIdfaswAGCMcc5VVf1fXIBdBgCKoqiq+nxkobn3BABIkgBA" - "hIiEJFAgorAOyxARBTKVoUAkgSiJkIhO73a/nLjGOd/nWkrPXbqLiH6/CgBEJiIaKA1BhkG6" - "QF1Hw0BdoK6TLtCvMl2gIQhRCiQiCfPLm5ubtbW1YNXXtuzadyJTZV4AkKYkMpEkkRQoEUmQ" - "JJQCpSAiMr1eg8hEJJSmlFJK0wdQLBYR0cl9laj7l6LGY5/tc2ejsrmdgeGJbG5nYHgym9uJ" - "x9KHeGuMNd7B8fSMzCfvyerq6rHHn2bmEgPDE09G+/9WaSqZmRofisfSiadnotHoozclp94K" - "oGWznNxn/e8q4LqznNwXmb4KuO6s4643lZyugOvOcj8PDyrgurOOe30r05tKZv7ALavXmszt" - "rXZZL7EjhTmuU8lpRxNSyemZuUEAmJlLOPzU+CAAuKFluO7OWpF4LO1OPsTcejOOTcRepqXR" - "tngs7Y6U4bbcqNrIF6bGh6yt0prAgm7kC6E2fSNfWF9b2d7e1jStvqGlbMSmeRsuP7zZZvp8" - "PvCoW1s/a2qq7vddD57y3b7VZfmNfGFxadUQBgqztbWps7Pdy04uLq0WSyVJnoMRgUY45NM0" - "bXZZ7OvtaA8vLOdeT85mP+4eXN35K/6W5nBjxFz5tv7+w8LWF3+oTW+IBpsavStf1+xIfTTY" - "cNbknDPGfqsD5/xCa6AuDFe791xtEJyHIhHedTGw17tnj49EeFdH8GAkEAhwzgF+7HMZY5qm" - "cc6tD6rDGGOMMUS075aN2Ho9R/R/9gsXZ7dKHM+ODQAAAABJRU5ErkJggg==") -""" VS2005 focused docking guide window center bitmap. """ - -#---------------------------------------------------------------------- -up = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACHUlE" - "QVRIidWWP4vUQBjGn8mfcyGQYiM2W8mWsRcLm22uWw6uFpQt7WwVLPwKVsp+gFMsAwqynY2F" - "oLAgNu4HsEiz3E7mfee1yN9Lcueu7oo+IcPMZN4fz7yZzEQlSYIDyAMQx/F+ocvl0tkvsdKh" - "uF6z8eLsAwDLlpmImNiQISKTX7mIiAx5vkeGiA2RZSZmvnF++9nzO0EQ9HC/vj2fPr0PgFmI" - "KCObGc4y1oa0piwjbUhr1oau+Z42lBkmsoaY2eLjpzRN+7kAvn3/wVasWGYhtszWkCViw5bJ" - "GrKGmVlcN2MWIiYr1lpr5QjYbDb9eQBw95YBIBBVdDiAC/iAAAoKEOQ3AJRtQL38/OXS/ALw" - "XKcxXKBUAVIOAIjUDxUApaQcecV7A3DkuYJG8EVX7VpdtNXm+p4jjfjcrsotdQFlslQH3OH6" - "bj2tPCx3Dyk7S5jU3K7hHr91vNTDRUFBFfkt7Uk5p6763lsxYaWUiKjCbOFf6llImd2+DLe5" - "ruM0UlA5uazS7S/Usz88vnf2G2VLKkmSap989OD9m8WsO2gbnU7mD5/cHI/H+C/3yR24p5P5" - "/rk5dHv0VtzpyWsThiYMszCcnrzaD/d4ttDXIx0NdTTMoqGOouPZ4pdR7e+iq3fzyTYGWzrY" - "etj7zwOAOI7/yjmPHRfpFVKr1apqrNfrNE2bx+pOGgwGo9Eor1/wGwRB9QPwh/oH9oed9BPW" - "YyQlBOJt4AAAAABJRU5ErkJggg==") -""" VS2005 unfocused docking guide window up bitmap. """ -#---------------------------------------------------------------------- -up_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACTUlE" - "QVRIic2WP28TMRjGH/85c1miqEF8CnbUgSFdukVRmZGQ+gW6Vgwd+hW60Yq1gMQMQzpHGZAg" - "C6JS+QIMmUju/L5+Ge6ulzoRTcMh5TmdZfv8/vT4Pcu26h2N8R9kAZwMfltrtdZa60agx5fa" - "ArDWpmmaJElTXGBmAWitkyRxzllrG+Zqra21bz+OAQQOzETExJ48EfniKURE5MkmljwRe6LA" - "TMz8ZPbs9GzXOWeMQZHfW33/NOufvALALESUU8g95zlnnrKM8pwyT1nGmadHic085Z6Jgidm" - "Dhh/mU6nnU6n1WrFXAA/fv7iIEECsxAH5uApELHnwBQ8Bc/MLMbkzELEFCSEEII4YD6fhxAK" - "Tsx9/tQDEIgqOzRggAQQQEEBguIFgKoNqDdfvy1yYq41emG4QKkSpDQAiNQfFQClpBoZcaK2" - "s0awEHzXVVyri1gxN7FaFuILu6qwtAyokqWWwEvcxNTTKsIK95Cqs4JJzV02vMJvHS/1cFFQ" - "UGV+K3tSzWlZq/5bOWGllIio0mzpX+pZSJXdVRmOuabcItRC+ZfKcn+pFRvN65fvNihj9Y7G" - "o9FoMplcX18f9M5lUx30zofD4WQyubm56R2Nm9oYY20B98XeRfPcAro+ei1uf/DBt9u+3c7b" - "7f7gfTPc/cOr7HE36+5k3Z28u5N1u/uHV/dG3X+gfb7YW8dgpC1YD1vBjfP7oEW6Lvf0bHc6" - "nc7n881YaZre3pjucJ1znU7n9qx+qLTWzrkVXGNMcav4d1kAx5camAGzRoiF/gCKPmudbgYP" - "HQAAAABJRU5ErkJggg==") -""" VS2005 focused docking guide window up bitmap. """ - -#---------------------------------------------------------------------- -aero_dock_pane = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAMAAABnVw3AAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAb3WKdHqPdnyRd3+deYGge4OifISifoallZaWgIy1g463hZC5hZG6iJO8o6Sk" - "pKSkpKWlpaampqenqKmpqaqqqqurq6ysrKysra6urq+vr7CwsLGxsbKysrOzs7S0tLS0tLW1" - "tba2tre3t7i4uLm5uru7vLy8vL29vr6+iZfLjJrNjpzPjpzQkZ7PkJ/SlKHSkaHek6Pgk6Th" - "labjmKjlnqzhnqzjoa/npbPov8DAwMDAwMHBwsLCwsPDw8TExMXFxsbGycnJycrKysvLzMzM" - "zM3Nzc7Ozs/Pz9DQ0NDQ0NHR0dLS0tPT09TU1NTU1tbW1tfX0tTY19jY1tjd2NjY2dnZ2dra" - "2tvb29zc29zf3Nzc3N3d3d7e3t/fxs7szNPt0NXo0dfu1djk09js2tzk3d/k3d/m2Nzv3N/r" - "1Nr02N713OH13OL23+X43+X54ODg4eHh4eLi4+Pj4uPm4uPn4+Tk5OTk5OXl5ubm5+fn4eLo" - "4uTs5eXp5efv5+jo6Ojo6enp6urq6+vr6Onv7Ozs7O3t7e7u7u/v4Ob55Oj16Ov37e/26+/9" - "7/D28PDw8fHx8vLy8/Pz8/P09PT09fX19vb29vf38vT89ff9+Pj4+Pj5+vr6+vr7+/v8/Pz8" - "/f39/v7+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAsPpcmgAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAf+SURBVGhD7Zr7d9tEGoa9UKBZCiapneBQN3bUQlgo13DbhXBrnRQnS0LJNhDbUO7s" - "ErCtZWWZm2Rj2YHdbWQsCSQL2/yjZkaypBlpdKH14XA4vL8kkuebx3PR6HtnHBtHkfxyZoGs" - "zMtR4sfjWJRi0mJRHZGlFhej1BCNs1XyocDbpa0ooEjtSfcDOHp6apyFAMzop4XfF2f0K7Vn" - "qpyhr0bT5AwHvhpOkzPQ/TVNjt73lT6c4jzQNV/1p8npq77SBlNsj6b4Sr1Ozmtr99xpvQpm" - "6LKvquyMVezOe9Ze81uDfNbRHLUtiPaqNi8KvrqqztvlRGGbypFJRM7mMoOtnPNHDV8JisOB" - "QczyJolE4qy/MMAX6Pl23VdNGeeMBi+sE0AEzsYl92tgXqj5ipNcnNHo0oYX5OVsnfe8beab" - "VVQcelHveTij895XrJdD6SGc4b+HCIglcHTK0yAPJ4dPAYOJtUd/78b3dAdE4owYz6zzcM4Q" - "3tEop/v18ePHv+7aICJndMbdIDdn93Iwp/vh7VAf2iAy5/KuC+TmPN0J5HQ+eNDUB51Ji8ic" - "zjMhnAwpIbT7TfjXU4+ZeuqfbRNE5miZEE5qGNSe2g//s/RDLYgzSoVwiKlammMmvVTjLE0w" - "NH+UJmV37peFe3yInM3NZp0liz/azk+NM0ptt3tkdXZSxGQ1vD3EDOpiep6s9EVSeW+y5e03" - "/1Qt+ie/Fseb1HnaE5AS+ieL7k+IHMwTzqDDcDofkB+6P8qfRkPtpAEkD9Bbxsa4J+RHyCgo" - "hZRRm/xi9sxZH61smMBUQUEiRzwyC6G3jLk8IY8PdvElWMdf/6745om9DQP0UhELxDjQW8Zc" - "ntDF6Z8CdXSoID/XuxtyTmlBHD0dcy0ALs4oCRLrdiBHpmDuncT7wdWenxZ+I5xhEgxMWHvg" - "2AW3Z+RpD4c/ChMO6WVhjZlMmRwscMjhQwo5WM9+hT8WgyQwCgIVtOLIFPQSSdyKDb7CpwXg" - "DLGa2b49g/W+1jc4LSrgcR1IJgdYpL5tk/o6i4YMYL/hX6TmYD76XtN0k9MPAE044Pt9/5ED" - "qmERQ8DBPWHNMlT6O08eaqqeBManRWn+vrEvUdAbJTVVO3zyHX0SrtXQCOAtAQd71BnVdFQ/" - "fvnQ6qGq9BOyLDcp1d83aj0KFJETqqIerj705Y9muMqgEcBbxhZwT1iVJSjt/dvOrR4q8oQj" - "+/tGtWtyFEk5XD132/saDJeVKhYxABwNFrNVMV7P2he3nDi3+oksaQkQxVMSVga7ABxYc0Lu" - "yZ+snjtxyxcarECqoIVUHXBUowGWSl1RFKVXbrj5xP2rH0tdNQGCeKqLlcEuZJGCFSckUfp4" - "9f4TN9/wigRq6JXQQjLkiC1U2xx0VOKnN91636MHQqN7EnxIL7exMthFm1+G1yeFunDw6H23" - "3vSpCOK5xjZaqKMCTodHtVVjgGryu5DT5ETIqWabWBnsojnhNJkm5Lwrwwpq9S20UEsBnDaW" - "mOWrhrOuaJ8/8MgBx1ydA8a0nOV9sjdwm6tnoXed48vcwSMPfK5VjHAmj0bwEuC0aFTrpaIp" - "4coTB2y1Mwe+VznLYmWwC5bNwq8+xxbZgyeuCGZwqbKOFuIgB/eEueL+RI03vq2U27Ogt4vZ" - "SZKLuUcrE65l4YjO1vYr377RmMQWyjm0LNsL4BQblf2yMAvaXwjhwC4CnP1Kw/qSETiFPUSA" - "A4x2IRPcHujFZxk0br8U2h43B8ye/RAOnKHXxykJd4Dx3AvmZOCQ33Fd7Zlwlpx+oxnXjgX3" - "Hyoap4XNohzWb6VWHHx62eHQbMt2WuY/teeegxXEw9qT5i2vZvAwzn6VT0CO02+McDpt6PSp" - "U+bf9N+MuEQF/YL4PICeL7a12UK9Wr5SclTlN1YMjv2cgqfSeHHIWm4H/lX0s/8wOCvnmbIT" - "WMbWA+D5NmNj3KuVOsgCyF2cMyq5i7NutjfOmtsyytkj46+wWDb7fW6DdSKFoxJi/zqXUvBc" - "Jr+EHCHNzMUdJWBrgJ5fNDsL6O61lFF6MWsGUevW8K4knMDZBOoXlvLecybXMmRVUrBEWnq8" - "98BCE+br8eUuWrWeUr95zr1JZNjQf5P3kpp8re05uXPks4F9tHOSALpGzsqu/z65sjuZlCju" - "GjkJMYDThUuGS+GcVIP2hsVtzP+/sfRf654Kl0CX6t2w/SqwxARx3nr8YVOPvxnAofl22P7b" - "0wXCu9Npj3LlL6auOD3pbQ/dpMP2E3fXsd1ps21xxc5ilbf/DPU2csfLqXXyYfuj42zL23Fx" - "M7k3pHx27NixzxT7WlY8HJqXlsP2e8e5Hd4DiqPJ8nev/unV75AbHg7NdvbC96/HSy3PVIhL" - "6Caf/LqMXbrbwzRF9ywg/S5gc80DiveABXAELYWtroRzaIbvPus9miGcl6xfEOp417k4GFTE" - "OTTb7G4QDmaI5z9rnQbL0A4rLl71Fcqh6RrfEZ+NeP4zHm8uXT4SeM5O+We7ARwZpsaG6nzr" - "qrSXiXyeBebkhcyFCmuPdkLq+qpnWD5DEkfnMhd+wfkcLArOG+20Yaaw66s92kkFfvl5I/6l" - "FgLPAad4TtsJOgecIifgHBB4wun9PgT3lphvrHtSKCI20u9qfJI6Yy33vjr/4Fg98Ee/hZ8H" - "k2bLAu4tsYRomvPN5S1RDvSEU3tOXd4S2yICnnBqHJe3RLMD6AmjKNJ64PKW6C8VoSeMop8B" - "XFekjMjBOHUAAAAASUVORK5CYII=") - -#---------------------------------------------------------------------- -aero_dock_pane_denied = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "ABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAELhJREFUeF7tnfmPHNURx81v" - "hEsCIQQCxCnu60d+AH5BCCGBAAkEP/AHABKKkEhCCErCHcA4WGAIYJwYbOMrGHzgE9vYxvje" - "9drYa+99etd7zHov766PSn3avFFvu3v6dU9Pz2Q9K5Vmtt9VVd9X76zqOWtSCf4NDw9LfX39" - "pMbGxklHR0YKxuHvzj570tVXXz3ptttuO6tgjUykioeGhuTbRYukrr5eRkZG5OTJkwUj6qcd" - "2ptIOiyYLFV79khDQ0PBAPEDm/Zot2BCTZSKFy9eLGNjY6mCc+zYMaHdiaLDgsmxYOHCVIHB" - "kvij3YIJNVEqLoNTwkgWAxysp2w5Fp2iDI6FkoqVxYBz4sQJSYPM6q1sORaIoyRAOX78eCpE" - "W+VhzQIYsgAOwLC8TYvK4EQAB1DY66RBtIX1lIc1C4BQEgobHR1NhegAZXAsgDHDGgrj3CsN" - "ohMwjJYtxwIglITCjh49mgrRAc5YcGpqa2Xjxo2yZs0aWaiKR/m5aNonn0hLS4vodUEq1NTc" - "LO3t7UK7YbzBP3IgD3JZ9LXSzLJj505Zvny57Nu3T7p7eqS/v9/qzGzBggVO3h4tkwb19fU5" - "wyft2lxPGN6QC/mQszQR8OGqqqpKlv3wg7S2tloJ61UISjpy5IgcPnw4FaIDMITaguPlFzmR" - "F7lLGqRdu3bJ1q1bnTHcphf65UFJvb29cujQoVSoq6tLuHmNCw4yIC9yI39JAlRRUSH7q6tj" - "g5I9RlFw6M1tbW2pUEdHh3D7mg84hnfkRw8lBRC3iNu3b88bGGenruDQm5t1oo5KKDpqGSx0" - "cHAwEXDgHz2U1K0qEyMbx7hDmbtcXHDYSDa3tDsbyigAsVJLEhz0gD5KwnpYrcSd/IPmnKiW" - "MzZ2TOoaWuWPr051PvnfFqCkwUEm9FESq7jlK1YkYjHuOScKOAMDA9LRmZG/vj07S/zPcxuA" - "CgEOsqCXolpPtU6ABw8eLBo4AFDb0CX/+GjNacRzG4AKBQ56QT9FA2j9Tz9JJpMpCji0W12b" - "kQ//XRVIpJMvlwUVCpxebXfDhg3FA2fp0qWJO/7ZLAhYalfXD8nsJR3yr7ltgUT63oODzr4p" - "CKBCgcP5IPopmuX899tvndVREqu0KHMOe6DhoyekKxNOg5qP/GmDgzzop2jgFMIZ43t17mO/" - "woon13CEwskXRrmA4YC1s7PTOS6i3SQ7WdFvVwsBDmdUu5VYsbFBZNgpFBlgOMTcvXt3GRyb" - "3slwgMKYK9ggFopYLOzfv98Zfmz4ipqnqBd4hXRjqqisdPyX5+txTqGI+mknaResknC3KiQ4" - "SSsszfrK4KTkdBgX1JJYEKTpAJiWo2G+7STuqLh3715n0xR2j+5O59496nyweMkSZ2WUlsNg" - "Eu3AL3xHkZXNtI1fgluf6B8cxu2N4ob5sRTFfKOYPlfCtXV1zgrJT3HcSm7dtk2WLlvmHB6u" - "WLmyoLTmxx+dC7IgEOETfuE7ipzoxejHdpV3WhhkPmF+NB6FYXdeDciVSl0peZWybv162aO9" - "B2Wk4VjIMh1w/ACCP/iMI2MccAyI2TDIfML88gEHx8Hvvv9+HDjsO37QiyrbnpZUPgBatXr1" - "aR0F/uggaYOTDYPMZ5efDzgodv78+eP8odl0couYlNJt62EopV2vbzb8xQHGLAiiDmuG32wY" - "ZBmck473TRkcz95knvZM97zSE9FyRvTgs2X6dNn3zDNSdd99DvGdZ6RFtRzvHAd/xbCc7B4p" - "H8vhRDjungChg8AJu4Y4zssd3nxTKq64QpruvVd6nn9eMq+9Jn36rOfFF6Xp/vul4sornTzk" - "DQPJWE4QOHFkRAb0E9Z2ULpzLpfPEcwhbTzuPgKBAccdScAlGsNLrt46qouG3Q89JLU33yyZ" - "d9+VgVmzfCkzebLU3Xqrk5cyueo04HijGuAvbiAX5dBPHMsbZzlUEEfJHOUzidoseU1AFHkp" - "4wdOd3e3A04QL2O6vK56/HGpv/126fv4YznyxRdyZOZM6Z87Vwa0p0F85xlp5Km/4w6nDGX9" - "6oUPnApp1w8cd6wQfNvEDpl86CeqXo23bNZy4vYOLrJsgaltGpL+wePZ/DDttRzAYSlthPMK" - "1qIK//XSS6Xr9del7/PPpV979oC+t2bQQzwjjTzkpQxlgxQFOLTrB46788E/ctgChH6igjMu" - "0s5EksUJ8WvVxsMCnGhsT3W3zFx0SBrbT0WrUcaA447DMeAY63LzNKoK3HXTTdLy5JPS9+mn" - "MvjVV1ZE3tannnLKUoefnAYcb0yQmRPhF57gHzmQB/5zyU5+9BNVr77g2FiANw9XyTAYFOh0" - "7NhxaTuUkY9nVsknczTmRoUz+WF63rx5zjLWELefpgd72+pWT5bKSy6RHp3kB6dNi0S9b78t" - "lZddJtThJyebUNp188J3+DP88gn/yIE8yIV8QbKTH/1E1eu4MEgsJ26YH3f8CEHP89LIyKh6" - "X7bLW1NXyZQvK7PgIAxlcoFDurdXNrz3ntTcfbcMqKI7dXXWpRbRrcNWr1JGqY/5R6lfaRDS" - "ZwOap++555wytffcI9Th19vxbwsCB36RjU8DDvIgF/Ihp1d2+Cc/+gkbWfzSs5F2JszP22ts" - "/m9qavK9Qqa3tLV1yqtvfiVvfbhSpkw/BU5D22gWTPLM1Z7pFowdNUrimbf9mpdektZHHpHB" - "l1+WtqeflhNaPuzvpObpffhhp0zro48KdXjrRTkGHK+S4Y/8WBaf8I8cyINcyIecyOK9Sqcu" - "9GOjR3ceM+RnFwQ88Ov9Yc84oEMwor0MUaZqb7W89Mo/5S9vGHAqZJoDzql2KEObCO8WyoBD" - "urftuldekfYHHpChZ5+VVlW4LTg9N94oA7paa3/wQaEOv14O73QKr4JN5yGdcvCPHFOmVzjg" - "IB9yIi/pbj1QF/oJ06EfP8w7WXColMk4KuGEwUbLG+hEfc0th+TPr/1H3piyXCZ/vlM+mtUk" - "dS3DTuwNUWsAMOebb8a1iasSUWKcsXl5adBhqvGaa2ToscekQ0Fqf/996fjgA+nUvc5hHba6" - "lLqVmF8ySn3vvCNHdH7KXH+9DN51lzRee61Qh7de2qJT0K43Df7gF/n4hH/kQB7kQj7kRF63" - "DtAJMjohlxH1yuGvEwZpNqE8gMGotEfjclguMvG5yXH602HgYG3raeAw6cM8AnnBYYzmHoc8" - "Xl7ata09uiAYUksY1n3O8J13yvAtt8jwDTeE0pDmoSx1eOs1bQWBQzqy8ekFB/mQ06sD/gcs" - "9BNVp4DphEEacOg9cXzDKvWGEIX6RT4z3jJZNrd2y9QZFfLR142OcMZhkEDZ2XPmjIv7pB7A" - "QSA/fvY+8YS06Z5l5KqrIhFlKOtXp7F82vXGocIfvMAX+RxwVA7kQS7kQ06v/DwDUPQTVa+0" - "50TaGXBAiyElKhEDybjKhVQQMRxU/tohMxa2SG3zsMMsgGKtRnjTuww45PHjpWHTJtmhFtB5" - "8cUypgq3IfJShrJ+dRrlmU7h7unwRzqy8Qn/yIE8yBUkMzoBIPQTVafZMEgDTpR4GLeL7E4N" - "nILBWo3Jz0X0yM27uqWj62i2p2Gts2fPHjdWUxdKyuVCWztjhmw5/3ypvuACGbrwQjl+0UW+" - "RBp5yEuZINdeE3tKu965E/5IRzaUDf/IgTy55K3Ta206GvqxiRFy58k61qcFDkpHIAREKBin" - "581S4d1mj1Bh4CBInZbbfvnlsv6cc2THuedKzXnnSdNvxHeekUYe8ob5XAMA7XqHIPgz4BiA" - "kCOsQ5YMODBSU1MTidzguKOmcaTAAyWX5RhFN+p4Xv3CC7L9uutkkwLx02/Ed57t1zTyhPVc" - "t+V4I7gBh7kjqnwAydBWdMvJFxz3Kg+h/MABTNLwa8bRfceOHbJlyxbnNSfr9HUna/REYLXe" - "5zj02WeyVv0BCFz65ZdfnOhmXJtY1qJklOYGzA2Od9V5RoKDgpxhTe9i3BMmygsChzQUjEfM" - "NnWd+vnnn2W9euqsViBWqAvVMh2WKMvR/6pVq2TdunUOeOblDfiDEQpoJmsDUBYcLeudvOHv" - "jLOcXOAssRjWmLsMoWSUapTtVrCxhFwvnGB11KJDF6CWJDgspcPGZr90xtQ4wxrg0ObX2jPd" - "9dKzbcAxgDCBU09YAFWudI71N6kVQl4Z4a+oloPfGmv7sEiypMBh7qAu2uTsyguO7YIAfhka" - "cZNFBl/SNHzPoKB0ItoYHv3kgz8sNGoHjLsgcEfaOa/vx+OTSZYeGDWSjIkW5rEEWzLA4GH5" - "o7rC+oETtAl1DzvuzaPftQXPOC3GullIeA8YOSLhgBF33wMHDviCA3/bdEFBR2BRYisjeSmD" - "fqKcELgj7bJvoYobSVavoLDTj3K4xxBDwNIc3X379dZF333nDFNhdbKJ3aUAo9ygV7sMKwAr" - "NZ2YTz8vFywPP3GUGTSswycdyQyhYXyRTr20iX6iROU5kXb67oLTAn1BmfE+apQBzDM22xK3" - "iziPBylj8+bNjsIChyrXEIYL7QZdkSGMH9+LtB42l0EysQjYqUcsYfMt/MK3rYwswRkSo0YZ" - "oH9wSCQCG6HjHv2EKYQNaRiF1VGs9HFHMIloOkYlhQSnWIpNot0yODHex5aE4m3qmPDgrF27" - "1vFrsx3n4+SjftqxUXiUPBMaHG5I9+nylxVPId8vTf20Q3tRlB+Wd8KCw96CV2EVEhRv3bTn" - "3XOFAZArfcKCwxIU/4I0wcHZxHta8X8PDvsLLp/cB4/5CEVZ5g4bYDJ9w9LaMRRKPZlTDn65" - "CG8X7zlfPnJw0gLgRX1rFOdg5qglH2HcZW3B2b2/V+/zm2TqzPpAIn3HnlMv9U4LHHM+xglG" - "Ud+3xpsKORS0ubm0Bc8WHJS9Wx0t3v10eyCRHgaMSU/KcgCHjTmfRX1TIRMpxx9x3uccBJYB" - "x8aNFcX+Wt0qf5+87DTiufHLDquLfEmBQ0fljAy3qKK+45NDBW4gjWuVrXXkyoeSgpzj/Vxb" - "UWxTc4f86W9fZon/jQN6mDuscTpPAhwzpNEmTooxDl2SLcL7k9krcNydxMIAJYUp1Js+MDAo" - "+6rr5Pd/eM/55P8odSRhOcjO/IvVHNQr9ZJ4rzRQc5qK9SSxODDgRDlqN1EANbUN2aiAKOWx" - "nnwtx7jssg0o6kLAa3tcDOFMkQRAKAnFuj32bb97Ix5sypmIhrjgYDEAw8hBXRvVs7Tkfq4F" - "11NcloxXftwhLh9wbMDwy8MQGAccM5SxOgMYLv9K9mdaYAwLYtxlc8owR68y18s2CwaUhAJx" - "dE+DTOyNLThGFlZlWAuyUgcWU7LAmKEOk2YOOqCeNBwsYkkIwXLb5j6dW0R6YRrA0AaKZc7x" - "ugb78crOH1kYvimLxRlfu5IbynKt+xjimBj5xAnEHAaGTdQmmgyA0iD48Yuy8+MTMBw/N51n" - "cBwx8iW7/k2xNvevHdr4J3DvzqkDG7g0iJ6Psm3v+yfErx3GxR8Ai/KDeoRclP9yawBwmGRT" - "/0G9MjjhXRNw0vxBvXFhfuHsndk5ACduGGTUED/yZ39Qr2w54R0vbXerkrhSDldLaeQog1Ma" - "OPhyUQanDE7WFao8rEXoDGXLiaCstLOWwUlb4xHaM0tpmxPsJPKUh7UI4OQTBhkVrNPC/CLw" - "eUZmzScM0uZKwp3HN8zvjNR6BKHjhkGGXUd40wPD/CLwekZmjRMGaXMl4c6TaJhfAVD6HyAO" - "VvwtWIicAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_dock_pane_bottom = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQJgE7q5VA" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAEFtJREFUeNrtXVtsHFcZ" - "/me8a+9617Ed3x3HcXNxnDhxmsShQQqEolKq0pLeVakSqA8g8YIEQvDAC0g8IB6okEAoPEBB" - "QEvbJKWFJqBSWpSUosYpdpzaiXN1Yju+xJfYXtu73hnOd3bPerz3uezMoPqTRrM7u3PO///f" - "ufz/ucxI5EKEQiH16tWrdP36dVpYXCxYPn6fj1paWmjdunVHmpub33Bab9djfn5ePX7ihHrl" - "6lV1cXFRVRSlYAfSRz7Ib3Bw8FmndU+G5LQAyeg5f14tCwZp06ZNtuV548YNmp2bo47du11l" - "D9lpAZJx/do12rBhg615NjU18XzdBteRsxQOk8fjsTVP5Id83QbXkbOGFayRw6CqqtMipMUa" - "OS6GvY27DthVmiXJVQ7aKriSHBBjZ1PjVoI+8eQgn6KiIqdVTotPPDmoNW51CFxJDuBWg9kJ" - "V5Jjd5/j1oKwRo6LUXByBi5fVm+PjNDS0hJNT09TLpOPjY3xIxqN2mIASZbJ6/HwPF997bWs" - "4sGnq6iooJKSEqpvaKBtW7cW1M0rCDlHjx5t29/Z2TfOFI6Ew7Rj504q9nopGAzmvPfYsWNU" - "Xl5OkUikkHonAE/N5/NRbU0NPfnEEzn/Pzc3x2UbHR2lkydPqjW1tdS5f39BSLKcnJ6eHvXm" - "rVtUX1dH+/buNZQGmjS7ao7IL1+IAlZZWUltbW00PDxMf33rLXVjUxN1dHRYSpKl5Jw7d05d" - "WFigLz74IMmy8ZEhEGNbs2bSlW5sbKT6+nrq6uri+u/bt88ygiwbW/voo49Uf2kpHThwwBQx" - "AIylKIotBwqBWecD+kJv6A87WGVTS8jB7OXy8jJtb221RChhNL0H+g+991jpGUJ/2AH2sCI9" - "S8gZYn3Mvffea4mCRoHZ03BE0T2LarXLDjvAHlbANDlnu7rU3bt3Ozo+VV/fQNcHR+jnR1/l" - "Z3x3CrAD7AG7mE3LNDnj4+O8U3QK8Jomp+boty+9R77San7Gd1x3CrAH7GIWpsjp7+9Xt2ze" - "7JgRQMDoxCK9+EoXlZbVJQ58x3UnCYJdYB8zaZgi5zYLxGpY8OYEysrKaGh0mf7y7gj5grUp" - "B67jd/zPCVQzu2DUwQxMxTlzs7Pk9/ttVzwQCNDoVDF19c2Sz1+V8X9dfUu0Z3uQGquDPLK3" - "VUbmVt+9e9dUGqbIwXIir9drq9LA4uIiNTdUUFWlL+d//ewvM5MztssIu5hdbmWKHMQjVk/x" - "FpeU8PgDgR3STwf8PjV5Oy8PcSaUebQBsovYCPlajUzy5wvXTRnc09JCo6ytbmxo4AFdtjgk" - "H+VBQKZFimLQc2hoiFpsXP6bL1xHzq5du+jE66/zYXyMWRUXFxcsL4wuY+Cyr7+fHn/sMadV" - "T4El5FgdZT925AiGQOj06dO0uLRUMOV9rCnb2NzM87NSB6uaetfVHIEOFmXj+CRjbcVnAWBV" - "LTRdc9bm+1NhVbOWSKW3t1fVu80PEbDeEQJ4R5tYO79z506bTGUeH3/8Md0YHOTxVb6AYcfG" - "x6m2tjbve8Q2SOYUSSINwra7PXv20IbGRl3eEQb3QI6emhNmgdkQ85C6u7vpy48+mvI7PKjz" - "vb08bbi6hV4qCze7av167iWmwxtvvklGbAO5hX2M2OaJxx+XJDPb/JB5dXW1IaNgqx+GN9rb" - "21ddP33mDE9z65YtpmdU8wEKw8DAAP+cTNCFCxewmdeQbYyQo7UNtkHKTmzzA/hWPyaEFhj/" - "whqEdtbkYfkRhkAKfZSWltK2bdtofGIiRUbI55htGC8eJ7b5AcgzzGIYbZOIz06s90cNjaYZ" - "jYB8TtkGvKy50i6GY0Eod8FpdUzgtEOeXHOckkfIYYocMzFONi+MN28u2tBkVEez8V+CHCMJ" - "qQbvy6hAUv9jN9LlaaYAGrWPKJgeIYCRuQeV3ZOv8Oh0xX+RebqaIdIxOw+i1xDZ5NfaRsid" - "Sz6hmxpfuKhXHnG/rDWKXugh5sZwmBbDcs77rKiNenUQ+Wb7HYD80CNX/CX0M9Qaae7zJF/Q" - "lRDlNiSi/P4rM3SuL0KH71tPDVWU4j5nM4idyNasoTRP3o3SmXN3WSzmpbYt5TnXcxspaNoW" - "xVSfI/qITPd6PF4am5il9/4zTLK3cpWy/J6kQqHmSK9QyJhvSg2QaH5hmekzTuvLi6i2uoyW" - "lyPZEjalS6JZM3JkWyAuSTIN3hqjF1/5kMLLikbe3AIrmr7MriMbcUIeAegDvaAf9EzWXWsf" - "IzYVeclaAfQemQRAhHvnzjT95g9vx2qXmihIq/+bVDBE52nnLoNkIrLJl+An9gPXD3pC33SF" - "1oge2hpsuuYkC4A28+LANXrhF3/UeMYqiW43uXSkK7121pxMsmivrfxnRQ9R2KAn9BVeXK6C" - "m488ArzPwVB12MAaKwxSzs/PpzQLLc2N9M1vPEu//PXfUkoG5kRERyq+J5oLJgPSwkixXe40" - "PC/kh3yT52uEfJAL0wWK4k/RB3pWlAdWLSAEUUgX9sGhB3CghDfIyTG6k0y7x0WL2dlZqq6q" - "pOefe4D+9Mb5FIWT23ABUXqQpl3k5NP/ZZIH+lVXldPU1NSqdETsZNSuKa60IXKyCI65jOam" - "evrqMwfoxN9vJjw7/B/r0bRVX2sIrUHsQKYmRfyGa5A3MTrNrnk9Mj3D9IK3Njp6O4XgxGJF" - "g3oIOTxmjKFkqDkCw8NDfGf04fsaeJyDvyXXnHT32rknVItMsqzITBTwF9G+fQ3sLHH90kHE" - "KooBPbQBrrkgNEOJ0wJVvrFmHYWW/BRkCi2FIqvinHQ1x85FI8mOSNKPCf3QLwVLJWrb7Gf6" - "KFyvTBBDMEb0SHGlCw3McG5tUhgxY4nnC6R3VZ2dNEjnSgtAbsgPPezasWDL0ihU7ZmZmYz3" - "Jz7HLtiieC5Z0umnx6u1oqA5vuIz05SB47K4AI6QkzBChrE1R5CuBXCYLMdrTjL0mEN0vGZm" - "TeHyRpir7ManFXqEknZD6xBor+ULEUsgckccYhTLrD/EOrGydetS8ne6kfOUMOVy7SSzEtrd" - "ZOm2LOZbTJAO1radef/9zM2PZtZSTlcA4+5uOSNmc5pd4ZDPKduAF0/LPffwx1Nh77wYY8oX" - "iJpx6BEcmcOo2LRUk2G1aD5NFQyGZ7jh/Pn7788Ypff29vKFg83NzSn3Q/Z/vPMONTSkf6gE" - "5Mt3l11y3sI2eta9rdpp19JCHrz54tjx46rHwE4ybGzCclU9UTCUHB4Zob6+Pjp06NCq3yAY" - "2n8YLpcc+A9WZEJulPB0fQbkm5iYoIMHD6bd9Y1AMhQK8cKSDlgJig1c2GVXV1eXt20EOWFW" - "2GGffMF32sE2/f149ttK8ezu7lYHb97UtZIeuwwqKyr4GFK+wEPxqliJbGWKp8OtW7f48w08" - "eXTQPmZwEIpxvHS1F2l4mUEzjQwHAwGqZUavybHe+9LAAN1hJIfzfECfIOfOnTu6dhlAl+aN" - "G7FwfmWXgVHgsYufO3xY97B4PsjHEMUObLPPByAGNebkqVP09FNPGbax61xpAbca3k6srZV2" - "MVxXcyZCsfONSz3051ulNLZYuPJT61PoSFOINrV28O/VpU5rvxquIwf4/qmbpO74Ej3wnEqb" - "/RLBzypmLTd8JQ87w1XIlzI4v/Alo+wDQtUldobLg3HlgZBKR/8lkXzqffrRQxudVjsFriPn" - "2sVukrY8TD/+dJQCKotVmDU9MshgnyUeN3IvRk8vC4LgyymY7GOxyjKIYhcOSCo9eb9M3104" - "yPJ9i6r37nFa/VVwXZ9z/GaAWg5JVBzNPnwiM3ZAWq5DzsIiSPJGFap8KJav22Cq5ojF6Va+" - "SWMqLFOrTyIlS7gFgxezdurufO48MXupsrZQyfBX1KhGv0wXwtaVU2EPs3taTZFTYnLQ0SiK" - "mc79A/P09r+naHImc/7ryz302c4K6thVRss2LUkQy6IQ7ZeYfG6PKXKCZWU8AEVka+WCDJRm" - "NcMBLLKsdrQFCdXrxWMXM6bzzIPbacfOMprX8KddtCnGFKwe0wQ5WM+nZ+gmHUyRg0fiT8/M" - "0IZAwFpy1JVVvPwM48mxz+hCmJ9AIWbw9vYa+lpRhF741bspaXzr65+j1rYamouoq9NSNekX" - "YE5ADKjemZzUNXSTNi0zN7e1tUl4wweEsXJOCGRE4h4VXGDhCic8LiV2vhtWqXV7I/3wO1+g" - "2akbiQPfcR2/KyoljmjSZ6QfUVZqkFmIMTUMkGJkGfYxk57pXrCuvp4/RgQCWUWQwpcjqbFz" - "/FAZY/wzxY/49ZmwQg11FfSD7z1NodlhfsZ3XE/cS0lpaNPla9KsIUZM/uEpHBjFNgvT5OD1" - "JFeuXOGCWfU4FBiLxyKa0q4t9YqoRRSrVRPLRdS+YzP97Cff5md8j9LKfxK1heI1UV1JP6Ja" - "M+MJvcXUxaWLFy15bYsl/iMeNIT5GZQaKwgSzZmS4VCTDlwbXiCqaNrEz+n+I/qcVWQJYkzU" - "HOGdgRg4Rt09PSkTe46Sg/fG4HHCeOoUJq7M9kFKvERHNCVc2+9oa4D2WIimvw5nTdTCaLxW" - "RuL9TTievlFixMwuZlsHLl/mjyy26j06lkVeeG8MShAef4USJEjCNb0rZBCTRKLxGqQ5lLhx" - "hUOQ96HEak1UWSFIOARwMvX0OUIX0b9ghhW6/re7m2di5ftzLB1bg2B48xSe/NTa2spdbQSp" - "Yv4937UGsT5BZWcczBCqFO9n4kUc42s6SrtKq709ni5qUHzYQEiVa75fNGEgRkyPYy3ERdbH" - "oClz9ZunACHg2bNn1YFLl/i6BDzWCorkG5Rh0GFZiZdsOWZYGUaVKNF7yzrMkOxOC/cczZmk" - "rtScXPKBHOw9QuCNKfqRkRGu3yOPPPL/8c42gc7OTi4w3nY4ODjIV8pMTU/ncWc1vTypUh1r" - "19aXSFTmlShQJJGvKDZs45Vjo9NFOswhRqHDjJ0ldp5nF2YjGMdTWCWU6CWW1mH2P0wr50Kl" - "5m2H+wv0Ij2Bgk8Z6H1d48M/fVddZDVnjhmuRJK5gEXc3ZJILYr1HXrIEU0ayFli5GDoZ4GR" - "E2Lexnw4FutEIrHRDTPz/YWA6+ZzgKVIbHimlElXwuzGKg9vxkRThgk3RSc53DNjaS3FD3h2" - "yIM7Cvbv08oLriQHrto8K+oBZjQf62iK0ZRFV1xLVSc5fJiGsRBG7Ymi9sSO0HJsSfAaOXrA" - "SjSatiV2hFlThqkWT7wp45zIMYLygSBHjKMlalA8D441cvRB0RzZpg9yIdO9Im03w3XT1GtY" - "wRo5LsYaOS7GGjkuxho5LoY7yZHtE8ydBojBda50tV+iAPNxg8VywQ3nY9oHvDKVxfN1G1xH" - "zvO7vfTPniLa8Jko+VlwGGTRZ9BL5GcRaElRbODTY2BsLaJI5FNUKmH3e2WViotUquHPspGo" - "6qREX9nrod85rXwSXEfO/o5d1P7hB/T7Cwdpx6dU2lYqUwUjJcjI8LOqVMLO2Lnj0TNCoMZm" - "PBfYMc9q5TQ7JhljlxaJhk4TtSkfUOeeXfklaCNcV5dVhunpafqw5wK93K/Q7fnCxfH1AZme" - "bZPpQEc7VVRUYL7GVfb4H1Voiukj7VWUAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_dock_pane_center = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQKidFE1+x" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAEAxJREFUeNrtXdtvHNUZ" - "/2Zv3l2vb7HjWxzbcRzjJCQOcSKQiBSQEBclFAgX0VYt4qnq9blP/Qeqqi+t2gi1BaQCJYQg" - "oAQQD6VKHhBxwCGJc784dhzbcRzHt73O9Pxm96xnd2e9c9uZqdifdLT27syc832/c77zfec2" - "ArkQS0tL0pUrV+jatWu0HI2WLZ9QMEjd3d1UW1v7TGdn54dOy+16LC4uSu8fOSJdvnJFikaj" - "kiiKZUt4PvJBfqOjoy87LXs+BKcLkI9T330n1UQi1NXVZVue169fp/mFBdq+bZur9OFxugD5" - "uHb1Kq1bt87WPDs6OuR83QbXkROLx8nn89maJ/JDvm6D68ipYAUVchgkSXK6CKqokONi2Gvc" - "dcCu2iwIrnLQcuBKckCMnabGrQR978lBPl6v12mRVfG9Jwetxq0OgSvJAdyqMDvhSnLs7nPc" - "WhEq5LgYZSfn4qVL0q2JCYrFYnT37l0qpfKpqSk5pVIpWxQgeDzk9/nkPA+9996qxYNPV19f" - "T1VVVdTa1kabenvL6uaVhZyDBw/2D+7aNTLNBE7E47R5yxYK+P0UiURK3nv48GGqq6ujRCJR" - "TrmzgKcWDAapee1aev7AgZLXLywsyGWbnJyko0ePSmubm2nX4GBZSLKcnFOnTkk3xsaotaWF" - "dj7wgKFnwKTZ1XJ4flrBK1hDQwP19/fTzZs36d+ffCKt7+ig7du3W0qSpeScPHlSWl5epice" - "f5w8HuMjQyDGNrNm0pVub2+n1tZWGhoakuXfuXOnZQRZNrb2zTffSKFwmHbv3m2KGADKEkXR" - "loRKYNb5gLyQG/JDD1bp1BJyMHuZTCbpvr4+SwrFlaY3of/Qe4+VniHkhx6gDyueZwk546yP" - "2bFjhyUCGgVmT+MJUfcsqtUuO/QAfVgB0+ScGBqStm3b5uj4VGtrG10bnaA/HTwkf+J/pwA9" - "QB/Qi9lnmSZnenpa7hSdArymO7ML9MbbX1Iw3CR/4n987xSgD+jFLEyRc+7cOWljT49jSgAB" - "k7ej9Pq7QxSuackm/I/vnSQIeoF+zDzDFDm3WCC2lgVvTqCmpobGJ5P08X8mKBhpLkj4Hr/j" - "OifQxPSCUQczMBXnLMzPUygUsl3w6upqmpwN0NDIPAVDjUWvGxqJ0cB9EWpvisiRva1lZG71" - "vXv3TD3DFDlYTuT3+20VGohGo9TZVk+NDcGS14bYJXN35mwvI/RidrmVKXIQj1g9xRuoqpLj" - "DwR2eL4a8PvsnVuaPMS5peKjDSg7j42Qr9UoVn6tcN2UwYbubppktrq9rU0O6FaLQ7QIDwKK" - "LVLkg57j4+PUbePyX61wHTn3338/HfngA3kYH2NWgUCgbHlhdBkDlyPnztFzzz7rtOgFsIQc" - "q6PsZ595BkMgdOzYMYrGYmUTPshM2frOTjk/K2WwytS7ruVwbGdRNtL3GZUVn2WAVa3QdMup" - "zPcXwiqzln3K6dOnJb3b/BAB6x0hgHfUxez8li1bil7zuze/oKszMQoG/GVfjenziNRZH6Df" - "vvxo0WvOnj1L10dH5fhKK1Dqqelpam5u1nwP3wbJnCKBP4Ow7W5gYIDWtbfr8o4wuAdy9LSc" - "OAvMxpmHNDw8TD94+umC33/9189ocGsvdXa0UjjooZDPQ1U+gQIs7vEyI+xFbOKBPRZID28o" - "okgSpZj3nZLSnzHmit9ZiNHvX/uCHtpSr0rQhx99REZ0g0rF9WNENweee07wmd3mp9ekQUDE" - "Mh5W+DNnztDWrVtzfl9IEj390Ca6siBRiMWYQZb8HharMEIYR/J9HiHdWeppUygloiIRJLEy" - "J9mnl30RYh7bL3+ylw59/lXBPSjfAzt22LYFUqkb8OJxYpsfIG/1u3495zuMf3kzzcHOXizC" - "lJJIFeaI8jmmG8aLz4ltfgDyjLMYRtnynHYs8vNH+ZzSjcyLo9pYBTBBkuKTKLc16aVR7V7+" - "fLfCMXJkF5xya6uUSegX5I6bWTjRw/uJdB/D+xk5QNPtEKw8S5kkRZly7nFQN4ApcszEOKu5" - "yFBiEuR40iSJQlqJnsxvQuZTTwTNSZA/FcSkpNKtx6iMZs10lhwjD5IM3ldUgMzf8KbizM1N" - "sH99EnOdQYzEGwquSXtseqq20lNLZUiBxyayL8UMPWqymKmARvXDK66PF8DI3IPE7tFaeMzP" - "8GuRuVrL4aYua9bEXLMmtxp2m8BbgU6zpmraKNe0qZWJ64aXu5SuuGxSZuGiXmL4/R5eACPQ" - "Q8z1m3GKxj2a7oOy4kymRKZ2pxTmhys0Jan3H8WS2v3Z1lNCRg6UH3KUWtHK5TNkjRT3+fK/" - "0PUgKk0sJrTOXZ6jkyMJ2vvgGmprpJLuM5QWZcFokOkgIGBUQBF0ZrwCj85RHSVJIAR9WkJc" - "+b5YWZSt/c69FB0/eY+Wl/3Uv7Gu5HpuI2ZNaVFM9Tm8jyh2r8/np6nb8/TlVzfJ42/IEVbK" - "2Bk1oqCshCQyJQo5LcfL/k+bNkm3KyXmmbQU73vE9FCOqhwFLUCgxeUkk2ea1tR5qbmphpLJ" - "VbaqmBwUzpo1I2m1BeKC4KHRsSl6/d2vKZ4UFeUtXeAcsyZmPDdOEuWZKK2Jcu9P8WdrMGti" - "pm/lgDyQC/JBznzZlfoxolOel0dZAL2pWAEQ4c7M3KV//POLTE+crUi51+ZVDPlZlFYaq6AU" - "Q8qYn4SoIIonSUfK3MOfwZ+ZYGwlU7kVp1j5svykf5Dlg5yQV63SGtGrsgWb6nNEFW8Nfcz5" - "i1fpzbeOUlV2TZmU4aewdhSaEqJ7rMl8PBqjDREvtYY91FAlUK1foGqfIA+EBjIDoeiLtHQ9" - "Eq20lDhrRlFGxiJrMsgnzr6fn1yULyrW56ysMlqRg1e2P/75Lfrpj56ijRvW5/RBfPWQXr3i" - "Hr6qSCYHQ9VxA2ussFFqcXGxoADdne30m5+/TH/5+2cFNQNzIlwI/j+HXAYpXaNn2Z9rWMuJ" - "sFTlw8h0mgywwYdd9JKTENMtEeQss7SUSpvPWMau5c/X8PKhXBgxFsVQgTyQs76uOmcBIYgE" - "OdAPkh6AGO4NyuQY3Umm3OOixPz8PDU1NtCrP36M/vXhdwUCF6tR3JRAiXOsn11kaYmREwZB" - "njRBntTKyIBogJx4SkFQcsVMSkU8DL5XSC1egXxNjXU0OzubIw/fLWdUrwVmzRA5qxQcE02Y" - "MHvlpd105PMbWc8O12M9mtImKxUBNSXZ9/dYlV5ICDI5yymBQilBNmdeeT4H5jFt2rSSI/cz" - "8sgDI4cxhbTMUoI9N5GTf66S8B3Kmx2dZt/5WcYvMbngrU1O3iqoaNnFihn96AUvh4//Y+gh" - "RVoOx82b4/LO6L0Ptslxjhyh57UctXuz3prSAVB6XoqRA63kZO9TxDvcQRAVDkE+eOVLl5mo" - "OuSlnTvb2Kcgy6cGHquIBlqOMsA1F4QqvJNiQJNvX1tLS7EQRZhAsaVETpxT2HKcQ0H+Cvmw" - "ADESFqi/J8TkEWW5ioEPwRjRa4ErXW5ghrO3Q2TETGXPF1B3VZ2fbMt3pTlQbpQfcti1Y8GW" - "pVFo2nNzc0Xvz/5ti8iry7KafHq8WisqmuMzoWpTBnYjHYk7P02eD0fIySpBZWxN1KEfDH76" - "MytyVs2P0hN3PuZ7C6n0fJC8AgdzOX6JZlJRCvhUDotwmCzHW45RgJgwU2hjFXMyoqVNjTy2" - "5mGEsM84oyvKUrOXfS4t0emh07S1w/5NYKUgk+PEGZeqawjY31qnAtBimoIC/eGNo6u6q/zx" - "xUSs8hJtbvPQU1vWuGYNAYevKhAouZPMSih3k6ltWYR+sHiwjv0U8aN1EIV8aSUGPOnk95K8" - "CnRpYYnVLole+8VjqoEgAsfjx4/Lm3Y3b96c8zvkRf5vv/MO9WzYQJ3r1xeUBb87pRvw4utm" - "BcPxVNg7D3dRT6cI4ZH0FByZ47wybFpa29RU8PtyLE5hIUX71geoiZkstI5axkgEJHkFCmRW" - "gGIQ9OvhcVpTlZKfp7a+bJGZLOxa27dvn+pxYpAbY2JNKuUAUD6tu+zylcx1o2fdW85Ou+7u" - "dIB9+P33pc39/bp3kmGhdkN9va4oGEJO3LpFI2fP0p49ewp+/9vn39K3k0kKBkrv96xj5D3a" - "lqSpiTHVMqDmQ1iM9amhvq6OOru6qHfjxqJTz9jAhVbX0tKiWTecnJk7d+Rz3LQCjQPHB2Dh" - "/PMHDqxY4uHhYWn0xg1dK+mxy0AmR0fLwaF4jaxG9m3apPr72NiYXECfhs24wVBIVj7G8dRa" - "L57hZwotNjIcqa6mZqb0tUVaDseFixdp5vZtims8oC9LzsyMrl0GkAXmdWBgYGWXgVHg2MVH" - "9u7VPSyuBVoUEXBgm70WgJja2lo6+umn9OILLxjWsWtdabcq3k5Uth26GK5tOZcuXaJp2Pky" - "vnQIHTz6m97eXqfFVYUryTnGYhMcKjc4OFjWcwj4TjLkt+fhh50WuwCuI+ci84xwqq4du8mU" - "O8mQ76YiHqRTcF2fA1Nm9+F62L2GfN0GUy2HL0638k0aCMS0nEQVjUm0GC2dZ4gFquHg6t4s" - "8rPykHGuD7OnBJsiB+M/iPidwOhElIbOzNP8YvHRiZpqL22/L0Jbe8O2lYsviwLZVSb7S1Pk" - "RGpq5AAUka2dJ6gDfd0hIjFOn/73RtFrHtm1nvp6ShNj9SQbyMF6PgSiZmCKHByJf3dujtZV" - "V1tOjhaF9fXUkc+bpEMfDxf89uL+AerpqtP0HCunTEBMdlxNx9CN6rPM3Nzf3y/gDR8ojJUC" - "6ln03dPVSK++NEjL87eyCf/jey0Lya0EH1ODF4iRZejHzPNMe2stra3y6DQKZBVBepQGAtY0" - "ROiVHz5C0aUZ+RP/a53GsIogPhcjE8NiJ4xim4VpcvB6ksuXL8sFQ7KSIK0JWXZ3ttGvfvai" - "/In/9W69sIIceH3QwYXz5y15bYslQSgOGhoZGZHnPRB1m315g5E9qri+taVJt/doNgzgCwj5" - "3NG3w8PUyfRhBSwJQvHeGBwnjFOn+KykU+sS7LiHg5syyBwOh/GWLfnIYqveo2PZCAHeGwNP" - "BbN4qEGcJHxXbPd0Mdj1ehYj6wK4LLx/wbnakBUtBgsgrHx/jqVjaygY3jyFgcS+vj7Z1YaZ" - "4fPvWk+ztbvV8TxLzffzABPE4FqYMqyFOM/6GJgyV795CuAFPHHihHTxwgV5XQLOHIMgWoIy" - "3trsAlc4n70sdS3WIyDwxhT9xMSELN/+/fvLUpvKXkWVbzucvXu35PUQ+sknnrD9hXo49E5L" - "0Njw//62QyX0CoB1CViqFCvjkcVKgBx05iDGzHx/OeC6+RzA6GYuI6i8m1onjHpSRvOqkKMD" - "Rg9KMoIKOTph5y43txIDuG6auoIVVMhxMSrkuBgVclyMCjkuhivJcWK6wY1wHTnKbZDlRv42" - "P7fBdXGOmW2QepG/zc9tcKX9MLoNUi/yt/k5LXc+XFcgDiPbIPUif5uf2/A/9n+1U7cLqMYA" - "AAAASUVORK5CYII=") - -#---------------------------------------------------------------------- -aero_dock_pane_left = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQKBW/8myz" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAD+tJREFUeNrtXWlsVNcV" - "Pm8Wz9iewTYYbxhjjDFmM4SloKwkipI0QiIhIU2VSlV+VVGrqlX6p5XaRpXa/kilVmqriD/N" - "IqWtQkjSJA2ozdJUQJMGEwwYAwZjDLaxjbHB23iW93q/O3PtWT1vmzevynzS9fO8eXOX893l" - "nHOXJ5ENMT09rfT09FBvby/NBAI5S6fY66XGxkZatGjRnoaGhnfzXW7bY2pqSnnr7beVSz09" - "SiAQUGRZzllA/EgH6fX19T2d77InQ8p3BpJx6vRpxe/z0YoVKyxL88qVKzQxOUltGzfaSh6O" - "fGcgGb2XL9OyZcssTbO+vp6nazfYjpzZYJBcLpelaSI9pGs32I6cAuZRIIdBUZR8ZyEtCuTY" - "GNZ27hpgVW2WJFspaAmwJTkgxsquxq4EfeXJQTpOpzPfRU6Lrzw5aDV2VQhsSQ5gV4FZCVuS" - "Y/WYY9eKUCDHxsg5Od0XLyrXBwdpdnaWxsfHKZvIh4eHeYhEIpYIQHI4yO1y8TQPvPnmgtmD" - "TldeXk4ej4dqamtpdXNzTtW8nJCzf//+1q3btnWNsAKHgkFau24dFbnd5PP5sv724MGDVFZW" - "RqFQKJflngM0Na/XS1VLl9ITe/dmfX5ycpLnbWhoiA4dOqQsraqibVu35oQk08k5deqUcvXa" - "NaqprqYtd9yhKw50aVa1HJGeWogKVlFRQa2trTQwMEB//+ADZXl9PbW1tZlKkqnknDhxQpmZ" - "maGHH3qIHA79niEQY1m3ZlCVrquro5qaGmpvb+fl37Jli2kEmeZb+/LLL5XikhLavn27IWIA" - "CEuWZUsCKoFR5QPlRblRfsjBLJmaQg5mL8PhMK1paTElU0JoWgPGD62/MVMzRPkhB8jDjPhM" - "IaefjTGbN282pYB6gdnTYEjWPItqtsoOOUAeZsAwOcfb25WNGzfm1T9VU1NLvX2D9If9B/gV" - "n/MFyAHygFyMxmWYnJGRET4o5gvQmm6OTdKrf/mUvCWV/IrPuJ8vQB6Qi1EYIufcuXPKqqam" - "vAkBBAzdCNArb7RTib96LuAz7ueTIMgF8jEShyFyrjNDbCkz3vIBv99P/UNhev9fg+T1VaUE" - "3Mf3eC4fqGRygdfBCAzZOZMTE1RcXGx5wUtLS2lorIjauybIW7wk43PtXbO0aY2P6ip93LK3" - "NI9Mrb59+7ahOAyRg+VEbrfb0kIDgUCAGmrLaUmFN+uzxeyRWzdvWZ5HyMXocitD5MAeMXuK" - "t8jj4fYHDDvEnw74fuzmdVUa4q3pzN4G5F3YRkjXbGTKv1rYbspgZWMjDbG+uq62lht0C9kh" - "agoPAjItUhROz/7+fmq0cPmvWtiOnA0bNtDb77zD3fjwWRUVFeUsLXiX4bjsOneOHn/ssXwX" - "PQWmkGO2lf3Ynj1wgdCRI0coMDubs8J7WVe2vKGBp2dmGczq6m3XcgTamJWN8FVGYcVnDmBW" - "KzTccgrz/akwq1vjsQwODv68u+fyC691hmlg0pj6lw21pRJ9a52T7t65I/dSMglnz56lK319" - "3L5SCwh2eGSEqqqqVP9GbINkShHnRWJWrPKNP50mpfVOum+nQqtKJILN72VfQ0+CJeGSov2f" - "lj4QFMO6CLNGBVMsyK4z7Hp5RqF/fiaRo+sY/e27X0v5HTSo02fOcMchVN1cL5WFmr1k8WKu" - "JabDu++9R5s2baJldXWaNEfkG2XQ4t4KMqO1n2mPHR0dtPfxxyXpkyPHlBdv7qBf3qeQj/Ht" - "dMTI4EGKXkWCGgqtiMD+RBSQpVBYjt4LsUh/+LFCzy86RvfeuTPhd0eOHqXKykpqXrXK8Iyq" - "GqAydHd38/+TCers7MRmXl1bIPWQIyC2QTpePh2i+nskKpKjtT3XiLBEXOzP2l0SvXo2MUX4" - "v7AGYf26dXz5EVwguQ4lJSW0evVqGrlxIyWvvUxIVm+BBMQ2SMcN1s1Usz7MyiEdaVV5JELa" - "QqEQIR/r/dFCIzFvRHwIMhvL6i2QgNgGWVClbQxeLVCT5bgrQnwNVmKftbYuJUMA5Ng/8Wp4" - "vhXyZJMgX/kR+eDkwH+IsSDCGHBi7HFElQA5lkMoBYqkQyFQoiQosTTwPzQ4KUupefdmow1N" - "eu04o/ZflBwlLkhR4c0N1bEmo1VUijLfUuRYfPwai1iZe05J/JFJBTNLmEaMbEVnOUTF5ORE" - "WAQhFhxytMVIjmgrigor2mQkjQTNdZNKNP5ip0RT7Aq7x0EKpfP2i4IYnQfRKoiFBCgWOIpn" - "EbLlTwhXiS1c1Jof8XtHVBhxLScmUEWOq+1K4nikJvCWEwtlbqbzX52hSsytSFHDNJM89NY2" - "vRBpKVm+BwJBB10ZCGa1v+I1Pj35SRhzImHiBqIzNuYgbUloAHo0AZrv1sqLJOrqHKaPPp+l" - "J79eS0WLnRRgbMtxmVlIIFZioW4Ntfnm7QgdPXGb2WJual1VlnU9t56KFj/Wxro1oqAcHfjh" - "rpn7OqYI8CtpVAjYDxpKJerrH6MDH/SQ01PN76MShCJxY0+accZqcjKmm9ICWNc8E6ZPPx+h" - "xWVOqqr0UzgcWihiQ2VxCIGFWW2OsL4sjO0XGBPmujmFjxmyhoAM1Xki1HXhKr3wm8PMoJqv" - "YTJLI6LMq9LpgH462SDMdViIOJEfgSAT2CtvfEF914ZZTXekLI4XceopR3xanBwIKyRHSYpQ" - "TLVW5v+PH3vUhMUeBw0MjtDPfvV6quApNubEtZz4jMULxIqQTERCSLknHoy2ipdf/5BGR8e5" - "RZ9cDiFkPflJIAfdDLo1BJAUUkRrigoyIshSEbxs4Dp78iQ994Nfp62JiB8NKZKGnHy0nPia" - "mq41JT6jULz6gFu//eOf6Xz35TktLpkYPfkR4GPOayMKLQmEqMIjURkbwH1MpYLq62EDkJt7" - "qSWuLDhUDjot6zfRS7/7MT3/01dTvuu5LdOVSZneY/WigShhjgQuc2QQnmKr1GloXkgP6SbP" - "1yAPuId8YbpAlotTavr3n3uaystKExYQgijECycughZgmkRog1GFgI1pE0xjK2Kf3JGo1ibF" - "lAHepUmkiZyu8QjdW7uUfvGTZ+jFl44kfDfLIpwOzysE8RC1B1qQVeRkG7DFXqF0+Xn2mQep" - "ckkZjY2NJcQjbCe9O/QSVGli5EwxgRWz4GWkFcXI4FzgOUeUILXkQH/5x3WiR1uW0ws/eoR+" - "/9r5ue/Qpc3ENDZR+HhBxAvECmTqUsR3uIf1c3PeaXbP7XLQU09t59ra0ND1FILnFivqLIfI" - "R4ycCCNHptKIgwIsriIn7B2FT7YJPlwayAEw/rxxOUQbFpfRvkebuJ3DyWHxTrO0QmlU6bnf" - "WrgnNJmMdHmZH0eISoudtGVLLbtKNDDQnzYeYavIOsoRb+BGyZFTFQA55gCN9xxogRxTEL4Y" - "CdP6+iW0IzBB5T4HjYxH5hyt/Lk0Lcfqg4mS04/7cq71YFzylUjU2lRMdUtl3pVlgnDB6ClH" - "iiqda3SOyVTc5KcDw2EamF5Yfc0n0qnSAiBndnqYmutly3YsWDLNN8Oa0H8YMbdCC7tqlOgN" - "SwqeDtm80tDagip3DphR0fK+4jPTlEHe82ID2IqcvAonXbeaZ7LyTk4ytIhDDLxGZk2h8oaY" - "qmzH0wqj5DisXTSNtIQo9LYcYUvAcocdohdhpupinZh/0SLbrCEQcFUyfb2UKVD+IoclBHlY" - "dfC7HTTBSl5RlKqgq20DIAdr244eO5a5+4mbtXSka10xdbeMEdOUZlc41rVl22VnJuJ32nlY" - "pXM9u9FNn5x0Uv097AYzTvyuqG+thAVvzLfm1uhbA2DjhGPebm+EeFweV3R9nJ9VCP8nRHvq" - "pzJmMltXBYHhDDdcH7j//oxW+pkzZ/jCwYaGhpTfw+r/6OOPqbY2/aESSysrVe+yS04bcYug" - "Fgk77RobydW2ds2H67/47MG/du6klTsUWsMMrXLGhJ+Rwv4ljxR157glbV0fJ4ZdZ5Wou2aS" - "XW8zknrYjdP/JWq99Rltf6At4TfIGPp/CC7bumQ8gxWZKDxqeLoxAxuvbty4QTt37ky76xuG" - "5PT0NG+B6YCVoNjAhV121dXVqtdKC3KCzDbCcl614DvtBgf5Trsn9u6NVs+bDMdPn6346zmZ" - "rk/ltvlWemR6dNk0rd+8kcrSNMVr167x8w1cKgZoLxM4CMWa5HTdDuJwM4Fm8gz7Skupigkd" - "LWQhXOjuplFGclDlAX2CnNHRUU27DFCWhuXLsXA+usvAiKBx7OKu++7T7BZXAzWCKMrDNns1" - "ADFoMYcOH6Z9Tz6pW8a2U6UF7Cp4K1FYK21j2LblXLx4kW/LUOvL0gMM8Bhvmpub813ctLAl" - "OdhAhUPltm7dmtNzCMROMqR391135bvYKbAdOdhlhlN1rXihHojHiSEwUJEuVGc7wXZjDroy" - "qw/Xw+61dDvb8g1DLQeGoFiqapZHGYaYmpOoAsyYnQpkT7OYWdEl3oW1WaRn5iHjQh5G97Qa" - "Isdj0OloBH2DAWrvnKCJqcxz9P5SJ7Wt8dH65hLL8iWWRYFsj8Hx0hA5Pr+fG6CwbK1ekNHS" - "WEwkB+nwv69mfGbXtuXU0pSdGLPnkUDO1NSUJtdNOhgiB0fij9+6RctKS00nR43AWprKyOUM" - "04H3O1K+27d7EzWtKFMVj5m76IRDdfTmTU2um7RxGflxa2urhDd8IDNmFlDL0tWmFUvo2ae2" - "0szE9bmAz7ivZjmsmRA+NWiB8CxDPkbiM6ytVdfU8GNEkCGzCNIiNBCwuMJH3/7mLgpMj/Ir" - "PqudfzGLoPjJP9hO8GIbhWFy8HqSS5cu8YyZeRyKlsXfSLKxoZa+9519/MqXEpu0BUQLOWLq" - "4sL586a8tsUUI3RFQwN1dXXR2rVrudVt9OUN6ZbGZgOer6mu1Kw9GjUDxMQgiIFidLKjI2Vi" - "Ty9MMULx3hgcJ9zb28snrsweg9RC7x5MvRBdGcqM2dbuixf5kcVmvUfHNA8B3hsDTQXHX6EG" - "CZJwT+sKGas2TulZFyDKIsYXzLCirGgxWMtg5vtzTPWtIWN48xQciS0tLVzVRjcj5t/VnmZr" - "dasTaWab7xcGJogR0+M4wPU8G2PQldn6zVOAyODx48eV7gsX+Am3ONYKBVFjlInWZhWEwMXs" - "ZbZnJyYmuOGNo/AHBwd5+Xbv3p2T2pTzKhr/tsOx8fGsz6PQjzz8sOUv1MOhd2qMxor/97cd" - "xkNrAbAuAYfhzebwyOJ4gBwM5iDGyHx/LmC7+RzAyp1thXdTa4ReTUpvWgVyNECPEaoXBXI0" - "Il/bDu0G201TFzCPAjk2RoEcG6NAjo1RIMfGsCU5djoZN5+wHTlYTiS2+uUaydv87Abb2TmN" - "K1fS0NAQX/UpjtrKFZK3+dkNtuw/Dr71lrK2tdWSF+phFx0mCLHNL9/lTobtMiTQ0dGh9F29" - "qumFQlqRvM3PbvgfnhklmOdyrPoAAAAASUVORK5CYII=") - -#---------------------------------------------------------------------- -aero_dock_pane_right = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQJBxqm5sb" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAD6VJREFUeNrtXVlsVNcZ" - "/mc89oztGWyDd8xgjDEGgx02BSVEkKRK8kCWkkWpIjVKX6pIbdVK6UP7UFWV2r60ah8aRbw0" - "SdUsDSFEJAW60SQCSlIMMXYwqwEb23gBY7zNfnu+O3PG1zN3PHebe2+V+dBhPHfuPcv/nfOf" - "/z/bdZANMTs7K/T19dG1a9doLhDIWTrFHg81NjbSkiVLnvT7/QetLrftMTMzI3xw4IBwpa9P" - "CAQCQiwWy1lA/EgH6fX39z9vddlT4bA6A6k4290t+LxeWrlypWlpXr9+naamp6l940ZbycNp" - "dQZSce3qVVq+fLmpaTY0NIjp2g22IycYCpHL5TI1TaSHdO0G25GTxzzy5DAIgmB1FmSRJ8fG" - "MFe5q4BZtdnhsJWBtgC2JAfEmKlq7ErQ154cpFNQUGB1kWXxtScHrcauBoEtyQHsKjAzYUty" - "zO5z7FoR8uTYGDkn59Lly8LN4WEKBoN0584dyiby0dFRMUSjUVME4HA6qdDlEtPc9/77i2YP" - "Nl15eTm53W6qraujNc3NOTXzckLO3r17W7ds3do7xgocDoVo3fr1VFRYSF6vN+uz+/fvp7Ky" - "MgqHw7ksdxKw1DweD1VXVdHTe/ZkvX96elrM28jICB0+fFioqq6mrVu25IQkw8k5e/asMHDj" - "BtXW1NDmTZs0xQGVZlbL4ekpBa9gFRUV1NraSkNDQ/TXQ4eEFQ0N1N7ebihJhpJz+vRpYW5u" - "jh595BFyOrWPDIEY09SaTlO6vr6eamtrqbOzUyz/5s2bDSPIsLG1M2fOCMUlJbRt2zZdxAAQ" - "ViwWMyWgEug1PlBelBvlhxyMkqkh5GD2MhKJ0NqWFkMyxYWmNqD/UPuMkZYhyg85QB5GxGcI" - "OYOsj7nnnnsMKaBWYPY0FI6pnkU12mSHHCAPI6CbnFOdncLGjRstHZ+qra2ja/3D9Ie9+8RP" - "fLcKkAPkAbnojUs3OWNjY2KnaBVgNd2emKY33/mUPCWV4ie+47pVgDwgF73QRc758+eF1U1N" - "lgkBBIyMB+iN9zqpxFeTDPiO61YSBLlAPnri0EXOTeaIVTHnzQr4fD4aHInQx58Mk8dbnRZw" - "Hb/jPitQyeSCUQc90OXnTE9NUXFxsekFLy0tpZGJIursnSJP8bKM93X2BqljrZfqK72iZ29q" - "HplZfffuXV1x6CIHy4kKCwtNLTQQCATIX1dOyyo8We8tZrdM3p40PY+Qi97lVrrIgT9i9BRv" - "kdst+h9w7BC/HPD7xO2biizEydnMow3IO/eNkK7RyJR/pbDdlMGqxkYaYbq6vq5OdOgW80OU" - "FB4EZFqkyAc9BwcHqdHE5b9KYTtyNmzYQAc+/FAcxseYVVFRUc7SwugyBi57z5+nbz71lNVF" - "T4Mh5BjtZT/15JMYAqFjx45RIBjMWeE9TJWt8PvF9Iwsg1Gq3nYth6OdedkIX2fkV3zmAEa1" - "Qt0tJz/fnw6j1Foylp6eHkHtNj94wGpHCGAdrWR6fv369SaJSj+Onfyc/nwuSsMzua2E9V4n" - "fbvNRZvaN4ozriI52HbX0dFBy+vrVVlHGNwDOWpaTog5ZoPMQurq6qInHn887XdYUN09PWLc" - "MHVzvVQWZvaypUtFK1EOT7z6BQmt99HO7QKtLnEQxkM8LEuQErwslyPeN6jpH+AAwPOKMLHB" - "TQ2xzzn2eXVOoH+cdJCz9wS9+52N5NCzzQ8CrKys1CQUbPXD8EZbW9uC68eOHxfjbF69WveM" - "qhKgMly6dEn8O5Wgz06cpN9O3ke/3CkQ6nGBM0GGGBzxz8S9aqqQwAP7LyqALIEisfi1MIv0" - "R0cF+nHF5+S0YpsfIG71YwRJgfEvrEFoYyoPy48wBJLrUFJSQmvWrKGx8fG0PL55LkYNDzio" - "KBav7blGlCXiYv+t2+Wg17vD5LRimx+ANEPMh+EGBQ9WrPdHC40mRiOkYZypmRqmw8w0d5BW" - "tdshpp03pW0My5xQsXbSQp/AaoNczrDBlZjkE8GR8rtDQ96FDAGIJf7QRY4eH2cxK0xUbzbZ" - "0ISxVfQFUZadAvQ9zrgRIPZBQtw4EBwaDAIhToKQSAN/w4JzSMSZJEeLkAWNzy2IQ/q8tBVZ" - "4NjKpRkTJMERF17SOEg0GbXVSBDmW0osEZ/4mYiY58LFM6Vl7kFgzyhtPeh0k50+axVyLYPH" - "o3ceRA2yrfiMst/CLDhZltysyZQwW3oO9q+QUGgJwtQQlFSTQjz+aMKkht/DpJQkySkVilqo" - "Ieb6UIgCIWfW54xojWrLwNOVFWRC5cC/qWY6bHxgjsoLHfO1XVjYHykJgpAeeFwRYV6BJMnR" - "FBQ8C2LOX5mk46fv0u270QUCSU1b7poZIVO6QDRCooNYVOCgm7eidPDoLbp4bowqipwLCNIT" - "opLACQR09Tmc4kzPulyFNDo+RZ9+PkTOwop0MmSEozkvOrBYuhBYKBYnCMM1k9MR2ndokL5f" - "WUgrl1dQ/4wQ78hVpCdtcYgXrQWf4Vg8njS1piUstkDc4XBS/41ReuO9/1IoMt+HKFGFMUlf" - "ZnbrSYUoPCbJmGSMIBiK0s9/c4R6Lw5QvTu+3jqmMuAf+hve+vB3RIjFW0+qWtOyQp8/l1pQ" - "eP+3bt2h19/657xpQly/ZlaL3BAwc5dBagtKU2tCvEZHZWyUn/3qLRoaHqOlzFJQo8aSVlqK" - "SuNGgWBUy0kVJKyfC5eu0u9efVtiGQvEu13pc6lpW9FyMuWFXwtHE2otQ+N6+Ye/pt4vvyQP" - "65OiMsKWC0lVxtVZQnWGovHAK4LY52AYP6RhjRUGKWdmZtLUQqO/nn7w8vP02h//llZTseaM" - "L1Xi3zmQB8SFkWKzzGkYLEgP6QZk5rL+NCbQskCYCdFFHc70nuW13/+EXJW1dHFS+WYvTlKY" - "NZ0gK2aAfZlhhsdkSCDGMX3E2oyfk6N1J5l0j4sUU1NTVLmsgl564Rv0l4PdC36TqsRU8BqL" - "OM0iJ1v/Fw2z8jDBBZCdlJHIX/z0Baqvq6JPRqOqhm+4+gqLxMTDLEtjJhonJCZtOVr3YEYT" - "m5zkBIm5Hn9DLb343DY68PeBpGWH+7EeTaoSOfjffPOUGZDr8xaAkYNaHYxS0rZ1FxXQK688" - "Rn5mrX08EBGvOVWYa5wcUZXF4nGLJLGoMGcUjkrI0SqMWIaWwzE0NCjujN55bx2d7g3Hna2U" - "liNrvpq4J1QK2XIwSc2wjiEUi48IlHld9PDDTTTlLaN3+kLkYqzwCTil4EYG4kQfE2QXoNow" - "8uBMmNRAsuVoGltbrMYlMDExQfVVS2g2WEzeYgcFZ8ML/By5lmPmopFUQyQNCR9nbE6g8ion" - "3dvhI1ruo5OjEXE4xykda1OITA4o0gHRUam1lmtghrO5IcaIGU2eL5BphMFKLJaXG7Mxevtm" - "hIpW+ah7wpxWbcrSKKioycnJjM8n/45fMKXg2fIih5tzMTo2IhDTbFTsyv2UhuUrPjNNGVie" - "FxvAEnKSQsgwtmYJbKBWU2F5y0mFGvHweSE9s6ZYGxdmpr0dTyt08UKaDdk1BCpqLt/4hEWQ" - "8Ju0IsL6Q6yh8y1ZIp++09wF5UiLVxOXmxUu204yIyHdTSa3ZVFpNUE8WNt2/MSJzH0Vu4eX" - "ySlXAROzoGWMmCaZXeEVRTEqZY/7ipymEORmTcVX6KQpVpxK5na4GletEo+nwt55PsakFBh9" - "RlBDKoiBULFpqSrDalElqgqVCWe44fOhBx9MyzevBD09PeLCQb/fn/Y88v6vo0eprk7+UIk9" - "K2bos54CanggSm7mlPiYheZlAVPVHla9mRypEOlocEL58I2HWeWIy+2Kr4/zMVJ8/yZxzbQL" - "b77Y/8EHgkvDTjJsbFrCap0abx4qaGh4mHp7e2nHjh0LfsMid+h/CC5bPnAPVowi32iBcn0G" - "8jc+Pk7bt2+X3fUNB3l2dlasLHLYtqmD2vpO0rtfbadV9wq0tsRB5YwJH9YSMDLcWDPtAEHq" - "VJ9IDPsMYo00I2iafWKSuI9d6P6CqHXyJG3t2DCvRbq6uoT+gQHZkdlMwC6DivJycYxNKXAo" - "3jLWYlrWrJH9/caNG+L5Bi4FHbSHCRyEYhxPrvUijkJGMkbP5eAtLaXqmpqMLRhAi/zPmW46" - "NFhC48HcKrfaUic93+qkbe1t4omIuiwBHLu4a+fOjIXXg5CCkwqLLNhmrwRozdAoh48coWef" - "eUazjG1nSnPYVfBmIr9W2sawbcu5fPmyuC1DywytUsDoQH/T3NxsdXFlYUtysIEKh8pt2bIl" - "p+cQ8F12SG/H/fdbXew02I4c7DLDqbpmvFAPxOPEEDioSHdNBgvSKtiuz4EqM/twPezsk9vZ" - "ZjV0tRy+ON3IN2lglELJSVQB5rDNBLKnWcw8xRLP4tYs0jPykHEuD717WnWR49Y56KgH/cMB" - "6vxqiqZmMo9O+EoLqH2tl9qaS0zLF4jhy63cOvtLXeR4fT7RAYWXbvaCjJbGYqJYiI58NpDx" - "nl1bV1BLU3ZijJ7HATlYzwdHVA90kYMj8e9MTtLy0lLDyVEisJamMnIVRGjfx11pvz27u4Oa" - "VpYpisfIKRM+oHrr9m2qrq7WF5eeh1tbWx14wwcyY2QB1SylbVq5jF56bgvNTd1MBnzHdSXL" - "eo0EP9sNViDOcIN89MSn21qrqa2l0bExMUNGEaRGaCBgaYWXXvzWLgrM3hI/8V3pNIZRBEkn" - "/+A71TCtohe6ycHrSa5cuSJmzMjjUNQsRkeSjf46+t53nxU/8d2oLSBqyOFTFxcvXDDktS2G" - "OKE4aAjzM+vWrRO9br0vb8i2UFEOuL+2plK19ajXDeATgyAGhtGXXV1pE3taYYgTivfG4Dhh" - "nDqFiSuj+yCl0LpqVSu4KkOZMdt66fJl8chio96jY9gIAd4bA0vl3LlzYg3iJOGa2hUyZm2c" - "0rJmgpeF9y+YYUVZ0WKwlsHI9+cYOraGjOHNUxhIbGlpEU1tqBl+yq3S02zNbnU8zWxnAHEH" - "E8Tw6XGshbjA+hioMlu/eQrgGTx16pRw6eJFcV0CzmRDQZQ4Zby1mQUucD57me1e7D2C440p" - "+uHhYbF8u3fvzkltynkVlb7tcOLOnaz3o9CPPfqo6S/UO/jRR4qcxor/97cdSqG2AFiXgMPw" - "gjk8slgKkIPOHMTome/PBWw3nwOYubMt/25qldBqSWlNK0+OCmhxQrUiT45KWLXt0G6w3TR1" - "HvPIk2Nj5MmxMfLk2Bh5cmwMW5Jjl5NxrYbtyJFug8w1pFsg9S5jygVs5+fo2QapFgteqNfY" - "aHXR02BL/YFtkOtaW015oR520WGC8Ok9e2wnC9tliEPLNki1QKvxr1hBHR0dtpTD/wDriTgZ" - "SBhbDwAAAABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_dock_pane_top = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQKSNpU8hr" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAEFhJREFUeNrtXWlsXNUV" - "Pm8W22OPYzu24yXxEscxzk621kDaAGVTFVqxCoRaxJ9WlSr6j1+V2p+tVLX9U1URUlNVXdgK" - "EhRCgYKgSShtFpw4qx3I6iReEie2x57tvZ7vzVz7eebNzNtm3kPyJ109+828e885313Oucsb" - "iTyISCSiHDzyOf3peIKGp+SildMa9tH31wVoZXvbi21tbT9wW+9MSG4LkInp6Wnl8Rc/J2XN" - "nXRfn0JdIYlCfL+MJS3ja4Cvfr76DOancEoi8R8Jvkb5OsvXKU6DEYU+/UQi3xcHaPdj7S8x" - "QU+7rb8WAbcFyMR/j/STtKqPfnFHkqoUifxszYAPZPDfTIwkpWqUmVoFgtD+ZAVJoQSI4hvb" - "JYUeu8dHL8z00dD5z57ir3iKHKMVsGTYcyxOnTskKkumjFpMgKRgUqa6h1Lleg2eI2dsRqGm" - "ComKN9IsBMppDfnUcr0Gz5GziHl4bswBUJuVHAmQyFyXp+j8LcYhtbxSNVOT8GTLwcCtKGlC" - "cE0bT0kzZLYDUpSFSc7436vwZMsBGXE2mo+vki/loamMpK+Skr5nEHKa0KQiPLa0ay0vbEFe" - "gyfJgbsrswVlad6YPjajTCk/WnWlTdR4lQC1lShz+Qm3mtSy/G6rrAtvkiOn3Fw/SEmnpOZz" - "lRwTLUd0ZSIYVVtNOikWuslSwZPkoLtJLqjhCwNPswOldvyaD0ZTZah5erRf8yQ5MFxc03Ik" - "zXiDq3oxUd0XEJJulXE5lZBfwqNNx5PkJLj/iSdT82gQEC1lriuT0/9bcQjSLVJc0ULVLBdb" - "jnGkxgSFr0gStyApVfPF6CCZdwiSmi5NzRctSE5l4lFuik/O4NCQcvXKFYpGozQxMVFw8N1z" - "gY2WSNVqdezxpQyrOgWa6NNnsuVox5lk2jlIpLtM0XJefe21vOKhyNraWiovL6fmlhZa3d1d" - "1Fn9opCze/fu3q3btp0cHRmheCxGa9aupbJgkMLhcMFn9/z2E3rpukJN3K8tLZeoOihRlV+i" - "CvZ2y5iooC81O+03YRYxCx1jdqJ8neYbk3GiGzE45xL9jfPayd977NFHC+Y1NTVF8Xicrl27" - "Rnv37lUaly2jbVu3FoUkx8k5evSocvHSJWpuaqItmzdbymOWW84UG66cI1AI6FfdLYkUf8rj" - "MkOO6NJATpTJmeUmM8PkRNjjmI4paqwTjyeNZcYQFayuro56e3tpeHiY3n7nHaVtxQrauHGj" - "oyQ5Ss7hw4eVmZkZevCBB8jnsz4zFOVaHWGCKlm6crYbNx61GxNdGRwF2SQ58MxinFc0nWaS" - "qTJAdtI4N1lobW2l5uZmOnTokKr/li1bHCPIsbm1I0eOKKHKStq+fbstYlRwTZ7mqj7Do/Ys" - "J9T4WDKV4rL5pD7LA4varaXzRIpwGRG+2iFHNSLrC72hP+zglE0dIefosWNKgkfx23p6nJEq" - "keraoolUbVdTOi5BDyScBW2C9xXmJpaU9T9X3XNZ04I0ZZBNcgSgP+wAeziRnyPkXOYx5vbb" - "b3dGwzRkTVIKJHR33+0I0IrpS+rVJxV+Rpu/k4AdYA8nYJucg4cOKRs2bCC/353JQzgG326V" - "6PjJL+gnL/xaveJ/M96co/KwHWAP2MVuXrbJGR0dVQdFt7BxaYCuXJugn//yVaqsblWv+B/3" - "3QLsAbvYhS1yTp06pazq6nLNCJvrAzR58Sr97FfvU3Vdx1zC/7iPz90C7AL72MnDFjlXORBr" - "bGx0RfmeGj9dPzdOL77yBYVr27MS7uPz2/h7bvRwDWyXEQ7C7cBW1ZqanKRQKFRyxTurfRQd" - "jtAHn82oXVku4PNvJqepu62KTtxIlFTGKnarb926ZSsPW+REYzEKBoPOa+bL36SvRhS6t6uK" - "WpsqC2YVrpToo7HcvnKxNlHALrCPHdgiR+bATjIzd28ADSGJqhCzlPlyGm6Wg8qP2eAhA9LP" - "jKema/RQwc9XBX1UnS7Xacg21yI8t2Tw3PoAfXTMT8u/wcbnCh8OSBxcEoXYNy73pyY+A+m5" - "tYQB3bGVd0mZxMGnRBWyQuX8fNCnUJlfoUbmrIpJqd8r0fc2e84U3iNn51130LqDn9Kfj/fR" - "mq8ptLrSR7VMSpjJCLGhy/mKjjRgYm4NDSfGCZs6p5nQCU7XufWdmeUAeh9Rr/wf+taOO9xW" - "PQuOkKM4vPnr7ef76P1/H6CX35NpKFK8NeTVPB79tNdH9z9zp6M6ONXVe67lCNz/jTs5uS2F" - "u/Dkjs+vOpxqhbZbDgRxulv7qsOpbm0ul4GBAeXcuXM0Mztr+GFEwGZnCCoqKqijvZ3Wrl1b" - "IlPZx4kTJ+j8hQs0a8I2MOzI6CgtW7bM8DMhtk1nZyetX79eEnnQ62+8oWzatImWt7ZSWVmZ" - "4cwwuQdyzLScGAdml4eHqb+/n77z8MNZn2N9/tjAgJo3ZnidjqMyEQgEqH7pUhhE9/M333qL" - "rNgGcgv7WLHNo488IklYGKoOh6mjo8O0Yii8oaHBklHOnz+vTm+sW7duwf19+/ereXavWmV/" - "RdUAUBkGBwfVvzMJOn78OC1ZssSSbayQo7XN5NQU+c59+SUtX7686EbIxIoVK+gcC6EFdrZg" - "D8I67vKw/QhTIMVOlZWVtHr1ahodG8uSEfK5ZhvmJYD5HzTtUgNlxqLRBV0i/nZjBhktNJlI" - "ZHXPkM8t24CXRVfaw3AtCFVdcFoYE7jtkGe2HLfkEXLYIsdOjJPPC1O7tyJ7aWb1LOVzAnPk" - "WMlIsfhcTgUyxp9SQ69MOxXQqn1ExQwIAaysPSj8jFHhMeiK76JwvZYh8rG7DmLWEPnk19pG" - "yF1IPqEb7GNWF61tfFqjmIUZYs4Px2g25iv4nBOt0awOotx8nwOQH3oUir+EfpZ6I81zgcwb" - "pjKiwoZElH/q7E06fDJOO7++lFrqKct9zmeQUiJft4bafP1WkvYfvsWxWJB6V9VQssA+XisV" - "Tduj2BpzxBiR69lAIEgjY5P08WfD5AvWLVBWSZ9k1iOq1OTkLDerBUg0PZNgfUZpaY2fljVU" - "UyIRz5exLV3mujUrSU73qXpJknx04dII/fGV/1FMs55spJXKmrGsVCkfcUIeAegDvaAf9MzU" - "XWsfKzYVZfm0AphNuQRAhDs+PkF7/vLBgrPkipJRETIqhhg8rcpjJWUSkU++OX7SR7OhH/SE" - "vnqV1ooe2hZsu+VkCoA+8/Tgl/Sb3/1V4xkrJIbdzNqhV3tL2XJyyaK9N/+deT1EZYOe0Fd4" - "cYUqrhF5BNQxB1PVMQt7rDBJOT09ndUtdLa30vM/eop+/4d/ZtUMrImIgVT8P9ddsAyKetIs" - "XjJ3Gp4XykO5mes1Qj7IheUCWQ5l6QM9a2uqFmwgBFHIF/ZBMgM4UMIbVMmBsQp5HnoQz2WS" - "Mzk5SQ31dfTcM/fRy28ey1I4sw8XELUHeZaKHCPjXy55oF9DfQ3duHFjQT4idrJq1yxX2hI5" - "eQTHWkb7imZ69snt9MZ7F+c8O3wfB4y0TV9rCK1BSoFcXYr4DPcg79zsNN8LBnz0JOsFb+3a" - "tatZBIMctICkRT2EHAE7xpBztByB4eHLVFNTw/FNixrnKEp2y9F71mqNs4tcsszLjE2Iftqy" - "pUXdjAj99CBiFdmCHtoA114QmqPGaYEm39q4hCLREIVZoWgkviDO0Ws5pdw0kumIZHw4px/G" - "Jey77u0KsT6yqlcuiCkYK3pkudLFBlY4u1fITMyIqqQwSrar6u6igZ4rLQC5IT/0gD6lQEm2" - "RqFp37x5M+fzc3+nbpRE8UKy6Olnxqt1oqK5vuMz15KB67J4AK6QM2eEHHNrrkCvB3CZLNdb" - "TibMmEMMvHZWTeHyxtlVdus0eD4EhJKlhtYh0N4zChFLIHJHHGIVCR4PsU+sesmSrPLd7uQC" - "5awcBmz416WIyucCNC5T78ii0WqCfLC3bf+BA7m7H82qpU+vAqbd3RompkvnVDjkc8s24CXQ" - "uXKl+noqnJ0Xc0xGgagZyYzgKBxGxduWGnPsFjXSVcFgeIcbrvfec0/OKH1gYEDdONje3p71" - "PGT/14cfUktLi24ZkO/ayAi18ucJnX1t+YwsbGNm3xvkxV7yy5cvq3umAxs3bJD+/vrrCjLB" - "24/M7AeeZeNgu6qZKBhKDl+5QidPnqQdO3Ys+AyCof+H4QrJge9gRybkRg3XGzMg39jYGPX1" - "9eme+kYgGYlE1MqiB+wE3bdvHwW5jKamJsO2EeTEuLLDPkaBxqHa5tQpvPttvnr29/crFy5e" - "NLWTHqcM6mpr1Tkko8BL8eq5Rvaw4nq4dOmS+n6DgIEBuoINDkIxj6fXepFHkA2aa2Y4XFVF" - "y9jojQX2e58ZHKRxJjkWN/ZLIYKc8fFxU6cMoEt7Wxs2zs+fMrAKvHbx7p07TU+LG4ERQ5QV" - "45i9AwAxaDF7332Xnnj8ccs29pwrLeBVw5cSi3ulPQzPtpyhoSH1WIaVFVqjwACP8aa7u9tt" - "dXXhSXJwgAovldu6dasp79EsxEkylLfjrrvcVjsLniMHp8zwVl0rp8nMAsSv5HgCASrKXZ3D" - "g3QLnhtz0JWV+uV6OL2md7LNbdhqOWJzeqHN4GaAQMzIm6hmowpNzxYuM1QuUWVFfm8W5cUN" - "xjBGIOxh90yrLXLKbU462sGFK7N06PgkTU7nnp2orvLTxtvCtK678Ku/nILYFgWyy22Ol7bI" - "CVdXqwEoIttSb8jo6QwRyTF695OLOb9z97Y26ukqTIzT60ggB/v5zEzd6MEWOXgl/sTNm7S8" - "qspxcowYrKerhgL+BL36j/6sz57YtYm6OmoM5ePkkomYUB2/ft3U1I1uXnYe7u3tlfALHxDG" - "SQXNbF3t6qin557cSjOTV+cS/sd9I9thnYSYU4MXiJll2MdOfra9tabmZvU1IhDIKYLMGA0E" - "LK0L07NP302zkXH1iv+NLmM4RZB28Q+xE2ax7cI2Ofh5krNnz6qCOfk6FDObv1FkZ3sL/fiH" - "T6hX/O/UERAz5IilizOnTzvysy2OBKF40RDWZ9asWaNG3fl2gRolxuzKI77f3NRg2nu0GwaI" - "hUEQA8fo8/7+rIU9q3AkCMXvxlSxU4C3TmHhyukxyCis7lq1CtGVQWestg4ODamvLHbqd3Qc" - "myHA78bAU8Hrr1CDBEm4Z3aHTKkOTlnZFyB0EeMLVlihK1oM9jI4+fs5js6tQTD88hQmEnt6" - "elRXG92MWH83Ygy7W52sQJRZaL1fBJggRiyPYy/EaR5j0JV5+penACHgwYMHlcEzZ9R9CXit" - "FRQxEpSJ1lYqCIOL1ctC38XZIwTeWKK/wmEE9Nu1a1dRalPRq6j21w5vTEwU/D6UfujBBx2d" - "68oHseMFL70zEjTWfdV/7VALswpgXwJehgcySwGQg8EcxNhZ7y8GPLeeA5TyZJuTM+pOw7Pk" - "lOpMaK7zqV6AJ8mxEoRaxSI5JuHWsUOvwXPL1IuYxyI5HsYiOR7GIjkexiI5HoYnyfHSm3Hd" - "hOfI0R6DLDYyj/l5DZ6Lc+wcgzSLzGN+XoMn+w8cg1zT22v6GKRZgHycosMCIY75ua13Jjwn" - "kICVY5BmkXnMz2v4P+EM9joepX/9AAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_down = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo1MTo0MyArMDEwMMndnrAAAAAHdElNRQfZAxkQNALaVrQp" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAhJJREFUeNrtl01v2kAQ" - "ht81FgECjUQUyeKjBrfi0EOJktxzg0uOSaWe0lNP/Wk99lBy7A+oSiO1ORE+BChSTjGfBuPs" - "rATCNSkmyHtpX2ll2czOs+OdWTMMXIPBwKnVaqjX6xiORghK0UgEuVwOhmEgFosx1u/3ncrV" - "FYrFItKpFMLhcGBwy7LQ7nRQrVZRLpXAfl5fO4l4HLquBwb9U41GA2avB6V+e4t0Oi0NTMpk" - "MiCuOuavQlXVtRNGFs+NobPWLhphiO783YZ4gut3tc3OEN9/9fDQt5+0ebEbwttCHG9eR335" - "9A0v5LhDx0LlW+tJm6OTLAr59WDHcTaDiwXk96AqNj5/+eH57fzsEIa+t4k7KMur8TMMPYkP" - "744xMO8Wg+7puZ/5HrhfMI3ZbIb9ZByX708xHt6LK93Tc78+XHu+alXrlNdT+PTxgpepBtu2" - "fc8nu1AotB18Op1C0w7EdRMxxrwJtyn8uXOW9ezIt5ErctlwT+SUrTKkKIo7cvrUTSYTKXDK" - "dEo6V+RULrLkipxeuSy4p9QILmvP5yfhAi4z4VbCZZXaMkfZws/W+g//R+Hz4046fIe3R3S6" - "0YEftChIOtuJR1zRLvHiQ4r3afRxCbLeCRzhzWK73Rb/gNRXvGP8WqmILkLTtEAbRQqu0+3i" - "980NyuUyxGabpila5GarhVGALTJF/TKbFS1yIpFgj6VqglrJraorAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_down_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo1NDo1OSArMDEwMEcuCiQAAAAHdElNRQfZAxkQNxVyqGIt" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAABENJREFUeNrtV02IHEUU" - "/qq6529nFnezLtGNEEk0O5NZI4GoQaLxoCJ4NgjBgAe9K/5c9SToQbx6UaJgQLyJXgIRDUkk" - "t+iS1YDgwSWHMGOyO7Mz0z/l97qqZ3vGnd0ZYb1oDY9XXT39vve+eu9VtwJHo9H4+ufrK8+f" - "XQ6xuh5jt8ZCReNM3Ue9uvjl3NzcKUXgH06fvX7C1B7H08cNDpQUSvxjXlGofWqPWo8JYCiR" - "CCchdZe6Q71OudE2uPy9gv7tEj57qXpeXbh4yXzQfAzvnTQoGwWPKL4WMM4JrERgZdwhDgh/" - "sRExCMURLhjOu1rjrW8M3tz3I/QnPwW4/4RCPrIPjRpaWad2Er2Nl+JELoox+xwguP6tDYOD" - "RYW4sz1wnjzeaW3nnh2VKQXDvYpH/FUYWShpLBPXH4fGPCNaudHC+ctNNG6HI/+35y4fTx6b" - "wZGlaYTRznb91BszQmR0aKhWrUDo+fSrX0YaO/XsImqHp9HK+GcyOq2jOM6CG0kGByhabmo7" - "ly1kHqJNg/X6PF7xAnz48Xd/A37t1adwqDqP9cAM2jIZ+0NbkVSQgAUuI6VE0lLpZ2xs9Z2e" - "waHFBbz7xjNYa/7eF7mWdbkfG/QlGpqL/SDeZEDbyPlQbKx2YuhRMocTt367F+PevTN45+0X" - "0F5bTbRcy3r/WQzZyNplJIO0x7YMPIp2ks2XpM4zJXQr9FCvHcBH77+OBw7ux83OYJmmVKcM" - "JlE7SbekD57SnaUs21iGu5s8vLoBzNy3P9HDI7vnm83GYqg0w7MJF2QiV8YhO52oLep2Y0Q5" - "DQA6VgO332IvNNnIaSSIbB/3XaR9qmN3PUF/jV3kUZrA8WbCqeFSs3tiqEXY043tUHG6O2rr" - "yEcNM1QtiV1hwLW9NNtt5KH1Ktl7bR9Mki6lHtv37K0iz+5zWr6h29KByM81DPaS9z0Fhemc" - "QpnHWdGzbTWn7enmTQCenmI9onepW1xYC4Amy1Hx9wVtnUzBO4x8nTcKSicLXpKuPCA8m7GT" - "gKeUC3iX4NKaNwjeZka3erbWgyDajLwb2PY5xasC1xl8QnNKtSRiPCG4ZHaPtrpOpDIEQ4KJ" - "ogztkuotulrmYpEbnReqo836NhOCJ22UKD2JPpLorbRDY50bAA8t9V1Kj1T3tHt9cm8xySEz" - "IXjax/sMOIxkDIDDlQV2Pl7HAd9KUtvZMe574a6M/8H/q+D63/Mii+Pfzc+jMmugwka+2w4U" - "WdjlnMY054Lrv/xQDheuedj3RIQSi7/C7lLJASV2mIJnDxb/H/T2gC2xyN5e4PM5HpF5vqnM" - "c71M0LlvFc4c9eEfXTq8Ur96pfr58nHUHjV4cEpjhqAVgvHDgocNHYDteOOCy6nGMwT8KEGL" - "rP5JadCjX/mu98dFoBpfwbGHl2z3bDab5uq1ZZxbiXGztXufyPeUNV6sajxypI7Z2Vn1F7X+" - "m7ZM/KBNAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_down_focus_single = aero_down_focus - -#---------------------------------------------------------------------- -aero_down_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo1MTo0MyArMDEwMMndnrAAAAAHdElNRQfZAxkQNALaVrQp" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAhJJREFUeNrtl01v2kAQ" - "ht81FgECjUQUyeKjBrfi0EOJktxzg0uOSaWe0lNP/Wk99lBy7A+oSiO1ORE+BChSTjGfBuPs" - "rATCNSkmyHtpX2ll2czOs+OdWTMMXIPBwKnVaqjX6xiORghK0UgEuVwOhmEgFosx1u/3ncrV" - "FYrFItKpFMLhcGBwy7LQ7nRQrVZRLpXAfl5fO4l4HLquBwb9U41GA2avB6V+e4t0Oi0NTMpk" - "MiCuOuavQlXVtRNGFs+NobPWLhphiO783YZ4gut3tc3OEN9/9fDQt5+0ebEbwttCHG9eR335" - "9A0v5LhDx0LlW+tJm6OTLAr59WDHcTaDiwXk96AqNj5/+eH57fzsEIa+t4k7KMur8TMMPYkP" - "744xMO8Wg+7puZ/5HrhfMI3ZbIb9ZByX708xHt6LK93Tc78+XHu+alXrlNdT+PTxgpepBtu2" - "fc8nu1AotB18Op1C0w7EdRMxxrwJtyn8uXOW9ezIt5ErctlwT+SUrTKkKIo7cvrUTSYTKXDK" - "dEo6V+RULrLkipxeuSy4p9QILmvP5yfhAi4z4VbCZZXaMkfZws/W+g//R+Hz4046fIe3R3S6" - "0YEftChIOtuJR1zRLvHiQ4r3afRxCbLeCRzhzWK73Rb/gNRXvGP8WqmILkLTtEAbRQqu0+3i" - "980NyuUyxGabpila5GarhVGALTJF/TKbFS1yIpFgj6VqglrJraorAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_left = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo0NDo0MCArMDEwMN+SkKkAAAAHdElNRQfZAxkQMBKjjWFJ" - "AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAABGdBTUEAALGPC/xhBQAAAkJJREFUeNrtV02P0lAU" - "PS2lUEIlkxlHpCAEZ89Ol27M8A/czMK4duO/caeJiSZu3SgTN25M3DhBFkMmDhQJEK0apnwM" - "0wK1t+Z1YOqyr2w8yWuT95qcc9+97/UeAS6m06nTarWg6zrOZzPwhJJMolQqoVwuI5VKCcJk" - "MnFqh4eoVCrQcjnIssxVgGVZ6PX7qNfrqO7vQ/jSaDhqOo1isciV+Co6nQ5G4zFEvd2GpmmR" - "khPy+TyIW7xwt0SSpMgFECdxi5EzX8HGBDiOs1kBDH7ymaKoIAjCpQAiXy6XXAlFUfR4aBA5" - "EyBGET2R630LM+tvxpmQNQG8BpE3T8/w8cjEb3MREMe1BuLxOL4bY3z4NIAob/nzq1x+DYQt" - "IBaLodM18PpNA0p6Fwn5kpzqjXZmTUCYRUiR//x1hucv3yOl3lhbY4Gyd+g7QJGffG3jxau3" - "SCg7gXUWLH3nC6BfJI2wUC4V8OTxAZ4+qwXWiGexWPgp8J40EeYwTRM72xk8OrgfEMC+CRzD" - "sEUYhoFi4ToePriDuBTzBdD20zqrOWl1Mmz0ej1kMhncu3sTn5u2XwORHEOG4XAIbfcazm0F" - "aUXExdQO3oS8MXZbrz1t6ZL/gG3ba2uRtEKUYirMf2Hj/cB/AZ4A1hxsREDCdUKrVyNvULD0" - "HyBO4vackXsokXNtGR0R3t0RkSddf0iX1Hw+h3TbNYnvajXPKGSzWe7ekILsDwY4bjZRrVbh" - "JX80Gnnu+Fu3ixlnd0zR3yoUPHesqqrwB18A5ik1mQXQAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_left_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo0NjozNCArMDEwMCXtbZ4AAAAHdElNRQfZAxkQLw561jOY" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAABAVJREFUeNrtV02IHEUY" - "fVXTO70/M+yOExNd4oIRkgljDIiyQZR4FD0rQlDw6E1RDwkoIqiHXLzlKK4Iwb2peFDJHgxx" - "dS+LcTMhhw0qJkvG7Jjsz8xOd1f5qqu6p9eNMB2Y9WLBm6+nf+p79X2vvqoSYFtdXf3ql8bl" - "52aWQlxbVxhkmyxJvFz3UK8dmq1Wqy8IOv/+xEzjSV17AsePaTw0KjDCF4cFUKQtEB6vJSz6" - "bWYYERFqoEvbpW3TXm1rfDsvIBsX8OlLte/E3PkL+vTqNN4/rlGCQEE6hzGEta5TkYOATsCf" - "SBtCGqGy9wJ2+vo5jbcqP0J+fDHA/qcEisqyHnSL6MTjz+GnBYxv+SdDso/x1rvgPBudvb6A" - "8Z0nrQNpXsJIZaxBNt/a/c8bJf0vME3pDAGlbG4ieikYLUgrPOV6MULU4i5EqK0j7XyYazMz" - "RGYkXsImhbAvpIJ0Q8/jHM55MmLl+out6hFMCUR8OyCksiMX0kYj7gV26CInCZVxbvofKQhs" - "0Jq6IPkkISKTFKQRcB9plWGtt+ujH8QRcBgfEmj+3sYe1hVTY0J3PyUQhYiLhHkQa8Hlalvo" - "7hITRYErl5r44txNrNyMUGQkEpKZFLBUKiu2AjKhduKLLXKKkB9MjQn89kcLs18vo+Dvi++b" - "gQZRTwtecjMk3UiaHAlb97VlGidfO2306dy8N+krNK5cx+kz51GamMKo77TB3Ea6Nw1lEoFA" - "WSKR00SaBpU/Dff4EteuN/HOB5/dUZyh01hKwITEpMDAEAl0EpV/6KIPDDPHlxYX8eprH94x" - "Oqb/bmT7TFMw09SodgJUWJ/HKZoSpWqmjU9BDMWrI1dJt0L20w7Wj+LMRyfxxtuf7Hi2fFvh" - "V+45vuTYp9IUBMAaZ8IGmW0SbaKjLLZULzr9ovFXhMn778V7p07sIGD62wyxvQ6ABDZC+6BD" - "bEUWXYdA5UOH33yzAhw++ADeffMZ+MVCSsD013YzIUMgIgHFkWt+TFBJW6TYpQ2IxOaB6efz" - "qwHWS+N4/tkDGC95lgCfbdJXkNUA1E7RKbcoZStknqacKBeaIer7q5jurGGC+8Em05Msfr0I" - "DLgttRRGDpQxe4Ob3s3tQ/F2g4BJ7Q90fivYuaP4z3dE/xOQye9uMjG+ksrg7RkRGKMwy0W5" - "KyR8yr7M+r5GPRrf3itHhjC3WODhJILPyVv27FowSgy7tWAo51pgmqkBoVtlhyPEffmePX+U" - "6bg8h/iM6D16pH6jvjC/9+zSMTw4rXGIZ8MJeivTMS/hmzOiMCTypSl2Trulbeldp71NIsu8" - "cfEnoHZrHo8dfdjuMVqtll74eQlnLyusbAz2gHbfmMSLNYnHH6mjUqmIvwGdqbciWIcx6wAA" - "AABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_left_focus_single = aero_left_focus - -#---------------------------------------------------------------------- -aero_left_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo0NDo0MCArMDEwMN+SkKkAAAAHdElNRQfZAxkQMBKjjWFJ" - "AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAABGdBTUEAALGPC/xhBQAAAkJJREFUeNrtV02P0lAU" - "PS2lUEIlkxlHpCAEZ89Ol27M8A/czMK4duO/caeJiSZu3SgTN25M3DhBFkMmDhQJEK0apnwM" - "0wK1t+Z1YOqyr2w8yWuT95qcc9+97/UeAS6m06nTarWg6zrOZzPwhJJMolQqoVwuI5VKCcJk" - "MnFqh4eoVCrQcjnIssxVgGVZ6PX7qNfrqO7vQ/jSaDhqOo1isciV+Co6nQ5G4zFEvd2GpmmR" - "khPy+TyIW7xwt0SSpMgFECdxi5EzX8HGBDiOs1kBDH7ymaKoIAjCpQAiXy6XXAlFUfR4aBA5" - "EyBGET2R630LM+tvxpmQNQG8BpE3T8/w8cjEb3MREMe1BuLxOL4bY3z4NIAob/nzq1x+DYQt" - "IBaLodM18PpNA0p6Fwn5kpzqjXZmTUCYRUiR//x1hucv3yOl3lhbY4Gyd+g7QJGffG3jxau3" - "SCg7gXUWLH3nC6BfJI2wUC4V8OTxAZ4+qwXWiGexWPgp8J40EeYwTRM72xk8OrgfEMC+CRzD" - "sEUYhoFi4ToePriDuBTzBdD20zqrOWl1Mmz0ej1kMhncu3sTn5u2XwORHEOG4XAIbfcazm0F" - "aUXExdQO3oS8MXZbrz1t6ZL/gG3ba2uRtEKUYirMf2Hj/cB/AZ4A1hxsREDCdUKrVyNvULD0" - "HyBO4vackXsokXNtGR0R3t0RkSddf0iX1Hw+h3TbNYnvajXPKGSzWe7ekILsDwY4bjZRrVbh" - "JX80Gnnu+Fu3ixlnd0zR3yoUPHesqqrwB18A5ik1mQXQAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_right = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo0NToxOCArMDEwMEtfu5QAAAAHdElNRQfZAxkQLyM/CW/t" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAkpJREFUeNrtVz2PEkEY" - "fnbZQ+AgGD+R5YSAxVkRLfwF5vgH11xlbeNPsbE2Ftf4C+RiY2OijeGu8GIusEjgiJ4Ej689" - "YHedd8zgsBgt3Fkan+TNZnY3eZ55v2ZeDQzj8dir1+uwLAsT24ZKxGMxFAoFFItFJBIJTRuN" - "Rl714ADlchlmNotoNKpUwHQ6RbvTQa1WQ2VnB9rh0ZGXSiaRz+eVEvvRbDYxGA6hW40GTNMM" - "lZyQy+VA3PoFc4lhGKELIE7i1kNn9mFtAjzPW68AgUXwhaKwoGnaLwFE7rru4gOZWKsiFwJ0" - "/+7tqQ6rw7JTVxcd4hOchvyCVPXOHbz9cA57soHtUhqO4yjxgMBSDogPo4mDN+/OcCVt4Ob1" - "JGazmTJvLEIgu4Uwmzt48fI9mq2vPBzyP/9qlF9LZeh/KeP5/mucffuOSCTC/wnCBOcfPSDj" - "6bN9fDppBOYJucJ4DtARSfbzKI6vCHjyeA+X05sYstMrCJA3RZVxAZTpwvx4tPcQ166m0ev1" - "Ak2+lTIkctk1G0YEu7sPeBV0u91AyQmCyxALEiBUbcYjuH/vFnsC7XY7cHK5yS01Iqr3ZELH" - "3VIc5g0X/X4/cHKx4d+ehiTgYvwFd0w3sIT7G1auQiRCZefzY+33gf8CuAD5eAxdwCXWfqkH" - "qLyAyKDNUismTuLmkxErSmTZWEbZr/puSOQxNh9Sg5vP5zBKbEh8Va3yQSGTySifDWmTndNT" - "fDw+RqVSAQ/+YDDg0/HnVgu24umYdn97a4tPx6lUSvsBjEDOU65zEi4AAAAASUVORK5CYII=") - -#---------------------------------------------------------------------- -aero_right_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo0ODo0NiArMDEwMKZ+RR0AAAAHdElNRQfZAxkQMQU5RdXP" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAA/ZJREFUeNrtV09oVEcY" - "/83sy27UfZhtNLWxKNaDK6sNlJZIabHgpdB7KYiCR28W7EEPIkLbgz1481hIaSt4a6UUWkyh" - "Imm9hKbpSg7pIUVjotnGJG5235uZft+bmc1bk8A+NTn1W743b98bvt9vvn9vRoBkbm7uxp/V" - "ux8Mjce4t6ixkdJflDhZCVApH7je29v7oSDwX48PVd8x5bdx9IjB/q0CW2hitwDyNOZIA7qX" - "sNqp8DIUaWyAJo1NGus0/l03+GlEQFZv46sT5Z/F8K3b5vLcID49alCEQE46wESFHZ1RkYGA" - "8UoXZZiQQazts4iMfnzT4JPSb5BfjkV49V2BvLasN1oUgQR0OfieAGPLh+SSl8nfZhPA097p" - "KwgwdpawbogEnpFOjazpeBv3P6uXzDrKok2KgNY2NopQcpwL0iaedlY4EY14hiQ0Fsg4DL7n" - "yhCplQSeTUuFndBKSLf0LOBw4H7F2tlLRr1CsEVA0eyIVNLLAi19K9VhnWvHOOc7UllI6BQ4" - "21euHLkvSHrjiUgfAp7I9d9H/n44VUdPl1hhbdrzoxM1ZrV6W7FfmyegYiRNIp8TmH6k8N3N" - "R5j4axalvGwj8TyqUupJrhDgdqktCZb5xRjXf5jEvw9q2EutudXNMgKyPT96jVgV2kNgX1Jc" - "Ur2w0VS4+MWPqE5Mob+giAS9z6j84/jrVC7ERrcW0+aByJXi03Lhs69x7/4sXqLszOIBg7Xd" - "7xPRpD3ALklCsE6nOX3mc1RHR9FNOaLWMLiWxs5e7O4jF+amsuoXm5Th0KxB73JEEwMMyNXF" - "dvXKOQQ7dmFiXnVchp5IRC5oENgy/VmiZJ+n7zKtA9/T2ve0+kAELNDLZY1VH/1L54+j/5Wd" - "+GVGZWrF3tVRAm71CWEsKQuq0x4AEWB2DdV6gkI+h7Nn38ee3SXcmIptvDJ0Ik8gcbu2thMi" - "ZIr3HJFqI6CIgKaJtvNtLwY4duw1LBS349vJJgJC9puULASiBNwkMW/QAw4Dd1jpynGFgKvR" - "Wfo+9+yUGBwIgd0hRmbipDXL9LehQ1mvCTEOL0alq8DLP080vpmOkd8XYqzWecI9j6zakEzX" - "NW49iFGPs6TcCySw2fI/Aemvm8mEsXLuPtixRWAblURI3/7NIFGgwg+7JBYoxxk7OHW4C8Oj" - "OTqcKBSoaEMq0iIpb8u6iSbNRRedkHLP0Ih8K+6mimZbhcCeP0ICDoeRnBGDNw5XZip3Rvqu" - "jR/BvkGDA7QB6SG0kPeGBFjgM6JgEtnClIDT2OAzIZFYpPExEZmkB2O/A+X5Ebw5cMjuM2u1" - "mrnzxziu3dWYXtrYA9qubRIflSXeer2CUqkk/gNN/sDRnOMoBAAAAABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_right_focus_single = aero_right_focus - -#---------------------------------------------------------------------- -aero_right_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo0NToxOCArMDEwMEtfu5QAAAAHdElNRQfZAxkQLyM/CW/t" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAkpJREFUeNrtVz2PEkEY" - "fnbZQ+AgGD+R5YSAxVkRLfwF5vgH11xlbeNPsbE2Ftf4C+RiY2OijeGu8GIusEjgiJ4Ej689" - "YHedd8zgsBgt3Fkan+TNZnY3eZ55v2ZeDQzj8dir1+uwLAsT24ZKxGMxFAoFFItFJBIJTRuN" - "Rl714ADlchlmNotoNKpUwHQ6RbvTQa1WQ2VnB9rh0ZGXSiaRz+eVEvvRbDYxGA6hW40GTNMM" - "lZyQy+VA3PoFc4lhGKELIE7i1kNn9mFtAjzPW68AgUXwhaKwoGnaLwFE7rru4gOZWKsiFwJ0" - "/+7tqQ6rw7JTVxcd4hOchvyCVPXOHbz9cA57soHtUhqO4yjxgMBSDogPo4mDN+/OcCVt4Ob1" - "JGazmTJvLEIgu4Uwmzt48fI9mq2vPBzyP/9qlF9LZeh/KeP5/mucffuOSCTC/wnCBOcfPSDj" - "6bN9fDppBOYJucJ4DtARSfbzKI6vCHjyeA+X05sYstMrCJA3RZVxAZTpwvx4tPcQ166m0ev1" - "Ak2+lTIkctk1G0YEu7sPeBV0u91AyQmCyxALEiBUbcYjuH/vFnsC7XY7cHK5yS01Iqr3ZELH" - "3VIc5g0X/X4/cHKx4d+ehiTgYvwFd0w3sIT7G1auQiRCZefzY+33gf8CuAD5eAxdwCXWfqkH" - "qLyAyKDNUismTuLmkxErSmTZWEbZr/puSOQxNh9Sg5vP5zBKbEh8Va3yQSGTySifDWmTndNT" - "fDw+RqVSAQ/+YDDg0/HnVgu24umYdn97a4tPx6lUSvsBjEDOU65zEi4AAAAASUVORK5CYII=") - -#---------------------------------------------------------------------- -aero_tab = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAMAAACxiD++AAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFq6ysra6urq+vr7CwsLGxsbKysrOzs7S0tLS0tLW1tba2tre3t7i4uLm5uru7vL29" - "v8DAwMDAwsPDxMXFxsbGycrKzc3Nzc7Ozs/P09TU19fX2dnZ2tra29vb3Nzc3N3d3t7e4ODg" - "4uLi4+Pj4+Tk5OTk5OXl5ubm5+fn6Ojo6enp6+vr7Ozs7e3t7e7u7+/v8fHx8vLy8/Pz9PT0" - "9fX19vb29vf3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAA0PbvAwAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2" - "qefiJQAAAP9JREFUOE+t0tlSwjAUgOFjZQuxuOBSFURSSOyq0qYNEd//tUzCaIeLk9743Zyb" - "f5LOSUH3AC3vyEWIuIw06KvHRmGqKIJ3+u1RzaD0BpL+S3DwfIO5oqAHDxPk1LOpr9oGe0/h" - "ArXHmSCjLbpIpSobyBa3o5DSWqJaF+xqlPykEE/LHFWmU2AkS1GZCdYkFajkjZhAxCghCLwS" - "zlCcE1j1BpOeE176gqU/mMBy3F0Rb/mpZENh0QWxyJNTfD6HRXfFthgNndFgcJzDa2aCv0WZ" - "tUj7blLdP9nZ6PCZATtPft+qjELt/vAm/HCzCNYmuA2O5xqzmzOwAuIG0AfGfgDFvqY+8bKe" - "lgAAAABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_tab_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAIAAAAJNFjbAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "ABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAABPtJREFUSEu9ldtPI2UYxovR" - "jZd65Z3xxv/AO2/0wnihiZpodgV21cSsiyYbs8ZkiQQSDUaynBaIB0ACLOsegJaWlkNpObSW" - "XQ5dlgUqPQ3DtPRIW9pO5/DNtPGZFjeVte2F4uTtxcz3e96n7/t+802VJEkqlapx2LQXE589" - "80xVVRVu//319FO5F587c/Xc6yoYXOrW983vzrqOrExqPcBuRTLOQ94T5/cSApMU/EnxIFUh" - "wIAEDxW0jyKZRSr+Vv3d724YFYPaDn2Iyy5H5I2Y/MeR7EllaTbrz2QDXC7E5yJ8LlopwIAE" - "DxW0yOBOylOO8CedOlUikfio0wAD239tYPEkatu0qng8/j8ZWCPyg5i8cyS78y3y/dWicL5L" - "5QNMoUVQQYsMzqR8XEEsHr/QaQhksosheS0qbyVkZzJLpbP7yhgUTYjLQV8+wOQHkIMKWmTA" - "LJcKLSoYYDimgHw/Ij9U5qxMiU5nGTZ3AI+M4lE+wIAEDxW0yLCdkBeODWIxGDCsPOUn1jBZ" - "P5TyRcjelEynZaawnSoFGJDgoYIWGTZjktkTUyo4PDw832nA2iRDFoNkNSptxpXNin1GpeX9" - "dNaX9ygfYECChwpaZNiISXPuWM1jAyolj9NkLkCWIxJGjQLxRzwpeS9d6FWFAAMSPFTQIsPa" - "oTRbbADnmx5iYMhSUFqJKpPYgQdeOgw8P4/yAQYkeKigRYZ7EWnala8gGo2iRVgbdAvafdGc" - "L8KOSaBRCdmFOtCrVIUAAxI8VNAigzVE9LtFBljrdQpjtDjrJ5aQhEngj6BYNLTgUT6U7EcK" - "DxW0yLAQJLqCQTgcru00bMXk6zvCTY+oY4g5INnC0nq+Udv5OlBf+QADEjxU0CKD0U/UO48N" - "Ogy2kPTGdPKilW20cx3b/K9O4bZXnKDFKYYANR+Q+dKBVTAgwUMFLTK0bPENJqamVavy+Xy1" - "7YbFgPSKNnl2gb2ywjVv8j0OYdAl3qZEDU30DJn2kZnSgVUwIMFDBS0yNG3wXxvzBgzD1LQb" - "5vzSy2PJt43sJRvXYOdbt4RfdsVht3iXUpS6fTJZOrAKBiR4qKBFhqtr/JUZprp1QkXTdE27" - "Hv/ihd8SrxlSF5bYr1YzzQ+5rh2+3ymMeIQ7XnF8T1SXDqyCAQkeKmiR4fI9rq7YAG/A8yOJ" - "VydT1Qvsl/cz325wndt8764w7BJuecRRShwrHVgFAxI8VNAiw+c27jNDvgKKolDBKRp4vd7T" - "NfCcuoHHc0oV1GEG1yZUbrf7w7YKM8A+0dGifp/8Y2AHT9BklCI33GLvrti+JTTa+QY7V6dz" - "fdyhrWyALYhNvIrzi8mUiqX9zDzNGilW706P7aZGHMn+9eC7Tepv+iZVLperfIvUlLgWlc61" - "6j5o0TwZ7/+gQTz5vLZVU//zxO82m2JQ3aaf9ZGX7iTenEl9amXr1zMtj7gfHfwgXgKvoHwk" - "9pK1rdp0Op0qunDL87zJZFpZWSl+zrKsKIqDQ0MWiwXHhGLw3vdqq5//YjnTZOe6d/ght/Lq" - "4vAyHSjfHxyQP5kcl7vVhJDc3680yw4NDeGje+J5MBjs6u52OByKAX5N/bp3mtVnr2lLxcUu" - "3a1R9fWurvaOjuLo7unp6+8/8RC3AwMDJrMZh9CxwfLyslqj0ZW+jHNzFqt1XK0eHRsrDo1G" - "ozcYTjzE7fT0tP3BA2TH9Sf2aVnapn4zWAAAAABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_tab_focus_single = aero_tab_focus - -#---------------------------------------------------------------------- -aero_tab_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAMAAACxiD++AAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFq6ysra6urq+vr7CwsLGxsbKysrOzs7S0tLS0tLW1tba2tre3t7i4uLm5uru7vL29" - "v8DAwMDAwsPDxMXFxsbGycrKzc3Nzc7Ozs/P09TU19fX2dnZ2tra29vb3Nzc3N3d3t7e4ODg" - "4uLi4+Pj4+Tk5OTk5OXl5ubm5+fn6Ojo6enp6+vr7Ozs7e3t7e7u7+/v8fHx8vLy8/Pz9PT0" - "9fX19vb29vf3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAA0PbvAwAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2" - "qefiJQAAAP9JREFUOE+t0tlSwjAUgOFjZQuxuOBSFURSSOyq0qYNEd//tUzCaIeLk9743Zyb" - "f5LOSUH3AC3vyEWIuIw06KvHRmGqKIJ3+u1RzaD0BpL+S3DwfIO5oqAHDxPk1LOpr9oGe0/h" - "ArXHmSCjLbpIpSobyBa3o5DSWqJaF+xqlPykEE/LHFWmU2AkS1GZCdYkFajkjZhAxCghCLwS" - "zlCcE1j1BpOeE176gqU/mMBy3F0Rb/mpZENh0QWxyJNTfD6HRXfFthgNndFgcJzDa2aCv0WZ" - "tUj7blLdP9nZ6PCZATtPft+qjELt/vAm/HCzCNYmuA2O5xqzmzOwAuIG0AfGfgDFvqY+8bKe" - "lgAAAABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_up = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo1MToxNCArMDEwMESarloAAAAHdElNRQfZAxkQMyBAd2MK" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAh9JREFUeNrFl0tv2kAU" - "hY+NBXbAElS0QTwColKX4Q+gbvmDXXXVriq160olq7b7Rk2zICsejWyUqkmQgEIMxvWxZAti" - "0eCoHo40ssZj+5vrO3fmXgmuut2u4zb0+33MZjPEJU3TUKvVUK/X2SRlOp067ZMTNBoNNJtN" - "JJPJ2OCWZcEwTXw/OwO50o/zc0fPZFCtVmOD3tdgMMB4MoHc7/VQKpWEgalyuQxy5Tv3VyiK" - "IhROHrmyUOo97QXuOM7+4L4CZ/uziVuSJG3CCRYFX5+AcDg5iURiP3Ba7bOE+3xde/H5huWi" - "4SHLV6uVEKAsy5uW86hbLBZC4FzpoVCzbVsI3OcFcP5yUfBQqBEuyufkhFb7Y+BMubheHguX" - "fXiURjH7sSw7yIKivh/Ao4g+KxQK6A1MvHr9wbuyv35a7arI8Gw2i+ubCd6++4KUlveu7PN+" - "rPBcLoer33d48/4bDvTDoLHP+xyPop0zR13XYfxaov3VhJZ5Fhr/+NlE62UFh090jMfj/wdP" - "p9O4uk3itDNB6iC/9bnTjoXjFxmUnu42AQ/+0GKZz+c4KuaQz6kPflBTJYxuRrtZnnJjlbsb" - "N/xtsc7x2+thkIH8S6M/9tbdkkbyGxwn1yuX3OBDsVj0Dpc4j1aCVVWFYRhYLpdQnrsV46d2" - "26siGK9xFoo0zhwO0bm4QKvVgudsd3F4JfLPy0vPv3GJVh9VKl6J7EaP9Be4+2JJRD7+lAAA" - "AABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_up_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo1NTo1MyArMDEwMAycPlQAAAAHdElNRQfZAxkQOBMcU9vX" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAABFhJREFUeNq1V82LHEUU" - "/1VNz863yWyUyCSaEPzYuGtkwY8QYwLiQfTgwYsgBPMXeDJXvYmo+Qc8KEFIULyJHhQWNcSE" - "3KLrLgqLoMYVkplIdmZ2PrrL36uqnulOsu50YB68ed3V3fV771fvvZpSoDSbzS9/Xll9+czy" - "EFc3IkxLGlWNE/MBjj17RBljPlQE/uH1MytHzcEjeOGwwYGSQokvzigqbUCbo9UTAhhqKMqL" - "IW2PdpN2g/pbx+DH7xX02gWcPblwWi2dv2Debz2Dd48bVIxCjiiBFjBeE1iJwumkIg4If5ER" - "NRiKIxxgtOhpjVNfGby15xL0xz8NsP+owkzoPpqmiBP5MEL9RUBw9bWuwe6iwvRWOi2C0yhp" - "CO6kSzkVCWJvzBYqopBtScwdruM8sHj+wkYuiWGMBxTrHxrvQdZcMCat0S33qcgFbMBBTau0" - "y3CL6K0yfmxCibzDoYkz3pdelGbA0U53Ir4RqfHLmq9FcHVmSy1D+GbEphnNF5cdLFYuAR65" - "MsgJqNcwMZkFzxB5THXcbGzUXk1iGS240BGmPEw3lqwlkcyfcbNxGHbOKEW7W/M4cpVYb7Em" - "I+0pQM/qIHIq8w1NMnLyMwhdHw98pCOqI39/NwnnGY2tMKwwLjUL7tbE0Iqyp1Ot5/HqqOwJ" - "FyYot/MKA5EZMTOOfOi8smuv3Yc26RLdRWeMPLnOoU++oV/SVOTnmuzv5H22oFDLK1S4nRVZ" - "DTN0JK/d7pbLAB7vYn2i92jbHLg5AFp9KV6Fs5zreAy+ycg3+KDADiMDOZuuCibnMjYLeEy5" - "gPcIvsmQuwTvMKPbfWNrfTAIx5H36FWHDpR5V+A4g7c0x1RLIkYZwSWz+5yr57UbOgwJJgwT" - "tEuqt+lqhYNFLvSMUB2O69tkBB/adm1IuwBL9E47ZMA6lwIfOup71D6p7mv/98m3VvHC3AIu" - "tzuYI//2zG27WJy8cW1bBjyGFQ8+al5RQs02Ksvxyr4Ae9t/WqvV9t8k548l858JYeOlhsLy" - "yhrePHXaWrnPUg13DX5oNsDf/9zAO+99jnKtYa3cy/hUwRd3Bbj5xzre/uAb1Or7Rir3Mi7P" - "s8jEbz+yI4fm79fxyRdrqO588LbnH322hjdezePRvbP4pRVONOdE4PtrGr2rHXx7qWup3krk" - "+bGwjYceqNCB4bbzOnD9//yv86Tx/IEKGrvL205YLSssXds68iROcC+PRxXmf5WNfCsHpEF8" - "xwlLE/DUve7a6Z2kyO8reY0arwU3OPl4HktXctjzHCenw1V2l2oeKLF2Cjm3scQNZzjByUKO" - "WvfwoDdgSyyytxf4fZ5b5Az/qdxHnyoE3fW1wonFAMHiwmOr85cvzn26fBgHnzZ4uKyxk6BV" - "gvFgwc2GDsB1vEnEdjj+cA8BDyVo0+Eb1CbZ+5Unxr/OA3PRRTz5xILrnq1Wy1y+soxzqxHW" - "29M7ON1f0XhtTuOpQ/Oo1+vqPxxtdiUOpmR7AAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -aero_up_focus_single = aero_up_focus - -#---------------------------------------------------------------------- -aero_up_single = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" - "AG1lciAyNSBtYXIgMjAwOSAxNzo1MToxNCArMDEwMESarloAAAAHdElNRQfZAxkQMyBAd2MK" - "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAh9JREFUeNrFl0tv2kAU" - "hY+NBXbAElS0QTwColKX4Q+gbvmDXXXVriq160olq7b7Rk2zICsejWyUqkmQgEIMxvWxZAti" - "0eCoHo40ssZj+5vrO3fmXgmuut2u4zb0+33MZjPEJU3TUKvVUK/X2SRlOp067ZMTNBoNNJtN" - "JJPJ2OCWZcEwTXw/OwO50o/zc0fPZFCtVmOD3tdgMMB4MoHc7/VQKpWEgalyuQxy5Tv3VyiK" - "IhROHrmyUOo97QXuOM7+4L4CZ/uziVuSJG3CCRYFX5+AcDg5iURiP3Ba7bOE+3xde/H5huWi" - "4SHLV6uVEKAsy5uW86hbLBZC4FzpoVCzbVsI3OcFcP5yUfBQqBEuyufkhFb7Y+BMubheHguX" - "fXiURjH7sSw7yIKivh/Ao4g+KxQK6A1MvHr9wbuyv35a7arI8Gw2i+ubCd6++4KUlveu7PN+" - "rPBcLoer33d48/4bDvTDoLHP+xyPop0zR13XYfxaov3VhJZ5Fhr/+NlE62UFh090jMfj/wdP" - "p9O4uk3itDNB6iC/9bnTjoXjFxmUnu42AQ/+0GKZz+c4KuaQz6kPflBTJYxuRrtZnnJjlbsb" - "N/xtsc7x2+thkIH8S6M/9tbdkkbyGxwn1yuX3OBDsVj0Dpc4j1aCVVWFYRhYLpdQnrsV46d2" - "26siGK9xFoo0zhwO0bm4QKvVgudsd3F4JfLPy0vPv3GJVh9VKl6J7EaP9Be4+2JJRD7+lAAA" - "AABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -aero_denied = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAADxklEQVQ4jbWUzWuUVxTGn3Pe" - "+955k8nMJE5m0vqRZCaUYomG0uJGjDR0UXBRUj+6Kqg7kSy6SBf5A7ropiB07aK4qIsWIYsu" - "ioXBQoRKqWhJ1eq0sWqSmWQyk8y8H/e+p4t8oJ2YuPHA2dzD+fHwnHMuiQheR/BroQJQOxWv" - "Z7N9cRB8nAA+dIEBAIiAvwPgJ04kro1Vq/Mv66XtrCgVi9osLEx1K/V57+HD6a5Dh8B9fSDH" - "ga1WsXr7Niq3btVrUfS1yue/HH34MNwV/HM+n1HN5vd7+/vHsmfPQu3bt60i8+wZli5fxr/l" - "8nXT2fnJBwsLK8/XX/B4ZnhYqWbzyv5icaz34kXwnj2IrYUoBXge4HkQpRBbC85kkL1wAfuH" - "hsZUs3llZnhYvRQclMvnsqnUidTp04DWoEwGnE6DEwmQ44AcB5xIgNNpUCYDaI3UqVPIplIn" - "gnL53LbgmULB9YCp9LFjcHM5KM8D+z6o0QD+l9RogH0fyvPg5nLIHD8OD5iaKRTcTd6W/KhS" - "OZJOJgc7R0ag4ngd8gqhAHSOjMArlQbrlcoRAL+8oJhFjiaLRWhmrN29ixYzfNdF6LqIXBdG" - "a1itEWsNaA24LoQZ5s4duAC6hobAIkfbFDOQ78jlQPU6zNIS3jh/Hqz1jmolDFE7eRIqk4GX" - "zYKBfDtYJGDfB9VqkNXVV7IBAOT+fYjrrs9DJGgDE/Ns+OABkExCBQHmL10CM4OMAVkLAkAb" - "3hEAIgJZC7YW9OgRwnodzDy7xds8kF97et70iMrFfF6T1gAzEEWAMburBvBwcTH0RQbfX15+" - "Cjw3vIOl0tMgiq7VVlbA9Tq4VgOvrYGDYNes1esIoujawVLpaZtiAPitu/sta8yt/o6OVI/a" - "8X/aimVj8E+r1XCUeu/dWu3+tmAA+D2dHvetvdqtlDrgOEgQbQsMRDBnLWrGGM9xzozU6z88" - "X28D29VV/LF370d+HH/bFOntIkKGCJuLFwJYEcGqCDqJKh7zZ+88efKj09WFHcFbtuTzOW61" - "vghEPo1EDtiNdweASzSnib6Tjo6vum/eXCwUCm39dO/ePUxMTDizs7Oq0WjoMAy1tVbHceyK" - "iJsFOs4wv32AqF8AzMXx3FWRP5cAn4hCZo6YOdRah8lkMhwYGDCTk5NGzc/PY21tDcYYiuOY" - "RIQ30gGgKiL4xpi/AJSxvsIWAIjIAaBEJBYRx1rLxhhqtVqoVqu0rRXT09N048YNPH78mKrV" - "KjWbTfi+TwDgeZ4kEgn09vZKX1+fjI6OYnx8vA3yHxWIwp50Lj49AAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -auinotebook_preview = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0" - "RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJXSURBVHjahFJRSBNxGP/d/+52" - "W66ildPKJB9EMSwjFSNoUkS+GYg9pi9R9tJeopcgC3yKYvRUMHA+VBJUmpQPQSySKINqEGSB" - "Np3aNjs3N8+7285d/7sxa9yw3/G777v/932/+76PP6PrOgw8D876dYImWJAEZPpW8l89nYea" - "i8KGgMHRYPitvgkCw0G9qaNXD4x80Qs1BknRnzaBEfX1e+G758PQaEgvnP8VULA5lCS8/T7T" - "NUQK4ApO4j/1l3s6N/zA8MiGTxiGgUGowGwkhqkfc5Bl1SKwlM6i90y75dzsoKX9fNPLF2Mt" - "sZVGuMt3YPDpK7jsDnj7uiEIfH6ClAjF5rAKHD1xcW99a927C5e6hP3luwCGwONpRjwm4tqA" - "H7du9pmJDG9HrsSeSE3dvmdnz512tFZVQaGjaCyBjedRubscxzva8PrNJzNR0xmsKsQq4KzY" - "fqDW7UY8o4KjxRzLmpYlBLUNNZj48BVRMQlWA7I5yTqCvcyuq+s0qmkQiC1/QeiTo1ajNpWS" - "oMoMVJVyXbZ2sDj9S5sMh2l7CjJUJGswq0HNZBCNLmEhPA0xsQpJUSHJJUZILCbuxuZF7fv8" - "ApbTaaysrSEpSVgURdy//RDJxAp2RvzgMgkQzbpEziVEbgQfBeuXPY1dqcMS4W08cnIWY0Pj" - "iIXjuNI2A0dsDmXyT3yUTtESZ5EAU3CuDvhD7ydDB1mWg6zQWelSj2ydwbE9v1Fd4TQZmHLj" - "yTfBzP88PsgUCZTCne4qFycID7Zt4TuqK50TFaTmZMP1x5l/c/4IMABbKBvEcRELXgAAAABJ" - "RU5ErkJggg==") - -#---------------------------------------------------------------------- -whidbey_down = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAaHWVZ3egZ3e1cYCncYa0dpC4cYXGcpDBc5fWd6Dld6Pwi5OzgJbUkJjQkqHC" - "hafggqfwh7Dwk6Xgl7fwoKjWp7fXsbbWoLfnoLjwpMLwscHnsMfxtdD0wMHg5eTo5/D49/f3" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAverH2wAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAF4SURBVDhPbZTpYoIwEITRGqAQ1ChqOFrx/R8y3SObq8yvsHwZhglaOdH7HZbJIp1W" - "YW7t7w68LOcwDaxd5+lhC3q18zwOMhTWIjtZ+3wGfFmWFYZjgJl9vWC/1x30AI2zzExzIcqz" - "a2RxC2Ak2n4zJmEx1TgaY8R7AtHsdgMS1IivJRZHyN5lA6PMEgwZ2JVYs23bxwuWG3PGdF3X" - "ImvtBO/KqAl38ytgO+WqMz1SDDz7KXaCbatU5YYARt+SbUHg61zT9/iMHsQZKHBI9A1S6njk" - "fpuCRTjmJVQBymfxlfuCc5IX0cMhnhvCMYO8KCdCV0L9GbMz8Fhqous1ugbWw/32k2oDtFUn" - "do2sz1ywqWvCElz6pq4pS3CRVxooMvjqsI2+v5LwXCVrljfrGclhqH2v5e+Nr6VnYltgBct7" - "iDDExm+grvm0ouL/QwrjN1CHXvczYAz0xF5Pp9w168zfAhjeH9gSle8hnWutldL6H7rHOq2P" - "agd1f/M7VhKuYPh3AAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -whidbey_down_single = whidbey_down - -#---------------------------------------------------------------------- -whidbey_down_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" - "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" - "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAGeSURBVDhPfdOLUsIwEAVQCCixFSggVfBFQWpVjKJo+f8fi3ezSZq2jDsDhHB62Wyh" - "o319Vctg9V2tO34p5H0bHw5D4Xe9FULK5bKhb6UcDs/cprNdMYiprhee30khaStx2NpudwCb" - "JHG8WAhbEkU0cZgtUge0iYrjCEUuilheOWysS2U9GpluGJJ1mKyg1LHZn6NYNNYUCWuozSjr" - "FVxnLGQUjZPJlLJKCk7piar0Nk2zS90RAhINVDZN5yUeNZuhbjq6BzmZomYoICr/Yr5mtcry" - "fL2mfnvjSd2anvkSsqBZUazN2XS/YVNLrc2Qut3yHAj/10OWFwVRtrpPvZo5cL+28A7fnxfv" - "G6Ps74GwsfXCsXKkMnWWko39DKukAbjUygKfskFqYLnnKvcHdQT9sA0EPdgD1ts9Vr2G/fpp" - "pDMeAg3gWe2fgn9V9d+0yW5edCylQurnwJejZ/7VPJpZ7V+C1PBsFrPFXAul6rSRi2S2uFmq" - "kdrK1frcWOq1kXrC6osHulnq963Wa3Nm9kOySrVpq1/yr5vNbtdK1foPGIxy6qmqIg0AAAAA" - "SUVORK5CYII=") - -#---------------------------------------------------------------------- -whidbey_down_focus_single = whidbey_down_focus - -#---------------------------------------------------------------------- -whidbey_dock_pane = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAaHWVcHiYZ3egZ3e1cHilcYCncYa0dpC4ZobHcYXGcpDBc5fWcZjgd6Dld6Pw" - "i5Ozl6e3q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dwk6Xgk7Tkl7fw" - "oKjAoKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo" - "4Of35/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAA1jVbdgAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAdFSURBVGhDtZpxe6I4EMbtbQVXrHJuaY8KWq/XW3Sr196u8v0/GTfzThICRIh9nssf" - "u4rw42UyM5kJHVVXjDQah/EV51ejK05+SKMwjK/BX0Gfzu9ms2kY3PgL8qd/nc/vCB+GN/54" - "b/p0sVjMaRA+9Mb70hku9GvUe9IBV3TC+9rejy5wTfdX70VneJ7LHRaLu7uIPNPL9j50hp+a" - "w9NzPOhQfvrHHqeZn/phOmzeofvZfpA+zTFa2rNsFk2GPWeIruB5y+5En00mg1E7QNfw/CSP" - "oEaZ51kWDavvpxu4phOWB+hJMqi+l17DFb0sBa+eJB3KOX30xLIFeAQXvKYTvtf2PfTVbrtd" - "6xsonrKMoafhJAwu5/vL9NWO6Rp/iZ5OJsFlfI/2onh7oxvQYKOsaeALjTV944fK2DFn489o" - "ryqmA69NDrtjWPSwZyHs9RlWr+h5Qzt9UdqzPvhATTBMn/Uu4QOxut9r24vFdzSUvUh+lk37" - "6wMXfVNf8sF0mdrt9nGF8YbB3ppNl/WpK8eNHPTNxuCXHx/a9q+vZz3exZvW6+m5NPhi58B3" - "6Yfj2zYRHcuSgOI5Bi0fDgeiT/nT8oxTi2K3U1dZz9ChH5gu+GXJ9HNRvP/dgoOfyEGox/Tn" - "nVlo04kNm34DHPRfv7psxuujywqm4rBo41t0Vs4uvl4/PXHUNLj7/f6VRvte5RJTjxBo4Zv0" - "A3sDxw2d+EeTcnzd4qnIdR43zZ/EbSUjNfEN+oHppFsiEZOmxn5/ZJOBvt1uNivrNyvk2nib" - "fmA6W0W0Z6FGkL0sNvLYt0L/aKeLtnqLTvCD2FzRNR53VelSZ8l1IfhfdqqDbRaWcWo6nWZs" - "zrk1SZLVvww40oBeZTG9oDwbOm6pDy8svKHzA9Y2Z3oUgU5WOSIXdOjAv/Nv1hLJ5aZRr+lQ" - "XhNYevSEZye6ZJo2PZNpd9ANXtFFuYtOM0p50UnP4Dm2VeQZavVCZ6cqudziCOL/szSKYkh7" - "hReu62UJv/MyS8+HM2AZuUwNgwcdTlVSkasrrppOgSL0Rg2ME9l6uD8/cqmWd643T0Y90xEO" - "azku48RzCu0vau1z0lNEhJu++Epkoks4dOhjPPaL+Hl+gf4upmlplzaIPGdUIbewXls7OTvo" - "xktbdK6auNyAWz266fOHaoQ4ZKNpOl940vRXHQN99BU9XMkzqylo3+7u0nTEdkHkKzoKRUNH" - "tccxeoEOwxs6XQqK0GdRNFoVKkqEDo+8lk4Syq2UsDWd2ubxKHtm5dzVid1Fe5bOjCx4kUt7" - "mohf8QPCMg3ttGERjp4z1Yk27O5HV15r6MbuVF1S2xbHo+pRNblNf88SaN9sVIpyaSfDYhnU" - "dEQK7A54ELO/f6VJqC2joknF4bmfPgadw4UtY+hmo4Vj9ZanWNtd07PsRfmDuYqTgc43nAei" - "e8TEu4OuWh7kGcb70kViKfR7phdvVA808gw34thHkBzJ+EZHSquH5NfzN5p1ZU+S/kM3fZxE" - "owBnCF2lWFAivcWi8jvUYydDBujAZ0JX7XD5Q0yTMT0EnVf6emHh9FC3anptgu3nc5ueppC2" - "0nfT//OdqRcOA5HeoVsbFGZdFbxFJ3/7C3ShyTPoz/C4PwHnhau+rLmxVdcEwNunRdEYNcFK" - "8Wv6jO4cBL8DfuC1xbqssbVi1TOMN6chHoSu1Ws6ByLZBfDzObEX8yRqNvd2LaZsLzt3k8lY" - "1g8aDw+Ukc3gfatAzMJjapTnOdEb2yqNOtLgSdwkMHBWGEIxxmQS/iYTqvAyGSmN9rZEswZW" - "eJkaC0Af4/ieBrPHY6kWWniCh+0NoVb9DjzbPLhZNhH07f4+CIK4heYbT0V7d0ui3XvcSvLk" - "QEbXROPnz859zFGOLGptZhRDru2UTt9EeB3ISj31TQ784fBIRwVeVTQtrq2gbs93G0Vfvtg9" - "3/Ft92KqdXWfI1cpVCspOOMnjg3QLr0aRwpOxuGOj+i7orD6JarnqVugEE2sfnXs2khx0CsD" - "r6rv33U3w/3MZvNCQ/dP3EI+1c2pa5fGRbfa2e/SApohXbw6RmFk0a2rzMd+ujRclAI0XnYh" - "pBRH1ujfhuil6yZX6LTEmlEnl158H91uFVVtr+t7ne0o9iKXSdSxHjpvLJieqLmXar5xaPfs" - "Ll2mP8IMWqRzTy/PSTplzIvqe7Qndit3gc4581Paq4p23lHpYP+dH6K5lyoZSce1U3+vz0xb" - "dMZLgcD/AB5aode9Qb+/S5VmtEsDUNMH334MxKqpcxw+4/HWbIAuNSbXgc3RLIo+4zNyjeBR" - "ZdbjRKuFKec+F03qqrpCtuieb/uGLGNXyDbdR7mugXsezlUhn06D3iJED+2qvkcDpCpUvzdl" - "nnTVnSg6vavxfT/spb1Wz9qpnPN7Q+mrXTsmF1I+78j0PHpq13jOLR7v966mV6jS0BX0vAJq" - "OZ+3dlLP8UnDH+7nkUpRHMf/399CVFUcf7nu7zj+A8yummsi9EdGAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -whidbey_dock_pane_bottom = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" - "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" - "q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjA" - "oKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of3" - "5/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAaHenigAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAejSURBVGhDpZkLe9o2FIYpTVeWrG3Srmy9stk0LTPJMKMhmYM9KOuSERqydAX8//+H" - "dy6SLF+QRXeepwtg+9XnT+fotlqyRQRey+1vcX9S2+Lm08Bz3f42+C3ond5xt9txnRf2guzp" - "b3u9Y8C77gt7vDW94/t+DwLwrjXelo5wpm+j3pJOcEEHvK33dnSGS7q9eis6wqOIW/D942MP" - "MtPKexs6wlfZsMwcCzopX/2jx6prp76aTp4X6HbeV9I7EUVOexh2vXZ15lTRBTzK+Q70brtd" - "WbUVdAmPVvwKIuIoCkOvWr2ZruCSDlgMog+HleqN9BQu6HHMePEmQdWYY6IPNS+IB3DGSzrg" - "jd4b6KOr6XQsGxA84YyiB27bdTaP95vpoyukS/wmetBuO5vxBu2z2fU1NACBpowh6AvEGL7h" - "S4WYmN3W12hPEqQTXlpOvlNodNcwERpzBtULepTRDl+E9tAEr1gTVNO7xim8olbnc+k9O34F" - "IfwC+WHYMa8PyuiT9JHPSOeunU7PRhTXFJitYWeQ3joqaaiEPpko/ODzZ+n9xcVaxi1n03jc" - "WccKP7sqwRfpi5vr6ZB1DGIAcuYoNH9YLIDewU+DNd06m11diae0dyjQF0hn/CBG+no2u73M" - "wYk/5B9JPXV/VOiFPB3Y5Ol7ghN9uSyyES9/HSRkFZZFHp+jo3JM8fH4/ByrJsOdz+cXEPm2" - "4gF1PZVADp+lLzAbsG7gxt+zlJuLKb0VpM7ZJHuJ05ZHpCw+Q18gHXRzJVKniZjPb9Ayok+n" - "k8lIu6aVXB6v0xdIR1dYe+hKBPilsWkcez+TF/XhIq9eowN8wZ4LusRTq2K4lKPkeMb4pT7U" - "kTe+Zk5Kh9uU5zi2DofD0b8IuIEgvcIxOaF8UHRqUv7sa3hFxxdMPUe65xEdXLmhsaBAJ/wt" - "XtOmSFxuKvWSTspTAkr3zundgc4jTZ4ecreX0BVe0Fl5GR16FMbFUnpImaO7wu+Qqmc6JlWM" - "yy2sIPwbBp7XJ2kXlIXjdFqi6zjNwvvRHeQMPyZC4YlOSRXDIleuuFI6FArTM2tguhHdo/bx" - "lWMxveN6c6XUI53KYcy/c6ywT0n7RzH3ldIDqohyuv8WyEDncijQW/TaHznPow30W7Ymp523" - "QZA5tYTGFtSra4dkJ7rK0hwdV0243KC0Oiun906TGtUhmibp+OBK0i9kDZjoI3i5GHtWUmj7" - "dnwcBDX0hSpf0GmhqOi02sMa3UAn4xUdHiUK07ueVxvNRJUwnTJyWzpIiKe8hE3psG1u1cIP" - "qBx3dew7aw+DrpJFWVSmPRhyXuELkjMZ7XBg4dY+hGInmvHdji6yVtGV77C6hG1bv19LzsQm" - "N5vv4ZC0TyZiiCrTDsbSNCjpVCnkO8GdPub7W+iE1BlRTaIO12Z6i+hYLuiMoquDFqzV19jF" - "0ndJD8OPIh/UUzgYyPEGxwHvhGritoQutjw0ziDels4SY6afIH12DeuBzDiDG3E6R+AxEvGZ" - "HSnMHjy+rt9Drws/QfonuenDQdRz6A6miyGWKJ48YhHjO6mnkwwOohM+ZLrYDsef2JoQ6S7R" - "caZPJxYcHtKtmpybyPteT6cHAUkbydbkX2wZ9sKuw9ILdO2AQs2rjNfokG9/EZ1p/A7yM2Xc" - "nwTHiSt9LHuwla4JCK/f5nktWhOMBD+ld6Flx/mN4AucW7THMkcr2noG8eo2qgemS/WSjoUI" - "vhB8vR7qk/nQy27u9bWY8J5P7trtFs8fEKenMCKrwHMrh23B6CjlUQT0zLFKZh2p8CCu7Sg4" - "KnRJMUW77b7kDhV47owAIn8skV0DCzx3jQaAj/3+CQSyWy1eLeTwAHfzB0K59Tvh0XPnxSCL" - "gG8nJ47j9HNobLjD2otHEvm9x2sePLGQadcE8UVZrLf3hdIVKwu2Nl2oobLjlMK+CfCykIX6" - "ekPvAdHC5eWDOtNp3wTdUnYUVNzzvfa8V6+0PV+93mg8f56z6WWj8eDBPaSLLaXbbZccgBbp" - "ScsTcDBnvb5Tv7+H8cMz1cCrRr2BP+3f0/arrbKDlBJ6ouBJ8vedO/eBvr+/t/fsWV1EAwLh" - "+/v3ztPNadkpTRld286C8vuIgdjb24VA8u4us78HvHZvyUczXSpn/sOH5BGjkV6JN9LrqPwR" - "kZ5CMDP32XjKYaITXOhcZkNryTOYY6ADe3f30f7BY9S7RPFN/A/GUtGbzcPvNuM30+t1YIMt" - "Kb3ZfLqEfxn6IcSPG/EG7XeBffAY4gkEYDHUH3qVN28Oj47evfsa7Uly99FBlk7ecyNIB/ih" - "7xvg5lO3nRy9KeCCfgjKu8ZjN3O+7xidOTzy/f91preDnlPOsO8i4Bu4cuR/zZme3kuIJ3o2" - "oEOPQHnFgWH1/wEFPNFx6lexxGSpVC7XkaaxaKeUbqPchp6Q96n2TxArgP9RZYtaA5vHUcRn" - "bV9ZeJ6usM10Vt98wgmDyfJrNP2l4hm6XDF7CATiZTZih0aRFdySjup5/PqZMlEe5Vbpt9Oe" - "AJ7pkOewhSie+Ja3Y0tPdpgOBRrZKrf1HZV9Q3T03Fb5NvTk25+wQKPrsyq30+vWzsAjSI+i" - "LeC2OcNyTjudc219VP0O/wGW4JFYg7jH7QAAAABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -whidbey_dock_pane_center = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAGDeAJUqQIEOkIkewJFKlJlayMlSiMle1K2G0LmnSNnDgR2OkQ2O1UGagUHCo" - "VXSzaHWVZ3egZ3e1cHilQ2TAQHDAQnLSVnfFQXfgcYCncYa0dpC4VYTTRIDjVYbgZobHYIfT" - "ZpPXcYXGcpDBc5fWYIjgYZHgcZjgd6Dld6Pwi5Ozq62xgIjQgJbUkJjAkJjQgJjggKDXkqHC" - "k6TWlrDXhafggqfwh7Dwk6Xgk7Tkl7fwoKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjpMLwscHn" - "sMfxtdD0wMHg6tTN4Njk5eTo4Of35/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAXehG6QAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAdqSURBVGhDtZoNW9pIEMc5emrB651VUDRUpEkqb5d6SBOUXq9Q8dprke//aXLzsrvZ" - "hGWz+NzN87RCzP74M5mZzGyspDvYOGh4wx3OTys7nPx+HHjecBf8DnS/3wtD37t47S7InX7V" - "7/cA73mv3fHOdH8wGPTBAO85413pCGf6Luod6QQXdMC7+t6NznBJd1fvREd4kvAnDAa9XgCR" - "6eR7FzrCV3lzjBwHOilf/a3bKnRTX04nn2/Q3XxfSvcTsoL2OA6DdnnklNEFPCn4Hehhu12a" - "tSV0CU9W/BWErZMkjoNy9Xa6gks6YNGIHkWl6q30DC7o6zXjxTcZl9UcGz3SfEE8gDNe0gFv" - "9b2FPlnMZlP5AYInPKPoY6/tXWyv99vpkwXSJX4bfdxuX2zHW7TP5w8P8AFg6JQpGL0Bm8I7" - "/FIxBmbYeI72NEU64aXLye9kGt2z3AitMYPqBT3JaYc3Qntsg5f0BOX00HoLL8nVL1+k79nj" - "CzDhL5Afx769PzDR77Il35DOl3Y2u5mQPZBhtMb+KDt1YvggA/3uTuFH375J33/69CTtK0fT" - "dOo/rRV+vjDgN+nLx4dZxDpGawBy5Cg0v1guge7jq9ETnTqfLxZilfYdNuhLpDN+tEb603z+" - "9a8CnPgRHyT1dPmTjatQpAObfPo7wYn+48cmG/Hy6CglV2FaFPEFOirHEJ9Ob28xazRuFIYt" - "sjjOf9p6RJeeUqCAz9OXGA2YN3DiHzrjw4du66zT6VyCNZvNdzk+hy1XpDw+R18iHXRzJtJF" - "Y4uvrrpdgBP98vJds9vNfqmlXBGv05dIR6+w9tiThLet62tkn50h+xzs8GVL/lIvF0X1Gh3g" - "S/a5oEt8+PYtws/AFP2wxfgfeqkj3ww052R0OE35HGtrFEWTfxBwDUZ6NauDnSq6LNNM1/CK" - "jl8w8znSg4DoEcDZG0U64b9indBukdhuKvWSTsqVV+iOH9zSBe0C3Eiv/3yFJxjoCi/orNxE" - "73YBbqbXiS5vAJn+TD3TMajW2G5hBuHPeBwEQ1wbtjrklfuCoePrtVDgsV3QujWFJzoF1Rqa" - "XNlxafSOoOO1zeye6TWkf8KvvBa3d+w3V8r3SKd0mPJxthVeU9Q+adno9Rco3kwfXAEZ6JwO" - "G/QG6nKhg+cL2nkMgsippFRbUK+uHYKd6G/edDoUiPcmz9TrB3jSjZnef59WqLag0yQd262V" - "pLfedC5L6RMImzXEPK1EjTS+9XrjcQX9Qpkv6NQoKnqzc8lZZNOu6LBUo4dBUJnMRV1hOkXk" - "rnRIqPWMW9iMDmNzoxLfo3Kc6tjvrD0eh1Qhm5BI27XX9qt06YnOSzW673mV+1hMojm/P4+u" - "/A7dJYxtw2ElvRFDbj7e44i0d09F9TL5vba/f6Rrp0yhq0rwiyHG+xVc4swzIpugijnQq0TH" - "dEHPKLraaMFcPcEAkn6X9Dj+CAs/NM/PMedVzMhyg3Vg/6A6xhpsoIuRh+oM4rfSD/P0Q3qP" - "dQbolEzzB+gHcnUGB3HaR+AaifjcRAp3j3iCS3svqV5J7Z37jL63R9IFXZRYogRyi0XUd1JP" - "OxlsRCc8weuQTmwd/gGH9gUd7/SyjcCF+vaQvDeR7/t9nT4mZZNXzC8asKsBnrBB1zYo1H2V" - "8RodEvnPrfRaDei/ERwb8GxZfmMr6wkIr58WBA3qCU5Pi7qJXf2V4Eu8X2rLclsrWj+DeHUa" - "5QPTnwr0GhjQCQ4tQ+bzJImC/HCv92LC97xz1243qMKjvXpVq0n9NchQpRx/6SvlRM9tq+T6" - "SIUPcfdFwZ8mk9oLVMxksJ+OKEnZfAywOB6DFbcl8j2wwPOlydbDq/DgYG8P/6Funa3wAPeK" - "G0KF/p3w6POL16McHfQfHR1Uq9W9XwIKRM2GpB7gG1sSxdnjhIsnJjJNTWDfvxdo2lG8Y8Bo" - "E0IOmbZTNuYmwMtEFuphbjLgl8sbOMrwNPXMG1mbM99JEBwf6zPf48Pi47zAf8QuJUK6GCm9" - "sG3YAN2kp41AwME5OPEBfTGfa/Mq9PmPcBAmQ21ebZg2Ugz0VMHT9PNn3odAgyn57iPYjBta" - "bKz922w4Ne3SmOjaOPuZR0BlPMWLY5BGGl1bpV7a6TxwQXmQeN6F4FacqoZ9G8JKl0Mu0++0" - "75AVFyveRtdHRdHby/5eVjvIvcDkEnHMQseNBTUT5fdS1TtMbcvu0nb6TW6SM+7pJQlIh4K+" - "Vb1Fe6SPclvoAdiztKcp7LxTp0P77+jp/F4qVySZ10b91pjxC3TEczeF/xHc01Jv8wPs8c5d" - "mtLOA0BGL336UZKrqs8xxIzDU7MSOveY2AfmLd8UPSdmeA3jqcvMbAV3C9XOPS+bxKqsQ9bo" - "jk/7yjyjd8g63UW57IEtX87UIa9WpdHCRAftor+nAYhbl//0OZ+cTgQdntW4Ph920p6pR+XQ" - "zrk9oXT0jApMbKRcnpHJ6+ioXcY91haH53s701Pq0mgOtTwCKgSfs3ZQj/kJ5g53i0ihaDgc" - "/n9/C5Gmw+Hxbn/H8S+cD8xcYY4GnAAAAABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -whidbey_dock_pane_left = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" - "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" - "q62xgIjQgpXEgJbUkJjAkJjQgKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjAoKjW" - "qLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of35/D4" - "8Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAA+wCLtAAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAeDSURBVGhDtZr/f9JGGMdprZPJnHSKm9OKI4DG0K5kWAptGIw5FGqpdQL5//+Q7Ply" - "d7kkR3L4ms8PWmjyzifP3T33PM+1FO1gQ6/u+DtcH5V2uPh86DmOvwt+B7p7etLpuE7jmb0g" - "e/qr09MTwDvOM3u8Nd3tdrunYIB3rPG2dIQzfRf1lnSCCzrgbX1vR2e4pNurt6IjfDTiJ3S7" - "JycezEwr39vQEb5OmuXMsaCT8vUn3dYdO/XFdPJ5hm7n+0K6OyJLaQ+CjtcsnjlFdAEfpfwO" - "9E6zWbhqC+gSPlrzKwgLR6Mg8IrV59MVXNIBi0b0fr9QfS49hgt6GDJevMmwKObk0fuaL4gH" - "cMZLOuBzfZ9Dv1xMp2P5AMETnlH0odN0Gtvj/Xb65QLpEr+NPmw2G9vxOdrn8+treAAYOmUM" - "Rh/AxvAJXyrAidmpf432KEI64aXLye9kGt3J2Qhz5wyqF/RRQjt8ENqDPHhBTlBM7+Ru4QVr" - "9epK+p49vgAT/gL5QeDm5wcm+n58y2ek89BOp4NLsmsynK2B24svvTQ8yEC/s6/wvc+fpe9n" - "s420W55N47G7CRV+vjDgs/Q7D+/fE/heCECeOQrNPyyXQHfxp96GNM/ni0U/oz5DP3iIdML3" - "QqRv5vPb9yk48fv8Jamn4R9lRiFNPzg8rCJ+j+BEX62ybMTLb3sRuQqXRRqfogP88BDo9/b2" - "LnDVJLhXV1czsPSzwh4NPS2BFD5JP3j0E1j1YeUeqE9SbmZTmikwdQaT5K942nJESuIT9INH" - "TK9WAL+n46+ubm54HqJNJpcaX1tyabxOBzjR0fWofl8ilkudTXHs7Vz+Ug8XafUaHeFEl+ol" - "frlcgmy5pjhKjueMX+mhjnzT1ZwT0w8eVcHwCfg/eqdc/hsBN2BMVNGeMH8pOj1Q7jNdDa/o" - "oDxDr/+LMw/gpDtDJ/wt/k7bIjHdVOolHd2SpFcrv9K7A50jTZoe0FrdGOgKL+jkcyMdRhTi" - "opEe0MzRvcLvEKtnOsJXutXQ7yRtRrNwHG9LIaVltO9xLCDPhPw1m8ITnZSv4M1XT9BqtRXS" - "f8ZbYaEwPZEDfxJ0ws/QaaHY3jHfXCv1SP+OmCl65elTvPWd2PuM9KGznd59BWSgf0/wtPYK" - "wYHO+/YW+i27JqWdyyCYOaXo5csamK79SW1V/fE+rVRc/DRXUnTMmjDduMCLBmb66XlUOm+3" - "k3T0vaLPbOiX8HIhjizmgOh3Kt9OTobDknt8nKCvVjiq1Qprp2wvRzs5XtEBr9E7npem07Tc" - "lQ4SwimnsDEdyuZ66WLUPW63flN+B+3o90qZtctlbvL7sO/58gXJMwnt0LBwgD46Pm614lHd" - "ge6l6MrvkF1C2eb7pWhwDeqBv/qorSapfTIRIcqkHRxL2yAODmqnzJ5GleANH+f7ACLDcbtt" - "pG/y6XWi44JL0FWjBddqf4r4BL1WuV8+Eo5XmjAYyHiDUcY7q+Mltwa6KHkozvTRNxl62Uhn" - "B4RMP8NL5teQDyTiDBbi1EfgGAnqf1+vtSBZk47fvA107R9l0RcMPc9rULBgOsVIESk92WIR" - "8R0KMJ45HCNrSC8/x3sDpotyOPzIrgmQ7hAd9lxtY8HwEJdqcm96MwXntFtM5m21Un5PvkE2" - "1DD0FPyfDdgsPUPXGhRqX33TpXmp6LhrM13ydDrNONrTl7hxyX01qVz6HX3v/onqdfqDB/8Q" - "XvBjegdmeqPxB8GXuLdo9ERrRctnoFWi06uVB/uYEyj1ko4LEfxC8M2mr2/mfS9Z3Ou5mBvg" - "qmo9Qbc/flyt3uX7N5vz875m2LdqsFvQXKV8NAJ6oq2SyCNJfatFdA2OCh1STNZsOs95QAWe" - "B2YIlm5LJHNgUk/0JBwwvn8Ghux6nSJjGg9wJ90QSuXvLvqG4b0kAj6dnTUaDT+Fxge7rD3b" - "kkjXHp0O8GHW38Xag/lfvmSeo77FlQWlTQfWkKmdkqmbmE5RQqiHusmAXy4H8C3DowiGxdQK" - "ytZ8r1+320dcvXHNd3O9eKeydfGcGywJIFcScMQ3DQ1QQ736uv2DLA1B/Rzpi/lcq5cgn4dq" - "AZZoX6tX66ZGioEe/RLXnR8+yGoG65nJ5B2YrJ+whLyILzV1aUz0+I7oA1RLXCuxcRUvvoNl" - "pNG1u9SP+XQuuCAESDp3ITiZp+CS34bIpcsil+mwxSqLg0suPo+ul4q08bCJ9J2kQ0bnmVwi" - "vsuhY2NBJkupXqrqrGLCmNNd2k4fkBtk5Db29FA7Rsyt6nO0w1Ye2xY6xsyv0g67FZ90cP+d" - "8oxEL5XTuSOxro36c+eMm6IjnhME/IfgTh68oKf3IqmdC4CYXnj6UbBWER97Rg0Day/qYOs5" - "gXngST08wXB2UKi8mB4xvps+96C0oPDMqcAz8ELs+/SJ0P90ZsP4DN1GuYVnhPpvdlYm1FMB" - "LTJUu5MyO+3S94IOZzW258PFo0ozVc571A7pnN0Jpa12oR5Phq3OyOTasdQu8RhbLM73dqZH" - "L1A3VQU5R0CpBW+tHdTj+gSzh+/0txC+73+7v4WIIt8/2u3vOP4D32mBB1S/lsMAAAAASUVO" - "RK5CYII=") - -#---------------------------------------------------------------------- -whidbey_dock_pane_right = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" - "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" - "q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjA" - "oKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of3" - "5/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAaHenigAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAe+SURBVGhDtZr/W9pWFMYtW1en67RzunWdpUvQlgWdMCoyJFkotbaRCrMryP//f2Tn" - "yz25N19ILn2enV8Qkn7y5s2555570414jRh4dbezxvnxxhonXww81+2sg1+D3jw7bbWarvPM" - "XpA9/eXZ2SngXfeZPd6a3my322cQgHet8bZ0hDN9HfWWdIIrOuBtvbejM1zo9uqt6AgPAr5C" - "u3166kFmWnlvQ0f4Ih2WmWNBJ+WLf8xYtOzUV9PJ8xzdzvtKejOgyGj3/ZbXqM6cKrqCBxnf" - "gd5qNCpHbQVd4MGCb0HFMgh836tWX05P4EIHLAbRe71K9aV0DVf05ZLx6k4GVTWnjN4zvCAe" - "wBkvdMCXel9CH96Mx6FcQPGUMwl94DZcZ3W9X00f3iBd8Kvog0bDWY0v0R5Ft7dwAQg0JYSg" - "LxAhfMOb8jExW/Uv0R7HSCe8WE6+Uxh0t2QiLM0ZVK/oQUo7fFHa/TJ4RU9QTW+VTuEVY3Uy" - "Ee/Z8RsI5RfI9/1meX9QRB/pf/IJ6fxox+P+kOKWArPVb3b1qT8XXKiAPhol+O6nT+L99fW9" - "xB1nUxg275cJ/rvjV3l8nj6d3Y57fGJ3CUDOnATNf0ynQG/iX917OjU6Pn6Vx+foU6QzvrtE" - "+n0U3b3PwInf4x9JfbR/cHzSzj3iLB3Y5OlrghN9Ps+zES+/duO7h/tMz+IzdFSOKR6Gl5c4" - "alLcyWRyDZG91rL7cBfjGPiZHErTp5gNOG5grPyVpsyux3RXkDr9UfoQw3ePgJ5J0RR9inTQ" - "zSORHpqKyWSGlhF9PB6NhsYxgP9IdMSn1Zv0KdLRFdbuu4IAvww21bHXkRxEONEPjtCblHqD" - "DvApe67ogqerqnIpVTKMGD+vPd5mY3b3ITLqNR3yOvEca2uv1xv+i4AZBOlVjsmE8gYPvnv8" - "eFvhmX7S/ls/2oSO4097jnTPIzq4MqNakKMT/v2mST86Anz7dxm1QiflmoDSvUu6d6BzpcnS" - "fXrsSGfxqB28B/xY8IrOyovo8EShLhbSfcqcXzc3t5lMgeqDQJUSpmMdX2K7hSMIP/2B53VI" - "+jVlYainJTqO0yzcH51RQ/pcx2LxR6AqFdGpDi6hyZWOS9OhAjM91QPTiege0jc3t7b350r7" - "PAw/zsEcVo90moFC7EM1HZ4pab9Sc18hfUAj4jBHh7xk9UDnCp6j1+m2rzjPgxX0O7EmpR1H" - "VRD0kU61BfsrUzskO9GTLM3QsWvCdoPSCo1P0Skvg9t+vEHjEEe+0PEfLoR+LWOgmn5wMIeU" - "Ad9D+OTMudxAX2jkKzo1igmduj0coyvoZDxrBzJgFf03rGhAH0ZqlDCdMnJd+hbSKSWFjvl/" - "ctLc8N+gclzVse+s3R+0SNYQnyi1v+mMJN8HPc6rGtH3Te1Cf+OrlWjKdzu6ytra1ve75Ln2" - "nSra8cVG3FeL3HS++z3SPhqVaG95Hk2DRFeFQPmO9BcvMN9fwgpdO0M+LGQc3pfT60R/ipVA" - "j9VwvkcV51seq89x70J8F7rvXynj+Rflu9QbrAPeOY2Jpzk6wb9RlYDwtnSeO5ZMP0f6T1CA" - "M9r39va+ljrD6lMrUpg9uL7ev4anrrV/lEUfFlHPoTOwvJs1cj4XuHTYpJ52MjiITnif6Wo5" - "vPzI1vhId4n+i8yrwNzDWQQ/STn7jkHen52Z9MGApA3lavKJV4a1sOuw9CK6guvVAeMNOuTb" - "O6Izje9B/sb9K+ctHq4n86rWLnBj7UF4TW8BvU49wVDxNR2POc6fePAtzHvKmoSewM2VDeIT" - "OqzlXJfpol7ocAi2ZxgOQ6n26BHyf6AwPDd9N7znnbtGo87zB8TFBVTkJHDfymFbEvzO7pMn" - "iq6V66dqPlqEw/5FAgdGzyXFFI2G+ys/UI4HD7T6JFvSOZPKHN5zNADwZ6dzDoHsep27BY1H" - "c3bIG0lFlYmZ/p0eLXruPOumEfDt/NxxnE4GjRdG9Vs7TyBMW4x8l97sOTrAOxe0aoL4/Dl3" - "neRXHFmwtHlQAzpYn4HnV8OAh4Sg3UalHtZNBfjptA+/MjyOIXO2dnay8IK19nPPOzzkW+E1" - "3+z25irp1tV1ZtilQK+k4IAH+ldiQPJZsF6tewpO6iOk30SRsV6Cfh5WCzCf94z1aq2Whxfu" - "EyTwOP7wQVYzuJ4Zja4gZP0Es1bzUsut5ZRn8j1//AMvAZPgVbz6DWZ7g14At9rjgBIgeN6F" - "4Facqkb5NoTF/gxCaKVn3INeKZTiy+jG7gxOHjKlqvadpMPY84osKR6r5plRRGsONTVJ9eSJ" - "Sr7h0C7ZXVqtvU9GCKZwTw+1Y8Vcqb7EmV6C1mrT+5FBgDXzi7THMey8U6dD++94E+m9VK5I" - "Mq4L9ZfmTDNDR7z2neCuMfTyFyjfdeMuLdFOm9fJU7V481Sxp5f0Oen9d/pm8dasgi59Tvad" - "Da6ZLN7bVNEVnrpMHQuAyyxQMpgs3q/qDtmgWymvrJHSiGS1Wym3ouc75MXCwvNst7TSQcmc" - "dlt1qHZvyuy0y+oE8h7p8K7G9v1wZc7oNgpHFdE9oJdlij5mSZe8x9pS+ZZpfbrCY22xeL8n" - "fFvt4D3qplVBySugjGH2dMRDrgDdznPrjFS4Tqfz//1fiDjudA7X+38c/wE5II6oZulXWgAA" - "AABJRU5ErkJggg==") - -#---------------------------------------------------------------------- -whidbey_dock_pane_top = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" - "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" - "q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjA" - "oKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of3" - "5/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAaHenigAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAe1SURBVGhDpZkNexJHEMcxrTVNao3G0PoSaXmJ4l1soBhCCUdBmkaPCDFWCN//e1z/" - "M7O7t/fC3aHzPMqFu/3t/2ZnZmeTUrCBnZ83m2cbPB+UNni4NxweHx/9tsGIDei92bBF9B+L" - "44vTu6T8AFb+oTC+ML07gfIjppe/L4ovSofy1nGjIfT9oviC9O6kBZ83flf0ovhi9NccLY2y" - "sv39gvhC9NeT4R/HR5q+Xwa9GL4IvQmvLBcRK4gvQG/+DZcvP8JG2hYF1efTSflxY2HIdLHY" - "gxVwTi696VGCptLz8Xl0Ud4oR90u2vOXNodOyjlYFjoa+VPT89Rn010ol+xXdP1Bq/oI9jA7" - "azPprguX23T4R7QbejY+i/6q1YJXpLYwlZ0foz/4LqOkZdBfvaJgaZQzPbP3IAu/nv7rEYxi" - "g+xgIfVrgX+44FV99HAP7J2dra216jO0/3RULkfpPAP9p+lg37u3Hp65r/oHByE9GvDy/e4u" - "2Bnw7F3bD+kQbGbS1w/y4Dk9wd29vcePtc5dtp9/1rOQ8jt3MjfBnFwlPLtgd2dnG7YD291V" - "88Et2fBU7eNQz2fgiU3kLWVPnhBflHfCRwcpb5GifTw2+M5n4Mkf21vbh7fanvzCPoLy25XB" - "+9MUfJI+v55NuqKjswLw7v3729vPDVounj6ld6Grzi0/6vvTqRplvUOCPie64Dsrot9u3X//" - "PgbHj5VthgPP8BkGDZtx58TpYNODo7cMZ/ri3yQb3/yjv+0EN77QE/gYnZTjuclodH4OONON" - "XV1dXcLic606V7PZdDoaDRP4KH0O4TPaOPHgX1HK9eWE32oy6fXG0VtXRJ/QmDg+Qp8THbqZ" - "PmxGZF+Ty5g+mYzHA+see4X8ksTb9DnRySui3atpBPxlsQk1euvrm+JzQ4/43qIDPhefK7rG" - "86x4d8tGI1/wC7CnfEtpH7asyAnpeMz4fOh5XrfbHfxHgGsY61Ue05h3hs7TGrqFN3R6wdDn" - "RHccpsMr1ywuQWf8Dd3TZPpstUK8prPykEDSnXN+d9Dl1eN0T5Y9hW7wii7K0+hY0ekauseR" - "Y3tF3iFUL3Ra9tUSRhlEn17fcdos7ZIDYkQ3lNH9JSB4P36CPSPDlBk80zmoVp8+faJBZCEd" - "iSJ03LVM0Rl/Sa+8kmQaLpmi8UTngB3J95qONWXtFyqYU+l9zoh0euslyKBLOiToFX7tC4nz" - "4Rr6jbgmph3SW60TxH0p4Npi3klpR7Az3URpjL5iv7suh1UvnX5yFpQ4D8lp2jM0cKnplzoH" - "sugDvNyKVlZTWiewN2/6/RL5hTNf0VcR+gB+4ThfQ2fHGzqGMkXoruOUBr7KEqFzRIbai9Eh" - "YTXheLXorlurlLx3pByrENHu9V0ji5ciTXu/K3FFEtgzEe1us1YrvfOYbejivWJ0FbWGbvzu" - "wmq1drsU9Jgd0iWbvC5rH49ViUrTDsfyNqjpJptaDK+2Kd5fYhFS6JLm2fQK0yldyDOG/obg" - "z55xNgUvaIm131UlQAm+UPFgRlEl0MWGqoxzyjlxk0KvgS65KviidJG4Evop0f0Z+oFInXFE" - "uaIz3qpxqJEw2ZnfYtXVakH6R1pzolMRdar8hNBViWWKU6syXHeprB4mYynLQWe8J/ShTL76" - "KK7xiF5jOu304cZC5UErN3Tx/cmJTe/3WdpAz6Y/aWbPA1ukJ+jkF9XymX1V8BYd8cYt3kBo" - "8g76miOOe705bVzhMFt5qF1Fjv2Y41S4Jxgofkh3MXO1+ifD57S3WMMs5TadnWMe43wQulav" - "6ZSI8AvDb2+79mbedep1iRYxuxdTvicPuW69XpH9A3Z2hopsDMsJn5sWuGmUD4egq2hJ0vXS" - "EhyPGTgprLFitnq99lwWVKwpi9GHRZVHtSvfE5yCygLgst0+hRG7UpFuIYYHvBZVHqeLevJ5" - "9VknisBPp6fVarUdQ9PErB5wlaHpfueiIMWTloZPTbAvXxLzmG8ps3C0cZFDgJs4T1tV/g54" - "nchKve/zzh+z+byHbwQeBFiWuM/jMSMzvnCcw0O5ZPX+9Wx6Ybp1Ncc1dSmo0QpO+HpCecLv" - "xKw4Cg484ESf+r51XkI/j9MCUrRrnVcr1Wro77WewQ0DD4IPH/Rphs4z4/EFTJ+f6Ah5HhJT" - "4Hl/mfggR0Bj1FmZ8xPSyKInlad6xnpMjkQoARqPZnuqW3GuGokDcGSSzN9x6EOu0LHFGguL" - "SyY+i24f5lRvr/t7Xe2Qe06aS9R3GXT6xYI5E+neW21UFv2kth6/nt6LnOQUXW2rZi5IR8Vc" - "i8/Qjr/ShLaGTjXzq7QHAX5/zZ0O7eZMl0aUtnD6TyqSzutU/Zkx04zRCS8NgqKjcFmpVyxX" - "w6ekSzPa5QAQ0pMlNzZBzu/0TJ+TEjNwS0rhKp5NVDGlz2lFOjXq1aKtxZqoydGu8dxlhrYE" - "3LRzX5dNalTYIVv0QsrzqphsJ7pDtulFlBeiJzvk5TI3WuTFc/1u1PPxR3WokXbum/yu8Rz3" - "RO92sYVa7dw308X3mu6kbdCbVwJrhIp7qi1prcXXxrseJ3gqXPF27ts9Q4FJuvlUkLb7p09R" - "KGZkKHdpsOLwYhGphLXbbTqeZ3gifmsD7UHQbh/WNoEH/wMcYo64Ex2PFwAAAABJRU5ErkJg" - "gg==") - -#---------------------------------------------------------------------- -whidbey_left = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAaHWVZ3egZ3e1cHilcYCncYa0dpC4ZobHcYXGcpDBc5fWd6Dld6Pwi5OzgIjQ" - "gJbUkJjQgJjggKDXkqHCk6TWhafggqfwh7Dwk6Xgk7Tkl7fwoKjWqLDIoLfnpMLwscHnsMfx" - "tdD04Njk5/D49/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAQ3JLMwAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAF4SURBVDhPfdTbdoIwEAVQL6htAi0tElBaoVb+/xPTM5M7wc6LLvc6GTIJbnRel/DT" - "ZkUvwXOefsahdqGMJ2LvSwaO4P7d5BdMWejQ9+dzzhOiY4/quu4z44kYSebudbH4REwLm7Q6" - "Jr2hk+lrGR4e7Rb17ZRSdV23v55vxL4vsRCBOesXRrquBbZm0yb7jIHD/EDNKPpUjRBvbmOU" - "Heb7/f6g/aISJhz6R8J4MJvmbM6FGSrPmRaM09i0YZ4zDdHxTN8909I8RMtzyu3NztgwbyxK" - "qytlq6pK0qqROC/0vipGzx0v7ll/MAY2Y1G1SWv9UpXlCvNlpiPZlyjX2w4VJ/rlZk7+D3Oe" - "DsoXwqoNV5HzKHtidJlUC3eXifuXZcxNE91U4xFLIb6jm8oeWIKLcFPN/jxLKY/HhM3+TUl5" - "OhU48eQN9Y6VTwe6D+kLbJ0W3m5X3m926ntgXb7+eg/z2ZzJhcuusN4Lsds9/WfSuhBes94U" - "C6r/AM3yZVcU56/qAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -whidbey_left_single = whidbey_left - -#---------------------------------------------------------------------- -whidbey_left_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" - "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" - "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAGNSURBVDhPfdRrW8IgFAdwLyuXZLIUy67D6dK0pd3w+38xOuewAYOMN3ue/fbnwHZG" - "R8ej5251Yu33nMfcHw8H1iNOxsiNh5xkGUfvmqIBg2YZ8KBrvM3J5BoGH7NBnW9xMjHMGTjl" - "fQYlxvKYh/V5jErc5MEdJxMOAx/BKxZI0w/LkI340aZx5jZzdmdrU92TjKr8IbB2szHKqv1+" - "r2Y4hFDINzWf082A2Xxu+II0TDNU4KcnAcNPz4TiV0P6pp1XKduM9R0XZdlipXBpnNXpgGl3" - "Hu+qdSnzZ1sb0libpab2rqrKMs/d0tqstz+QhwfUt/dabFrrbYXzy1OsNwf0Fgs2TB+ad77B" - "6SNOba9B/uV49D6ZqIvX3bJp1m++mEBO710rLg8wv8wNmVZj6ZdrxeWatmcZW9FjXbxj3ufR" - "6NPr8wLyHnM28vtc6+INX08+w9LTKednwS9I+TwnJg3+UMoTGw3/7wKndxqyXq3gAdg9ZaO0" - "1oab8yo+mRYLKe1p9se5tpCX/7G+dUfhL8vucupsrDz0AAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -whidbey_left_focus_single = whidbey_left_focus - -#---------------------------------------------------------------------- -whidbey_right = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAaHWVcHilcYCncYa0dpC4ZobHcYXGcpDBc5fWcZjgd6Dld6Pwi5OzgJbUkJjA" - "kJjQgKDXk6TWhafggqfwh7Dwl7fwp7fXoLfnoLjwsLjjpMLwscHntdD0wMHg4Of35/D49/f3" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAWZqHkAAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAFySURBVDhPddPbeoIwDABglDqoFDcVGBVw8P4PyXJoQ0sxN+L3m0NDzVaJx/YoT5k8" - "9fbAhfve2luS77kfhq5rir077pkTZ34Ng7Vt2yRO/ELuUPeOTIWxdOrA3Fc46p/9AVobsgnm" - "Z0b1xRsTeLa+EV1f+jCBQ+8DlnzgsDBX2fLxYFR8WeYtxJF/u65tF95KM0/TNEv+ZzZfkElL" - "TbKhuDEVnJ/4Z1+cufpmfsBwC47newNV1fV6v8cMTqMx67Jkhs0s3YIRsNbqHDCePczWhVIx" - "S28NoVRdRyxrMaR5zZPjdcDJha+opxOf+33ACthtrR/glkY7LzmXs5npjbn3VqqcFHmE2i0E" - "934+fd9PjKXdvylbR7yn/q7FuVB8HOF9uMJUOsjF3retb9PcysuFZ+aA0QrJJXYzC6/Fk+IO" - "Eee628IOquJcx5wP6nYV9cYvGpYBKucNRqNHpfW+r9+580uS63vjD855vvXcF4fvB7r+A9+i" - "Xf4K/oDaAAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -whidbey_right_single = whidbey_right - -#---------------------------------------------------------------------- -whidbey_right_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" - "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" - "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAGXSURBVDhPdZTZVoNADEDpaC2CFSqC1hVaxWoVqdv0/39szDIraF7gcHuTTCankbJx" - "6V7tW2TfTprVmDvcNKsxt7ismnbzOPQ1npaMh5zxNMdo4Afr0CfMNK8Bv4UcMdBzwshDHzBS" - "wlWN6QM/UmKecu68hBj40ed8nmrOuN28u/qR+op9XNfANw+mf8asow31ge8Mh9au4zhlRIF+" - "1z2zjwcTiKWL/f6p2zFHHMdJWkpty77/lpCffcQ3IwzHY5+GitkDG8fTddv/MB2v+9n6dlVJ" - "aBxq9/Dk/l+95IDgu8b3eD0GJ1ibTmYwzqFt12wTLn07xKc51XW16XqaF20D1jPVtRHf3XHn" - "Sxyqm1ovC5r+MZ97OcJEj/TULuA+B3ZRFIdm5njd/o1JaSgmvzK7Bh8LXAt8kku1/8KaAr61" - "u+ZsQ1X0Aauks1tsKdhCzGb4gzMKr66uTTzLFwuNnctjmUycb3t2m6om7JPtu3qZyE+yBURI" - "+UogvwAM5QfUYOw/ybIhtVghPuBUXrg/LiHG1NmwcSNXqV+4tHLqnJPo+QAAAABJRU5ErkJg" - "gg==") - -#---------------------------------------------------------------------- -whidbey_right_focus_single = whidbey_right_focus - -#---------------------------------------------------------------------- -whidbey_up = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAaHWVcHilcYCncYa0dpC4ZobHcYXGcpDBc5fWcZjgd6Dld6Pwi5OzgJbUkJjA" - "kJjQgKDXk6TWhafggqfwh7Dwl7fwp7fXoLfnoLjwsLjjpMLwscHntdD0wMHg4Of35/D49/f3" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAWZqHkAAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAFmSURBVDhPhdTtdoMgDAZgW3GKWjsL2i/X2vu/SJaEBBXcWf6Jz3l5i9bMpdNXR3Xa" - "Wc/StXNfKXXawaktm1rrUuWHJCWxX01TA1bqkODYlm3bNjCAVYwji9TbneStJcoWcNR5Yz0V" - "mySvLVJrvW/buq7g7NadVxbpvJ3taSyWUuef9cx6kxwsdU3sprPY0tJEucboqginwZapjfqC" - "1UUhT9BboXb28Twfa42pQjLZQMUCwiHbdZKMdqFsPx+PeZee3w2w3WpXugvUY7GAsXPmLvdx" - "HITzXe4QbK8Klbvsckcr+C/bF0WeZ+52ez6Bw+D2AwxdwAxwhRsaPDp9hA4OLWGpSn1pVlZh" - "X8Cg2dpNLlxwrgFKFpP/sRqZf26Ph3T2Te8w3AyijSlJ8fuA1v/Acfy+0Dxp8DyZig2dr9fw" - "WXj5ExoGnxpy5TSi78c0gRUacvE0XjvfsGnqwuryH3q/d6hz07L6CxOEXf5LAPv7AAAAAElF" - "TkSuQmCC") - -#---------------------------------------------------------------------- -whidbey_up_single = whidbey_up - -#---------------------------------------------------------------------- -whidbey_up_focus = PyEmbeddedImage( - "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" - "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" - "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" - "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" - "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" - "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////////////////////////////////////////////////////////" - "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" - "4iUAAAGTSURBVDhPfdQNV4IwFAZgpEyCVBRZaR8OUcI0yrLw//8xuvfuy22e7jkKZz68uxtg" - "0Pm135fl24XxwB/bNU1VFS/+D77d/TY12lsPe3aLqTkUu3Gxa7cHSC3IsmsHOxZS64pzYTMH" - "23Z7qKFXvpTWwZZd0w5wJivLbHxu14fmtSqUzRhYC5/ZEuY/tVbZ2NjyA1o9/UB9qmrtZG0x" - "teKtdnjSplCmDWXLd7xZF63G0opUzux2Ra5eoLCYShvQqv2io7IymewGUsV9lVYdcG1TqAnd" - "QbSbDbR6bqETkastYbCruob5xTNAhpp27PgK7WqFG8DZvz2kY8DBQwGF68XKW/HUtPCBE1rb" - "dJKCjOMwDLq7gjHbkscvZUEOBiGtLc+NtTdYjCcJyFDsQ2cshOnr1PlYUmH7aTqbqYyEajRS" - "12Bqr6f2V2CaLInjCCqGShJ5NTRAVOQSRokulDWfozap2gLGmaMwetIv7/yeulGpxnb94TCK" - "Hp23fLHAedSgeS/C4fHo/y89R5qqfhF9+xJGvszoH5Xccuo6pVT3AAAAAElFTkSuQmCC") - -#---------------------------------------------------------------------- -whidbey_up_focus_single = whidbey_up_focus - -#---------------------------------------------------------------------- - -whidbey_denied = aero_denied - -#---------------------------------------------------------------------- - -# ------------------------ # -# - AuiToolBar Constants - # -# ------------------------ # - -ITEM_CONTROL = wx.ITEM_MAX -""" The item in the AuiToolBar is a control. """ -ITEM_LABEL = ITEM_CONTROL + 1 -""" The item in the AuiToolBar is a text label. """ -ITEM_SPACER = ITEM_CONTROL + 2 -""" The item in the AuiToolBar is a spacer. """ -ITEM_SEPARATOR = wx.ITEM_SEPARATOR -""" The item in the AuiToolBar is a separator. """ -ITEM_CHECK = wx.ITEM_CHECK -""" The item in the AuiToolBar is a toolbar check item. """ -ITEM_NORMAL = wx.ITEM_NORMAL -""" The item in the AuiToolBar is a standard toolbar item. """ -ITEM_RADIO = wx.ITEM_RADIO -""" The item in the AuiToolBar is a toolbar radio item. """ -ID_RESTORE_FRAME = wx.ID_HIGHEST + 10000 -""" Identifier for restoring a minimized pane. """ - -BUTTON_DROPDOWN_WIDTH = 10 -""" Width of the drop-down button in AuiToolBar. """ - -DISABLED_TEXT_GREY_HUE = 153.0 -""" Hue text colour for the disabled text in AuiToolBar. """ -DISABLED_TEXT_COLOUR = wx.Colour(DISABLED_TEXT_GREY_HUE, - DISABLED_TEXT_GREY_HUE, - DISABLED_TEXT_GREY_HUE) -""" Text colour for the disabled text in AuiToolBar. """ - -AUI_TB_TEXT = 1 << 0 -""" Shows the text in the toolbar buttons; by default only icons are shown. """ -AUI_TB_NO_TOOLTIPS = 1 << 1 -""" Don't show tooltips on `AuiToolBar` items. """ -AUI_TB_NO_AUTORESIZE = 1 << 2 -""" Do not auto-resize the `AuiToolBar`. """ -AUI_TB_GRIPPER = 1 << 3 -""" Shows a gripper on the `AuiToolBar`. """ -AUI_TB_OVERFLOW = 1 << 4 -""" The `AuiToolBar` can contain overflow items. """ -AUI_TB_VERTICAL = 1 << 5 -""" The `AuiToolBar` is vertical. """ -AUI_TB_HORZ_LAYOUT = 1 << 6 -""" Shows the text and the icons alongside, not vertically stacked. -This style must be used with ``AUI_TB_TEXT``. """ -AUI_TB_PLAIN_BACKGROUND = 1 << 7 -""" Don't draw a gradient background on the toolbar. """ -AUI_TB_CLOCKWISE = 1 << 8 -AUI_TB_COUNTERCLOCKWISE = 1 << 9 - -AUI_TB_HORZ_TEXT = AUI_TB_HORZ_LAYOUT | AUI_TB_TEXT -""" Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT``. """ -AUI_TB_VERT_TEXT = AUI_TB_VERTICAL | AUI_TB_CLOCKWISE | AUI_TB_TEXT - -AUI_TB_DEFAULT_STYLE = 0 -""" `AuiToolBar` default style. """ - -# AuiToolBar settings -AUI_TBART_SEPARATOR_SIZE = 0 -""" Separator size in AuiToolBar. """ -AUI_TBART_GRIPPER_SIZE = 1 -""" Gripper size in AuiToolBar. """ -AUI_TBART_OVERFLOW_SIZE = 2 -""" Overflow button size in AuiToolBar. """ - -# AuiToolBar text orientation -AUI_TBTOOL_TEXT_LEFT = 0 # unused/unimplemented -""" Text in AuiToolBar items is aligned left. """ -AUI_TBTOOL_TEXT_RIGHT = 1 -""" Text in AuiToolBar items is aligned right. """ -AUI_TBTOOL_TEXT_TOP = 2 # unused/unimplemented -""" Text in AuiToolBar items is aligned top. """ -AUI_TBTOOL_TEXT_BOTTOM = 3 -""" Text in AuiToolBar items is aligned bottom. """ - -# AuiToolBar tool orientation -AUI_TBTOOL_HORIZONTAL = 0 # standard -AUI_TBTOOL_VERT_CLOCKWISE = 1 # rotation of 90 on the right -AUI_TBTOOL_VERT_COUNTERCLOCKWISE = 2 # rotation of 90 on the left - - -# --------------------- # -# - AuiMDI* Constants - # -# --------------------- # - -wxWINDOWCLOSE = 4001 -""" Identifier for the AuiMDI "close window" menu. """ -wxWINDOWCLOSEALL = 4002 -""" Identifier for the AuiMDI "close all windows" menu. """ -wxWINDOWNEXT = 4003 -""" Identifier for the AuiMDI "next window" menu. """ -wxWINDOWPREV = 4004 -""" Identifier for the AuiMDI "previous window" menu. """ - -# ----------------------------- # -# - AuiDockingGuide Constants - # -# ----------------------------- # - -colourTargetBorder = wx.Colour(180, 180, 180) -colourTargetShade = wx.Colour(206, 206, 206) -colourTargetBackground = wx.Colour(224, 224, 224) -colourIconBorder = wx.Colour(82, 65, 156) -colourIconBackground = wx.Colour(255, 255, 255) -colourIconDockingPart1 = wx.Colour(215, 228, 243) -colourIconDockingPart2 = wx.Colour(180, 201, 225) -colourIconShadow = wx.Colour(198, 198, 198) -colourIconArrow = wx.Colour(77, 79, 170) -colourHintBackground = wx.Colour(0, 64, 255) -guideSizeX, guideSizeY = 29, 32 -aeroguideSizeX, aeroguideSizeY = 31, 32 -whidbeySizeX, whidbeySizeY = 43, 30 - -# ------------------------------- # -# - AuiSwitcherDialog Constants - # -# ------------------------------- # - -SWITCHER_TEXT_MARGIN_X = 4 -SWITCHER_TEXT_MARGIN_Y = 1 diff --git a/aui/aui_switcherdialog.py b/aui/aui_switcherdialog.py deleted file mode 100644 index 552cb84..0000000 --- a/aui/aui_switcherdialog.py +++ /dev/null @@ -1,1216 +0,0 @@ -""" -Description -=========== - -The idea of `SwitcherDialog` is to make it easier to implement keyboard -navigation in AUI and other applications that have multiple panes and -tabs. - -A key combination with a modifier (such as ``Ctrl`` + ``Tab``) shows the -dialog, and the user holds down the modifier whilst navigating with -``Tab`` and arrow keys before releasing the modifier to dismiss the dialog -and activate the selected pane. - -The switcher dialog is a multi-column menu with no scrolling, implemented -by the `MultiColumnListCtrl` class. You can have headings for your items -for logical grouping, and you can force a column break if you need to. - -The modifier used for invoking and dismissing the dialog can be customised, -as can the colours, number of rows, and the key used for cycling through -the items. So you can use different keys on different platforms if -required (especially since ``Ctrl`` + ``Tab`` is reserved on some platforms). - -Items are shown as names and optional 16x16 images. - - -Base Functionalities -==================== - -To use the dialog, you set up the items in a `SwitcherItems` object, -before passing this to the `SwitcherDialog` instance. - -Call L{SwitcherItems.AddItem} and optionally L{SwitcherItems.AddGroup} to add items and headings. These -functions take a label (to be displayed to the user), an identifying name, -an integer id, and a bitmap. The name and id are purely for application-defined -identification. You may also set a description to be displayed when each -item is selected; and you can set a window pointer for convenience when -activating the desired window after the dialog returns. - -Have created the dialog, you call `ShowModal()`, and if the return value is -``wx.ID_OK``, retrieve the selection from the dialog and activate the pane. - -The sample code below shows a generic method of finding panes and notebook -tabs within the current L{AuiManager}, and using the pane name or notebook -tab position to display the pane. - -The only other code to add is a menu item with the desired accelerator, -whose modifier matches the one you pass to L{SwitcherDialog.SetModifierKey} -(the default being ``wx.WXK_CONTROL``). - - -Usage -===== - -Menu item:: - - if wx.Platform == "__WXMAC__": - switcherAccel = "Alt+Tab" - elif wx.Platform == "__WXGTK__": - switcherAccel = "Ctrl+/" - else: - switcherAccel = "Ctrl+Tab" - - view_menu.Append(ID_SwitchPane, _("S&witch Window...") + "\t" + switcherAccel) - - -Event handler:: - - def OnSwitchPane(self, event): - - items = SwitcherItems() - items.SetRowCount(12) - - # Add the main windows and toolbars, in two separate columns - # We'll use the item 'id' to store the notebook selection, or -1 if not a page - - for k in xrange(2): - if k == 0: - items.AddGroup(_("Main Windows"), "mainwindows") - else: - items.AddGroup(_("Toolbars"), "toolbars").BreakColumn() - - for pane in self._mgr.GetAllPanes(): - name = pane.name - caption = pane.caption - - toolbar = isinstance(info.window, wx.ToolBar) or isinstance(info.window, aui.AuiToolBar) - if caption and (toolBar and k == 1) or (not toolBar and k == 0): - items.AddItem(caption, name, -1).SetWindow(pane.window) - - # Now add the wxAuiNotebook pages - - items.AddGroup(_("Notebook Pages"), "pages").BreakColumn() - - for pane in self._mgr.GetAllPanes(): - nb = pane.window - if isinstance(nb, aui.AuiNotebook): - for j in xrange(nb.GetPageCount()): - - name = nb.GetPageText(j) - win = nb.GetPage(j) - - items.AddItem(name, name, j, nb.GetPageBitmap(j)).SetWindow(win) - - # Select the focused window - - idx = items.GetIndexForFocus() - if idx != wx.NOT_FOUND: - items.SetSelection(idx) - - if wx.Platform == "__WXMAC__": - items.SetBackgroundColour(wx.WHITE) - - # Show the switcher dialog - - dlg = SwitcherDialog(items, wx.GetApp().GetTopWindow()) - - # In GTK+ we can't use Ctrl+Tab; we use Ctrl+/ instead and tell the switcher - # to treat / in the same was as tab (i.e. cycle through the names) - - if wx.Platform == "__WXGTK__": - dlg.SetExtraNavigationKey(wxT('/')) - - if wx.Platform == "__WXMAC__": - dlg.SetBackgroundColour(wx.WHITE) - dlg.SetModifierKey(wx.WXK_ALT) - - ans = dlg.ShowModal() - - if ans == wx.ID_OK and dlg.GetSelection() != -1: - item = items.GetItem(dlg.GetSelection()) - - if item.GetId() == -1: - info = self._mgr.GetPane(item.GetName()) - info.Show() - self._mgr.Update() - info.window.SetFocus() - - else: - nb = item.GetWindow().GetParent() - win = item.GetWindow(); - if isinstance(nb, aui.AuiNotebook): - nb.SetSelection(item.GetId()) - win.SetFocus() - - -""" - -import wx - -import auibook -from aui_utilities import FindFocusDescendant -from aui_constants import SWITCHER_TEXT_MARGIN_X, SWITCHER_TEXT_MARGIN_Y - - -# Define a translation function -_ = wx.GetTranslation - - -class SwitcherItem(object): - """ An object containing information about one item. """ - - def __init__(self, item=None): - """ Default class constructor. """ - - self._id = 0 - self._isGroup = False - self._breakColumn = False - self._rowPos = 0 - self._colPos = 0 - self._window = None - self._description = "" - - self._textColour = wx.NullColour - self._bitmap = wx.NullBitmap - self._font = wx.NullFont - - if item: - self.Copy(item) - - - def Copy(self, item): - """ - Copy operator between 2 L{SwitcherItem} instances. - - :param `item`: another instance of L{SwitcherItem}. - """ - - self._id = item._id - self._name = item._name - self._title = item._title - self._isGroup = item._isGroup - self._breakColumn = item._breakColumn - self._rect = item._rect - self._font = item._font - self._textColour = item._textColour - self._bitmap = item._bitmap - self._description = item._description - self._rowPos = item._rowPos - self._colPos = item._colPos - self._window = item._window - - - def SetTitle(self, title): - - self._title = title - return self - - - def GetTitle(self): - - return self._title - - - def SetName(self, name): - - self._name = name - return self - - - def GetName(self): - - return self._name - - - def SetDescription(self, descr): - - self._description = descr - return self - - - def GetDescription(self): - - return self._description - - - def SetId(self, id): - - self._id = id - return self - - - def GetId(self): - - return self._id - - - def SetIsGroup(self, isGroup): - - self._isGroup = isGroup - return self - - - def GetIsGroup(self): - - return self._isGroup - - - def BreakColumn(self, breakCol=True): - - self._breakColumn = breakCol - return self - - - def GetBreakColumn(self): - - return self._breakColumn - - - def SetRect(self, rect): - - self._rect = rect - return self - - - def GetRect(self): - - return self._rect - - - def SetTextColour(self, colour): - - self._textColour = colour - return self - - - def GetTextColour(self): - - return self._textColour - - - def SetFont(self, font): - - self._font = font - return self - - - def GetFont(self): - - return self._font - - - def SetBitmap(self, bitmap): - - self._bitmap = bitmap - return self - - - def GetBitmap(self): - - return self._bitmap - - - def SetRowPos(self, pos): - - self._rowPos = pos - return self - - - def GetRowPos(self): - - return self._rowPos - - - def SetColPos(self, pos): - - self._colPos = pos - return self - - - def GetColPos(self): - - return self._colPos - - - def SetWindow(self, win): - - self._window = win - return self - - - def GetWindow(self): - - return self._window - - -class SwitcherItems(object): - """ An object containing switcher items. """ - - def __init__(self, items=None): - """ Default class constructor. """ - - self._selection = -1 - self._rowCount = 10 - self._columnCount = 0 - - self._backgroundColour = wx.NullColour - self._textColour = wx.NullColour - self._selectionColour = wx.NullColour - self._selectionOutlineColour = wx.NullColour - self._itemFont = wx.NullFont - - self._items = [] - - if wx.Platform == "__WXMSW__": - # If on Windows XP/Vista, use more appropriate colours - self.SetSelectionOutlineColour(wx.Colour(49, 106, 197)) - self.SetSelectionColour(wx.Colour(193, 210, 238)) - - if items: - self.Copy(items) - - - def Copy(self, items): - """ - Copy operator between 2 L{SwitcherItems}. - - :param `items`: another instance of L{SwitcherItems}. - """ - - self.Clear() - - for item in items._items: - self._items.append(item) - - self._selection = items._selection - self._rowCount = items._rowCount - self._columnCount = items._columnCount - - self._backgroundColour = items._backgroundColour - self._textColour = items._textColour - self._selectionColour = items._selectionColour - self._selectionOutlineColour = items._selectionOutlineColour - self._itemFont = items._itemFont - - - def AddItem(self, titleOrItem, name=None, id=0, bitmap=wx.NullBitmap): - - if isinstance(titleOrItem, SwitcherItem): - self._items.append(titleOrItem) - return self._items[-1] - - item = SwitcherItem() - item.SetTitle(titleOrItem) - item.SetName(name) - item.SetId(id) - item.SetBitmap(bitmap) - - self._items.append(item) - return self._items[-1] - - - def AddGroup(self, title, name, id=0, bitmap=wx.NullBitmap): - - item = self.AddItem(title, name, id, bitmap) - item.SetIsGroup(True) - - return item - - - def Clear(self): - - self._items = [] - - - def FindItemByName(self, name): - - for i in xrange(len(self._items)): - if self._items[i].GetName() == name: - return i - - return wx.NOT_FOUND - - - def FindItemById(self, id): - - for i in xrange(len(self._items)): - if self._items[i].GetId() == id: - return i - - return wx.NOT_FOUND - - - def SetSelection(self, sel): - - self._selection = sel - - - def SetSelectionByName(self, name): - - idx = self.FindItemByName(name) - if idx != wx.NOT_FOUND: - self.SetSelection(idx) - - - def GetSelection(self): - - return self._selection - - - def GetItem(self, i): - - return self._items[i] - - - def GetItemCount(self): - - return len(self._items) - - - def SetRowCount(self, rows): - - self._rowCount = rows - - - def GetRowCount(self): - - return self._rowCount - - - def SetColumnCount(self, cols): - - self._columnCount = cols - - - def GetColumnCount(self): - - return self._columnCount - - - def SetBackgroundColour(self, colour): - - self._backgroundColour = colour - - - def GetBackgroundColour(self): - - return self._backgroundColour - - - def SetTextColour(self, colour): - - self._textColour = colour - - - def GetTextColour(self): - - return self._textColour - - - def SetSelectionColour(self, colour): - - self._selectionColour = colour - - - def GetSelectionColour(self): - - return self._selectionColour - - - def SetSelectionOutlineColour(self, colour): - - self._selectionOutlineColour = colour - - - def GetSelectionOutlineColour(self): - - return self._selectionOutlineColour - - - def SetItemFont(self, font): - - self._itemFont = font - - - def GetItemFont(self): - - return self._itemFont - - - def PaintItems(self, dc, win): - - backgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) - standardTextColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) - selectionColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) - selectionOutlineColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) - standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - groupFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - groupFont.SetWeight(wx.BOLD) - - if self.GetBackgroundColour().IsOk(): - backgroundColour = self.GetBackgroundColour() - - if self.GetTextColour().IsOk(): - standardTextColour = self.GetTextColour() - - if self.GetSelectionColour().IsOk(): - selectionColour = self.GetSelectionColour() - - if self.GetSelectionOutlineColour().IsOk(): - selectionOutlineColour = self.GetSelectionOutlineColour() - - if self.GetItemFont().IsOk(): - - standardFont = self.GetItemFont() - groupFont = wx.Font(standardFont.GetPointSize(), standardFont.GetFamily(), standardFont.GetStyle(), - wx.BOLD, standardFont.GetUnderlined(), standardFont.GetFaceName()) - - textMarginX = SWITCHER_TEXT_MARGIN_X - - dc.SetLogicalFunction(wx.COPY) - dc.SetBrush(wx.Brush(backgroundColour)) - dc.SetPen(wx.TRANSPARENT_PEN) - dc.DrawRectangleRect(win.GetClientRect()) - dc.SetBackgroundMode(wx.TRANSPARENT) - - for i in xrange(len(self._items)): - item = self._items[i] - if i == self._selection: - dc.SetPen(wx.Pen(selectionOutlineColour)) - dc.SetBrush(wx.Brush(selectionColour)) - dc.DrawRectangleRect(item.GetRect()) - - clippingRect = wx.Rect(*item.GetRect()) - clippingRect.Deflate(1, 1) - - dc.SetClippingRect(clippingRect) - - if item.GetTextColour().IsOk(): - dc.SetTextForeground(item.GetTextColour()) - else: - dc.SetTextForeground(standardTextColour) - - if item.GetFont().IsOk(): - dc.SetFont(item.GetFont()) - else: - if item.GetIsGroup(): - dc.SetFont(groupFont) - else: - dc.SetFont(standardFont) - - w, h = dc.GetTextExtent(item.GetTitle()) - x = item.GetRect().x - - x += textMarginX - - if not item.GetIsGroup(): - if item.GetBitmap().IsOk() and item.GetBitmap().GetWidth() <= 16 \ - and item.GetBitmap().GetHeight() <= 16: - x -= textMarginX - dc.DrawBitmap(item.GetBitmap(), x, item.GetRect().y + \ - (item.GetRect().height - item.GetBitmap().GetHeight())/2, - True) - x += 16 + textMarginX - #x += textMarginX - - y = item.GetRect().y + (item.GetRect().height - h)/2 - dc.DrawText(item.GetTitle(), x, y) - dc.DestroyClippingRegion() - - - def CalculateItemSize(self, dc): - - # Start off allowing for an icon - sz = wx.Size(150, 16) - standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - groupFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - groupFont.SetWeight(wx.BOLD) - - textMarginX = SWITCHER_TEXT_MARGIN_X - textMarginY = SWITCHER_TEXT_MARGIN_Y - maxWidth = 300 - maxHeight = 40 - - if self.GetItemFont().IsOk(): - standardFont = self.GetItemFont() - - for item in self._items: - if item.GetFont().IsOk(): - dc.SetFont(item.GetFont()) - else: - if item.GetIsGroup(): - dc.SetFont(groupFont) - else: - dc.SetFont(standardFont) - - w, h = dc.GetTextExtent(item.GetTitle()) - w += 16 + 2*textMarginX - - if w > sz.x: - sz.x = min(w, maxWidth) - if h > sz.y: - sz.y = min(h, maxHeight) - - if sz == wx.Size(16, 16): - sz = wx.Size(100, 25) - else: - sz.x += textMarginX*2 - sz.y += textMarginY*2 - - return sz - - - def GetIndexForFocus(self): - - for i, item in enumerate(self._items): - if item.GetWindow(): - - if FindFocusDescendant(item.GetWindow()): - return i - - return wx.NOT_FOUND - - -class MultiColumnListCtrl(wx.PyControl): - """ A control for displaying several columns (not scrollable). """ - - def __init__(self, parent, aui_manager, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, - style=0, validator=wx.DefaultValidator, name="MultiColumnListCtrl"): - - wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name) - - self._overallSize = wx.Size(200, 100) - self._modifierKey = wx.WXK_CONTROL - self._extraNavigationKey = 0 - self._aui_manager = aui_manager - - self.SetInitialSize(size) - self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) - - self.Bind(wx.EVT_PAINT, self.OnPaint) - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) - self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouseEvent) - self.Bind(wx.EVT_CHAR, self.OnChar) - self.Bind(wx.EVT_KEY_DOWN, self.OnKey) - self.Bind(wx.EVT_KEY_UP, self.OnKey) - - - def __del__(self): - - self._aui_manager.HideHint() - - - def DoGetBestSize(self): - - return self._overallSize - - - def OnEraseBackground(self, event): - - pass - - - def OnPaint(self, event): - - dc = wx.AutoBufferedPaintDC(self) - rect = self.GetClientRect() - - if self._items.GetColumnCount() == 0: - self.CalculateLayout(dc) - - if self._items.GetColumnCount() == 0: - return - - self._items.PaintItems(dc, self) - - - def OnMouseEvent(self, event): - - if event.LeftDown(): - self.SetFocus() - - - def OnChar(self, event): - - event.Skip() - - - def OnKey(self, event): - - if event.GetEventType() == wx.wxEVT_KEY_UP: - if event.GetKeyCode() == self.GetModifierKey(): - topLevel = wx.GetTopLevelParent(self) - closeEvent = wx.CloseEvent(wx.wxEVT_CLOSE_WINDOW, topLevel.GetId()) - closeEvent.SetEventObject(topLevel) - closeEvent.SetCanVeto(False) - - topLevel.GetEventHandler().ProcessEvent(closeEvent) - return - - event.Skip() - return - - keyCode = event.GetKeyCode() - - if keyCode in [wx.WXK_ESCAPE, wx.WXK_RETURN]: - if keyCode == wx.WXK_ESCAPE: - self._items.SetSelection(-1) - - topLevel = wx.GetTopLevelParent(self) - closeEvent = wx.CloseEvent(wx.wxEVT_CLOSE_WINDOW, topLevel.GetId()) - closeEvent.SetEventObject(topLevel) - closeEvent.SetCanVeto(False) - - topLevel.GetEventHandler().ProcessEvent(closeEvent) - return - - elif keyCode in [wx.WXK_TAB, self.GetExtraNavigationKey()]: - if event.ShiftDown(): - - self._items.SetSelection(self._items.GetSelection() - 1) - if self._items.GetSelection() < 0: - self._items.SetSelection(self._items.GetItemCount() - 1) - - self.AdvanceToNextSelectableItem(-1) - - else: - - self._items.SetSelection(self._items.GetSelection() + 1) - if self._items.GetSelection() >= self._items.GetItemCount(): - self._items.SetSelection(0) - - self.AdvanceToNextSelectableItem(1) - - self.GenerateSelectionEvent() - self.Refresh() - - elif keyCode in [wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN]: - self._items.SetSelection(self._items.GetSelection() + 1) - if self._items.GetSelection() >= self._items.GetItemCount(): - self._items.SetSelection(0) - - self.AdvanceToNextSelectableItem(1) - self.GenerateSelectionEvent() - self.Refresh() - - elif keyCode in [wx.WXK_UP, wx.WXK_NUMPAD_UP]: - self._items.SetSelection(self._items.GetSelection() - 1) - if self._items.GetSelection() < 0: - self._items.SetSelection(self._items.GetItemCount() - 1) - - self.AdvanceToNextSelectableItem(-1) - self.GenerateSelectionEvent() - self.Refresh() - - elif keyCode in [wx.WXK_HOME, wx.WXK_NUMPAD_HOME]: - self._items.SetSelection(0) - self.AdvanceToNextSelectableItem(1) - self.GenerateSelectionEvent() - self.Refresh() - - elif keyCode in [wx.WXK_END, wx.WXK_NUMPAD_END]: - self._items.SetSelection(self._items.GetItemCount() - 1) - self.AdvanceToNextSelectableItem(-1) - self.GenerateSelectionEvent() - self.Refresh() - - elif keyCode in [wx.WXK_LEFT, wx.WXK_NUMPAD_LEFT]: - item = self._items.GetItem(self._items.GetSelection()) - - row = item.GetRowPos() - newCol = item.GetColPos() - 1 - if newCol < 0: - newCol = self._items.GetColumnCount() - 1 - - # Find the first item from the end whose row matches and whose column is equal or lower - for i in xrange(self._items.GetItemCount()-1, -1, -1): - item2 = self._items.GetItem(i) - if item2.GetColPos() == newCol and item2.GetRowPos() <= row: - self._items.SetSelection(i) - break - - self.AdvanceToNextSelectableItem(-1) - self.GenerateSelectionEvent() - self.Refresh() - - elif keyCode in [wx.WXK_RIGHT, wx.WXK_NUMPAD_RIGHT]: - item = self._items.GetItem(self._items.GetSelection()) - - row = item.GetRowPos() - newCol = item.GetColPos() + 1 - if newCol >= self._items.GetColumnCount(): - newCol = 0 - - # Find the first item from the end whose row matches and whose column is equal or lower - for i in xrange(self._items.GetItemCount()-1, -1, -1): - item2 = self._items.GetItem(i) - if item2.GetColPos() == newCol and item2.GetRowPos() <= row: - self._items.SetSelection(i) - break - - self.AdvanceToNextSelectableItem(1) - self.GenerateSelectionEvent() - self.Refresh() - - else: - event.Skip() - - - def AdvanceToNextSelectableItem(self, direction): - - if self._items.GetItemCount() < 2: - return - - if self._items.GetSelection() == -1: - self._items.SetSelection(0) - - oldSel = self._items.GetSelection() - - while 1: - - if self._items.GetItem(self._items.GetSelection()).GetIsGroup(): - - self._items.SetSelection(self._items.GetSelection() + direction) - if self._items.GetSelection() == -1: - self._items.SetSelection(self._items.GetItemCount()-1) - elif self._items.GetSelection() == self._items.GetItemCount(): - self._items.SetSelection(0) - if self._items.GetSelection() == oldSel: - break - - else: - break - - self.SetTransparency() - selection = self._items.GetItem(self._items.GetSelection()).GetWindow() - pane = self._aui_manager.GetPane(selection) - - if not pane.IsOk(): - if isinstance(selection.GetParent(), auibook.AuiNotebook): - self.SetTransparency(selection) - self._aui_manager.ShowHint(selection.GetScreenRect()) - wx.CallAfter(self.SetFocus) - self.SetFocus() - return - else: - self._aui_manager.HideHint() - return - if not pane.IsShown(): - self._aui_manager.HideHint() - return - - self.SetTransparency(selection) - self._aui_manager.ShowHint(selection.GetScreenRect()) - # NOTE: this is odd but it is the only way for the focus to - # work correctly on wxMac... - wx.CallAfter(self.SetFocus) - self.SetFocus() - - - def SetTransparency(self, selection=None): - - if not self.GetParent().CanSetTransparent(): - return - - if selection is not None: - intersects = False - if selection.GetScreenRect().Intersects(self.GetParent().GetScreenRect()): - intersects = True - self.GetParent().SetTransparent(200) - return - - self.GetParent().SetTransparent(255) - - - def GenerateSelectionEvent(self): - - event = wx.CommandEvent(wx.wxEVT_COMMAND_LISTBOX_SELECTED, self.GetId()) - event.SetEventObject(self) - event.SetInt(self._items.GetSelection()) - self.GetEventHandler().ProcessEvent(event) - - - def CalculateLayout(self, dc=None): - - if dc is None: - dc = wx.ClientDC(self) - - if self._items.GetSelection() == -1: - self._items.SetSelection(0) - - columnCount = 1 - - # Spacing between edge of window or between columns - xMargin = 4 - yMargin = 4 - - # Inter-row spacing - rowSpacing = 2 - - itemSize = self._items.CalculateItemSize(dc) - self._overallSize = wx.Size(350, 200) - - currentRow = 0 - x = xMargin - y = yMargin - - breaking = False - i = 0 - - while 1: - - oldOverallSize = self._overallSize - item = self._items.GetItem(i) - - item.SetRect(wx.Rect(x, y, itemSize.x, itemSize.y)) - item.SetColPos(columnCount-1) - item.SetRowPos(currentRow) - - if item.GetRect().GetBottom() > self._overallSize.y: - self._overallSize.y = item.GetRect().GetBottom() + yMargin - - if item.GetRect().GetRight() > self._overallSize.x: - self._overallSize.x = item.GetRect().GetRight() + xMargin - - currentRow += 1 - - y += rowSpacing + itemSize.y - stopBreaking = breaking - - if currentRow > self._items.GetRowCount() or (item.GetBreakColumn() and not breaking and currentRow != 1): - currentRow = 0 - columnCount += 1 - x += xMargin + itemSize.x - y = yMargin - - # Make sure we don't orphan a group - if item.GetIsGroup() or (item.GetBreakColumn() and not breaking): - self._overallSize = oldOverallSize - - if item.GetBreakColumn(): - breaking = True - - # Repeat the last item, in the next column - i -= 1 - - if stopBreaking: - breaking = False - - i += 1 - - if i >= self._items.GetItemCount(): - break - - self._items.SetColumnCount(columnCount) - self.InvalidateBestSize() - - - def SetItems(self, items): - - self._items = items - - - def GetItems(self): - - return self._items - - - def SetExtraNavigationKey(self, keyCode): - """ - Set an extra key that can be used to cycle through items, - in case not using the ``Ctrl`` + ``Tab`` combination. - """ - - self._extraNavigationKey = keyCode - - - def GetExtraNavigationKey(self): - - return self._extraNavigationKey - - - def SetModifierKey(self, modifierKey): - """ - Set the modifier used to invoke the dialog, and therefore to test for - release. - """ - - self._modifierKey = modifierKey - - - def GetModifierKey(self): - - return self._modifierKey - - - -class SwitcherDialog(wx.Dialog): - """ - SwitcherDialog shows a L{MultiColumnListCtrl} with a list of panes - and tabs for the user to choose. ``Ctrl`` + ``Tab`` cycles through them. - """ - - def __init__(self, items, parent, aui_manager, id=wx.ID_ANY, title=_("Pane Switcher"), pos=wx.DefaultPosition, - size=wx.DefaultSize, style=wx.STAY_ON_TOP|wx.DIALOG_NO_PARENT|wx.BORDER_SIMPLE): - """ Default class constructor. """ - - self._switcherBorderStyle = (style & wx.BORDER_MASK) - if self._switcherBorderStyle == wx.BORDER_NONE: - self._switcherBorderStyle = wx.BORDER_SIMPLE - - style &= wx.BORDER_MASK - style |= wx.BORDER_NONE - - wx.Dialog.__init__(self, parent, id, title, pos, size, style) - - self._listCtrl = MultiColumnListCtrl(self, aui_manager, - style=wx.WANTS_CHARS|wx.NO_BORDER) - self._listCtrl.SetItems(items) - self._listCtrl.CalculateLayout() - - self._descriptionCtrl = wx.html.HtmlWindow(self, size=(-1, 100), style=wx.BORDER_NONE) - self._descriptionCtrl.SetBackgroundColour(self.GetBackgroundColour()) - - if wx.Platform == "__WXGTK__": - fontSize = 11 - self._descriptionCtrl.SetStandardFonts(fontSize) - - sizer = wx.BoxSizer(wx.VERTICAL) - self.SetSizer(sizer) - sizer.Add(self._listCtrl, 1, wx.ALL|wx.EXPAND, 10) - sizer.Add(self._descriptionCtrl, 0, wx.ALL|wx.EXPAND, 10) - sizer.SetSizeHints(self) - - self._listCtrl.SetFocus() - - self.Centre(wx.BOTH) - - if self._listCtrl.GetItems().GetSelection() == -1: - self._listCtrl.GetItems().SetSelection(0) - - self._listCtrl.AdvanceToNextSelectableItem(1) - - self.ShowDescription(self._listCtrl.GetItems().GetSelection()) - - self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) - self.Bind(wx.EVT_ACTIVATE, self.OnActivate) - self.Bind(wx.EVT_LISTBOX, self.OnSelectItem) - self.Bind(wx.EVT_PAINT, self.OnPaint) - - # Attributes - self._closing = False - if wx.Platform == "__WXMSW__": - self._borderColour = wx.Colour(49, 106, 197) - else: - self._borderColour = wx.BLACK - - self._aui_manager = aui_manager - - - def OnCloseWindow(self, event): - - if self._closing: - return - - if self.IsModal(): - self._closing = True - - if self.GetSelection() == -1: - self.EndModal(wx.ID_CANCEL) - else: - self.EndModal(wx.ID_OK) - - self._aui_manager.HideHint() - - - def GetSelection(self): - - return self._listCtrl.GetItems().GetSelection() - - - def OnActivate(self, event): - - if not event.GetActive(): - if not self._closing: - self._closing = True - self.EndModal(wx.ID_CANCEL) - - - def OnPaint(self, event): - - dc = wx.PaintDC(self) - - if self._switcherBorderStyle == wx.BORDER_SIMPLE: - - dc.SetPen(wx.Pen(self._borderColour)) - dc.SetBrush(wx.TRANSPARENT_BRUSH) - - rect = self.GetClientRect() - dc.DrawRectangleRect(rect) - - # Draw border around the HTML control - rect = wx.Rect(*self._descriptionCtrl.GetRect()) - rect.Inflate(1, 1) - dc.DrawRectangleRect(rect) - - - def OnSelectItem(self, event): - - self.ShowDescription(event.GetSelection()) - - -# Convert a colour to a 6-digit hex string - def ColourToHexString(self, col): - - hx = '%02x%02x%02x' % tuple([int(c) for c in col]) - return hx - - - def ShowDescription(self, i): - - item = self._listCtrl.GetItems().GetItem(i) - colour = self._listCtrl.GetItems().GetBackgroundColour() - - if not colour.IsOk(): - colour = self.GetBackgroundColour() - - backgroundColourHex = self.ColourToHexString(colour) - html = _("") + item.GetTitle() + _("") - - if item.GetDescription(): - html += _("

    ") - html += item.GetDescription() - - html += _("") - self._descriptionCtrl.SetPage(html) - - - def SetExtraNavigationKey(self, keyCode): - - self._extraNavigationKey = keyCode - if self._listCtrl: - self._listCtrl.SetExtraNavigationKey(keyCode) - - - def GetExtraNavigationKey(self): - - return self._extraNavigationKey - - - def SetModifierKey(self, modifierKey): - - self._modifierKey = modifierKey - if self._listCtrl: - self._listCtrl.SetModifierKey(modifierKey) - - - def GetModifierKey(self): - - return self._modifierKey - - - def SetBorderColour(self, colour): - - self._borderColour = colour - - \ No newline at end of file diff --git a/aui/aui_utilities.py b/aui/aui_utilities.py deleted file mode 100644 index d6c701a..0000000 --- a/aui/aui_utilities.py +++ /dev/null @@ -1,678 +0,0 @@ -""" -This module contains some common functions used by wxPython-AUI to -manipulate colours, bitmaps, text, gradient shadings and custom -dragging images for AuiNotebook tabs. -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx - -from aui_constants import * - - -if wx.Platform == "__WXMAC__": - import Carbon.Appearance - - -def BlendColour(fg, bg, alpha): - """ - Blends the two colour component `fg` and `bg` into one colour component, adding - an optional alpha channel. - - :param `fg`: the first colour component; - :param `bg`: the second colour component; - :param `alpha`: an optional transparency value. - """ - - result = bg + (alpha*(fg - bg)) - - if result < 0.0: - result = 0.0 - if result > 255: - result = 255 - - return result - - -def StepColour(c, ialpha): - """ - Darken/lighten the input colour `c`. - - :param `c`: a colour to darken/lighten; - :param `ialpha`: a transparency value. - """ - - if ialpha == 100: - return c - - r, g, b = c.Red(), c.Green(), c.Blue() - - # ialpha is 0..200 where 0 is completely black - # and 200 is completely white and 100 is the same - # convert that to normal alpha 0.0 - 1.0 - ialpha = min(ialpha, 200) - ialpha = max(ialpha, 0) - alpha = (ialpha - 100.0)/100.0 - - if ialpha > 100: - - # blend with white - bg = 255 - alpha = 1.0 - alpha # 0 = transparent fg 1 = opaque fg - - else: - - # blend with black - bg = 0 - alpha = 1.0 + alpha # 0 = transparent fg 1 = opaque fg - - r = BlendColour(r, bg, alpha) - g = BlendColour(g, bg, alpha) - b = BlendColour(b, bg, alpha) - - return wx.Colour(r, g, b) - - -def LightContrastColour(c): - """ - Creates a new, lighter colour based on the input colour `c`. - - :param `c`: the input colour to analyze. - """ - - amount = 120 - - # if the colour is especially dark, then - # make the contrast even lighter - if c.Red() < 128 and c.Green() < 128 and c.Blue() < 128: - amount = 160 - - return StepColour(c, amount) - - -def ChopText(dc, text, max_size): - """ - Chops the input `text` if its size does not fit in `max_size`, by cutting the - text and adding ellipsis at the end. - - :param `dc`: a `wx.DC` device context; - :param `text`: the text to chop; - :param `max_size`: the maximum size in which the text should fit. - """ - - # first check if the text fits with no problems - x, y, dummy = dc.GetMultiLineTextExtent(text) - - if x <= max_size: - return text - - textLen = len(text) - last_good_length = 0 - - for i in xrange(textLen, -1, -1): - s = text[0:i] - s += "..." - - x, y = dc.GetTextExtent(s) - last_good_length = i - - if x < max_size: - break - - ret = text[0:last_good_length] + "..." - return ret - - -def BitmapFromBits(bits, w, h, colour): - """ - BitmapFromBits() is a utility function that creates a - masked bitmap from raw bits (XBM format). - - :param `bits`: a string containing the raw bits of the bitmap; - :param `w`: the bitmap width; - :param `h`: the bitmap height; - :param `colour`: the colour which will replace all white pixels in the - raw bitmap. - """ - - img = wx.BitmapFromBits(bits, w, h).ConvertToImage() - img.Replace(0, 0, 0, 123, 123, 123) - img.Replace(255, 255, 255, colour.Red(), colour.Green(), colour.Blue()) - img.SetMaskColour(123, 123, 123) - return wx.BitmapFromImage(img) - - -def IndentPressedBitmap(rect, button_state): - """ - Indents the input rectangle `rect` based on the value of `button_state`. - - :param `rect`: an instance of wx.Rect; - :param `button_state`: an L{AuiNotebook} button state. - """ - - if button_state == AUI_BUTTON_STATE_PRESSED: - rect.x += 1 - rect.y += 1 - - return rect - - -def GetBaseColour(): - """ - Returns the face shading colour on push buttons/backgrounds, mimicking as closely - as possible the platform UI colours. - """ - - if wx.Platform == "__WXMAC__": - - if hasattr(wx, 'MacThemeColour'): - base_colour = wx.MacThemeColour(Carbon.Appearance.kThemeBrushToolbarBackground) - else: - brush = wx.Brush(wx.BLACK) - brush.MacSetTheme(Carbon.Appearance.kThemeBrushToolbarBackground) - base_colour = brush.GetColour() - - else: - - base_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) - - # the base_colour is too pale to use as our base colour, - # so darken it a bit - if ((255-base_colour.Red()) + - (255-base_colour.Green()) + - (255-base_colour.Blue()) < 60): - - base_colour = StepColour(base_colour, 92) - - return base_colour - - -def MakeDisabledBitmap(bitmap): - """ - Convert the given image (in place) to a grayed-out version, - appropriate for a 'disabled' appearance. - - :param `bitmap`: the bitmap to gray-out. - """ - - anImage = bitmap.ConvertToImage() - factor = 0.7 # 0 < f < 1. Higher Is Grayer - - if anImage.HasMask(): - maskColour = (anImage.GetMaskRed(), anImage.GetMaskGreen(), anImage.GetMaskBlue()) - else: - maskColour = None - - data = map(ord, list(anImage.GetData())) - - for i in range(0, len(data), 3): - - pixel = (data[i], data[i+1], data[i+2]) - pixel = MakeGray(pixel, factor, maskColour) - - for x in range(3): - data[i+x] = pixel[x] - - anImage.SetData(''.join(map(chr, data))) - - return anImage.ConvertToBitmap() - - -def MakeGray(rgbTuple, factor, maskColour): - """ - Make a pixel grayed-out. If the pixel matches the `maskColour`, it won't be - changed. - - :param `rgbTuple`: a tuple representing a pixel colour; - :param `factor`: a graying-out factor; - :param `maskColour`: a colour mask. - """ - - if rgbTuple != maskColour: - r, g, b = rgbTuple - return map(lambda x: int((230 - x) * factor) + x, (r, g, b)) - else: - return rgbTuple - - -def Clip(a, b, c): - """ - Clips the value in `a` based on the extremes `b` and `c`. - - :param `a`: the value to analyze; - :param `b`: a minimum value; - :param `c`: a maximum value. - """ - - return ((a < b and [b]) or [(a > c and [c] or [a])[0]])[0] - - -def LightColour(colour, percent): - """ - Brighten input `colour` by `percent`. - - :param `colour`: the colour to be brightened; - :param `percent`: brightening percentage. - """ - - end_colour = wx.WHITE - - rd = end_colour.Red() - colour.Red() - gd = end_colour.Green() - colour.Green() - bd = end_colour.Blue() - colour.Blue() - - high = 100 - - # We take the percent way of the colour from colour -. white - i = percent - r = colour.Red() + ((i*rd*100)/high)/100 - g = colour.Green() + ((i*gd*100)/high)/100 - b = colour.Blue() + ((i*bd*100)/high)/100 - return wx.Colour(r, g, b) - - -def PaneCreateStippleBitmap(): - """ - Creates a stipple bitmap to be used in a `wx.Brush`. - This is used to draw sash resize hints. - """ - - data = [0, 0, 0, 192, 192, 192, 192, 192, 192, 0, 0, 0] - img = wx.EmptyImage(2, 2) - counter = 0 - - for ii in xrange(2): - for jj in xrange(2): - img.SetRGB(ii, jj, data[counter], data[counter+1], data[counter+2]) - counter = counter + 3 - - return img.ConvertToBitmap() - - -def DrawMACCloseButton(colour, backColour=None): - """ - Draws the wxMAC tab close button using `wx.GraphicsContext`. - - :param `colour`: the colour to use to draw the circle; - :param `backColour`: the optional background colour for the circle. - """ - - bmp = wx.EmptyBitmapRGBA(16, 16) - dc = wx.MemoryDC() - dc.SelectObject(bmp) - - gc = wx.GraphicsContext.Create(dc) - gc.SetBrush(wx.Brush(colour)) - path = gc.CreatePath() - path.AddCircle(6.5, 7, 6.5) - path.CloseSubpath() - gc.FillPath(path) - - path = gc.CreatePath() - if backColour is not None: - pen = wx.Pen(backColour, 2) - else: - pen = wx.Pen("white", 2) - - pen.SetCap(wx.CAP_BUTT) - pen.SetJoin(wx.JOIN_BEVEL) - gc.SetPen(pen) - path.MoveToPoint(3.5, 4) - path.AddLineToPoint(9.5, 10) - path.MoveToPoint(3.5, 10) - path.AddLineToPoint(9.5, 4) - path.CloseSubpath() - gc.DrawPath(path) - - dc.SelectObject(wx.NullBitmap) - return bmp - - -def DarkenBitmap(bmp, caption_colour, new_colour): - """ - Darkens the input bitmap on wxMAC using the input colour. - - :param `bmp`: the bitmap to be manipulated; - :param `caption_colour`: the colour of the pane caption; - :param `new_colour`: the colour used to darken the bitmap. - """ - - image = bmp.ConvertToImage() - red = caption_colour.Red()/float(new_colour.Red()) - green = caption_colour.Green()/float(new_colour.Green()) - blue = caption_colour.Blue()/float(new_colour.Blue()) - image = image.AdjustChannels(red, green, blue) - return image.ConvertToBitmap() - - -def DrawGradientRectangle(dc, rect, start_colour, end_colour, direction, offset=0, length=0): - """ - Draws a gradient-shaded rectangle. - - :param `dc`: a `wx.DC` device context; - :param `rect`: the rectangle in which to draw the gradient; - :param `start_colour`: the first colour of the gradient; - :param `end_colour`: the second colour of the gradient; - :param `direction`: the gradient direction (horizontal or vertical). - """ - - if direction == AUI_GRADIENT_VERTICAL: - dc.GradientFillLinear(rect, start_colour, end_colour, wx.SOUTH) - else: - dc.GradientFillLinear(rect, start_colour, end_colour, wx.EAST) - - -def FindFocusDescendant(ancestor): - """ - Find a window with the focus, that is also a descendant of the given window. - This is used to determine the window to initially send commands to. - - :param `ancestor`: the window to check for ancestry. - """ - - # Process events starting with the window with the focus, if any. - focusWin = wx.Window.FindFocus() - win = focusWin - - # Check if this is a descendant of this frame. - # If not, win will be set to NULL. - while win: - if win == ancestor: - break - else: - win = win.GetParent() - - if win is None: - focusWin = None - - return focusWin - - -def GetLabelSize(dc, label, vertical): - """ - Returns the L{AuiToolBar} item label size. - - :param `label`: the toolbar tool label; - :param `vertical`: whether the toolbar tool orientation is vertical or not. - """ - - text_width = text_height = 0 - - # get the text height - dummy, text_height = dc.GetTextExtent("ABCDHgj") - # get the text width - if label.strip(): - text_width, dummy = dc.GetTextExtent(label) - - if vertical: - tmp = text_height - text_height = text_width - text_width = tmp - - return wx.Size(text_width, text_height) - - -#--------------------------------------------------------------------------- -# TabDragImage implementation -# This class handles the creation of a custom image when dragging -# AuiNotebook tabs -#--------------------------------------------------------------------------- - -class TabDragImage(wx.DragImage): - """ - This class handles the creation of a custom image in case of drag and - drop of a notebook tab. - """ - - def __init__(self, notebook, page, button_state, tabArt): - """ - Default class constructor. - - For internal use: do not call it in your code! - - :param `notebook`: an instance of L{AuiNotebook}; - :param `page`: the dragged L{AuiNotebook} page; - :param `button_state`: the state of the close button on the tab; - :param `tabArt`: an instance of L{AuiDefaultTabArt} or one of its derivations. - """ - - self._backgroundColour = wx.NamedColour("pink") - self._bitmap = self.CreateBitmap(notebook, page, button_state, tabArt) - wx.DragImage.__init__(self, self._bitmap) - - - def CreateBitmap(self, notebook, page, button_state, tabArt): - """ - Actually creates the drag and drop bitmap. - - :param `notebook`: an instance of L{AuiNotebook}; - :param `page`: the dragged L{AuiNotebook} page; - :param `button_state`: the state of the close button on the tab; - :param `tabArt`: an instance of L{AuiDefaultTabArt} or one of its derivations. - """ - - control = page.control - memory = wx.MemoryDC(wx.EmptyBitmap(1, 1)) - - tab_size, x_extent = tabArt.GetTabSize(memory, notebook, page.caption, page.bitmap, page.active, - button_state, control) - - tab_width, tab_height = tab_size - rect = wx.Rect(0, 0, tab_width, tab_height) - - bitmap = wx.EmptyBitmap(tab_width+1, tab_height+1) - memory.SelectObject(bitmap) - - if wx.Platform == "__WXMAC__": - memory.SetBackground(wx.TRANSPARENT_BRUSH) - else: - memory.SetBackground(wx.Brush(self._backgroundColour)) - - memory.SetBackgroundMode(wx.TRANSPARENT) - memory.Clear() - - paint_control = wx.Platform != "__WXMAC__" - tabArt.DrawTab(memory, notebook, page, rect, button_state, paint_control=paint_control) - - memory.SetBrush(wx.TRANSPARENT_BRUSH) - memory.SetPen(wx.BLACK_PEN) - memory.DrawRoundedRectangle(0, 0, tab_width+1, tab_height+1, 2) - - memory.SelectObject(wx.NullBitmap) - - # Gtk and Windows unfortunatly don't do so well with transparent - # drawing so this hack corrects the image to have a transparent - # background. - if wx.Platform != '__WXMAC__': - timg = bitmap.ConvertToImage() - if not timg.HasAlpha(): - timg.InitAlpha() - for y in xrange(timg.GetHeight()): - for x in xrange(timg.GetWidth()): - pix = wx.Colour(timg.GetRed(x, y), - timg.GetGreen(x, y), - timg.GetBlue(x, y)) - if pix == self._backgroundColour: - timg.SetAlpha(x, y, 0) - bitmap = timg.ConvertToBitmap() - return bitmap - - -def GetDockingImage(direction, useAero, center): - """ - Returns the correct name of the docking bitmap depending on the input parameters. - - :param `useAero`: whether L{AuiManager} is using Aero-style or Whidbey-style docking - images or not; - :param `center`: whether we are looking for the center diamond-shaped bitmap or not. - """ - - suffix = (center and [""] or ["_single"])[0] - prefix = "" - if useAero == 2: - # Whidbey docking guides - prefix = "whidbey_" - elif useAero == 1: - # Aero docking style - prefix = "aero_" - - if direction == wx.TOP: - bmp_unfocus = eval("%sup%s"%(prefix, suffix)).GetBitmap() - bmp_focus = eval("%sup_focus%s"%(prefix, suffix)).GetBitmap() - elif direction == wx.BOTTOM: - bmp_unfocus = eval("%sdown%s"%(prefix, suffix)).GetBitmap() - bmp_focus = eval("%sdown_focus%s"%(prefix, suffix)).GetBitmap() - elif direction == wx.LEFT: - bmp_unfocus = eval("%sleft%s"%(prefix, suffix)).GetBitmap() - bmp_focus = eval("%sleft_focus%s"%(prefix, suffix)).GetBitmap() - elif direction == wx.RIGHT: - bmp_unfocus = eval("%sright%s"%(prefix, suffix)).GetBitmap() - bmp_focus = eval("%sright_focus%s"%(prefix, suffix)).GetBitmap() - else: - bmp_unfocus = eval("%stab%s"%(prefix, suffix)).GetBitmap() - bmp_focus = eval("%stab_focus%s"%(prefix, suffix)).GetBitmap() - - return bmp_unfocus, bmp_focus - - -def TakeScreenShot(rect): - """ - Takes a screenshot of the screen at given position and size (rect). - - :param `rect`: the screen rectangle for which we want to take a screenshot. - """ - - # Create a DC for the whole screen area - dcScreen = wx.ScreenDC() - - # Create a Bitmap that will later on hold the screenshot image - # Note that the Bitmap must have a size big enough to hold the screenshot - # -1 means using the current default colour depth - bmp = wx.EmptyBitmap(rect.width, rect.height) - - # Create a memory DC that will be used for actually taking the screenshot - memDC = wx.MemoryDC() - - # Tell the memory DC to use our Bitmap - # all drawing action on the memory DC will go to the Bitmap now - memDC.SelectObject(bmp) - - # Blit (in this case copy) the actual screen on the memory DC - # and thus the Bitmap - memDC.Blit( 0, # Copy to this X coordinate - 0, # Copy to this Y coordinate - rect.width, # Copy this width - rect.height, # Copy this height - dcScreen, # From where do we copy? - rect.x, # What's the X offset in the original DC? - rect.y # What's the Y offset in the original DC? - ) - - # Select the Bitmap out of the memory DC by selecting a new - # uninitialized Bitmap - memDC.SelectObject(wx.NullBitmap) - - return bmp - - -def RescaleScreenShot(bmp, thumbnail_size=200): - """ - Rescales a bitmap to be 300 pixels wide (or tall) at maximum. - - :param `bmp`: the bitmap to rescale; - :param `thumbnail_size`: the maximum size of every page thumbnail. - """ - - bmpW, bmpH = bmp.GetWidth(), bmp.GetHeight() - img = bmp.ConvertToImage() - - newW, newH = bmpW, bmpH - - if bmpW > bmpH: - if bmpW > thumbnail_size: - ratio = bmpW/float(thumbnail_size) - newW, newH = int(bmpW/ratio), int(bmpH/ratio) - img.Rescale(newW, newH, wx.IMAGE_QUALITY_HIGH) - else: - if bmpH > thumbnail_size: - ratio = bmpH/float(thumbnail_size) - newW, newH = int(bmpW/ratio), int(bmpH/ratio) - img.Rescale(newW, newH, wx.IMAGE_QUALITY_HIGH) - - newBmp = img.ConvertToBitmap() - otherBmp = wx.EmptyBitmap(newW+5, newH+5) - - memDC = wx.MemoryDC() - memDC.SelectObject(otherBmp) - memDC.SetBackground(wx.WHITE_BRUSH) - memDC.Clear() - - memDC.SetPen(wx.TRANSPARENT_PEN) - - pos = 0 - for i in xrange(5, 0, -1): - brush = wx.Brush(wx.Colour(50*i, 50*i, 50*i)) - memDC.SetBrush(brush) - memDC.DrawRoundedRectangle(0, 0, newW+5-pos, newH+5-pos, 2) - pos += 1 - - memDC.DrawBitmap(newBmp, 0, 0, True) - - # Select the Bitmap out of the memory DC by selecting a new - # uninitialized Bitmap - memDC.SelectObject(wx.NullBitmap) - - return otherBmp - - -def GetSlidingPoints(rect, size, direction): - """ - Returns the point at which the sliding in and out of a minimized pane begins. - - :param `rect`: the L{AuiToolBar} tool screen rectangle; - :param `size`: the pane window size; - :param `direction`: the pane docking direction. - """ - - if direction == AUI_DOCK_LEFT: - startX, startY = rect.x + rect.width + 2, rect.y - elif direction == AUI_DOCK_TOP: - startX, startY = rect.x, rect.y + rect.height + 2 - elif direction == AUI_DOCK_RIGHT: - startX, startY = rect.x - size.x - 2, rect.y - elif direction == AUI_DOCK_BOTTOM: - startX, startY = rect.x, rect.y - size.y - 2 - else: - raise Exception("How did we get here?") - - caption_height = wx.SystemSettings.GetMetric(wx.SYS_CAPTION_Y) - frame_border_x = wx.SystemSettings.GetMetric(wx.SYS_FRAMESIZE_X) - frame_border_y = wx.SystemSettings.GetMetric(wx.SYS_FRAMESIZE_Y) - - stopX = size.x + caption_height + frame_border_x - stopY = size.x + frame_border_y - - return startX, startY, stopX, stopY - - -def CopyAttributes(newArt, oldArt): - """ - Copies pens, brushes, colours and fonts from the old tab art to the new one. - - :param `newArt`: the new instance of L{AuiDefaultTabArt}; - :param `oldArt`: the old instance of L{AuiDefaultTabArt}. - """ - - attrs = dir(oldArt) - - for attr in attrs: - if attr.startswith("_") and (attr.endswith("_colour") or attr.endswith("_font") or \ - attr.endswith("_font") or attr.endswith("_brush") or \ - attr.endswith("Pen") or attr.endswith("_pen")): - setattr(newArt, attr, getattr(oldArt, attr)) - - return newArt - diff --git a/aui/auibar.py b/aui/auibar.py deleted file mode 100644 index 88bb509..0000000 --- a/aui/auibar.py +++ /dev/null @@ -1,3926 +0,0 @@ -""" -auibar contains an implementation of L{AuiToolBar}, which is a completely owner-drawn -toolbar perfectly integrated with the AUI layout system. This allows drag and drop of -toolbars, docking/floating behaviour and the possibility to define "overflow" items -in the toolbar itself. - -The default theme that is used is L{AuiDefaultToolBarArt}, which provides a modern, -glossy look and feel. The theme can be changed by calling L{AuiToolBar.SetArtProvider}. -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx -import types - -from aui_utilities import BitmapFromBits, StepColour, GetLabelSize -from aui_utilities import GetBaseColour, MakeDisabledBitmap - -import framemanager -from aui_constants import * - -# wxPython version string -_VERSION_STRING = wx.VERSION_STRING - -# AuiToolBar events -wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN = wx.NewEventType() -wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK = wx.NewEventType() -wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK = wx.NewEventType() -wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK = wx.NewEventType() -wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG = wx.NewEventType() - -EVT_AUITOOLBAR_TOOL_DROPDOWN = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, 1) -""" A dropdown `AuiToolBarItem` is being shown. """ -EVT_AUITOOLBAR_OVERFLOW_CLICK = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, 1) -""" The user left-clicked on the overflow button in `AuiToolBar`. """ -EVT_AUITOOLBAR_RIGHT_CLICK = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, 1) -""" Fires an event when the user right-clicks on a `AuiToolBarItem`. """ -EVT_AUITOOLBAR_MIDDLE_CLICK = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, 1) -""" Fires an event when the user middle-clicks on a `AuiToolBarItem`. """ -EVT_AUITOOLBAR_BEGIN_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, 1) -""" A drag operation involving a toolbar item has started. """ - -# ---------------------------------------------------------------------- - -class CommandToolBarEvent(wx.PyCommandEvent): - """ A specialized command event class for events sent by L{AuiToolBar}. """ - - def __init__(self, command_type, win_id): - """ - Default class constructor. - - :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. - :param `win_id`: the window identification number. - """ - - if type(command_type) == types.IntType: - wx.PyCommandEvent.__init__(self, command_type, win_id) - else: - wx.PyCommandEvent.__init__(self, command_type.GetEventType(), command_type.GetId()) - - self.is_dropdown_clicked = False - self.click_pt = wx.Point(-1, -1) - self.rect = wx.Rect(-1, -1, 0, 0) - self.tool_id = -1 - - - def IsDropDownClicked(self): - """ Returns whether the drop down menu has been clicked. """ - - return self.is_dropdown_clicked - - - def SetDropDownClicked(self, c): - """ - Sets whether the drop down menu has been clicked. - - :param `c`: ``True`` to set the drop down as clicked, ``False`` otherwise. - """ - - self.is_dropdown_clicked = c - - - def GetClickPoint(self): - """ Returns the point where the user clicked with the mouse. """ - - return self.click_pt - - - def SetClickPoint(self, p): - """ - Sets the clicking point. - - :param `p`: a `wx.Point` object. - """ - - self.click_pt = p - - - def GetItemRect(self): - """ Returns the L{AuiToolBarItem} rectangle. """ - - return self.rect - - - def SetItemRect(self, r): - """ - Sets the L{AuiToolBarItem} rectangle. - - :param `r`: an instance of `wx.Rect`. - """ - - self.rect = r - - - def GetToolId(self): - """ Returns the L{AuiToolBarItem} identifier. """ - - return self.tool_id - - - def SetToolId(self, id): - """ - Sets the L{AuiToolBarItem} identifier. - - :param `id`: the toolbar item identifier. - """ - - self.tool_id = id - - -# ---------------------------------------------------------------------- - -class AuiToolBarEvent(CommandToolBarEvent): - """ A specialized command event class for events sent by L{AuiToolBar}. """ - - def __init__(self, command_type=None, win_id=0): - """ - Default class constructor. - - :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. - :param `win_id`: the window identification number. - """ - - CommandToolBarEvent.__init__(self, command_type, win_id) - - if type(command_type) == types.IntType: - self.notify = wx.NotifyEvent(command_type, win_id) - else: - self.notify = wx.NotifyEvent(command_type.GetEventType(), command_type.GetId()) - - - def GetNotifyEvent(self): - """ Returns the actual `wx.NotifyEvent`. """ - - return self.notify - - - def IsAllowed(self): - """ Returns whether the event is allowed or not. """ - - return self.notify.IsAllowed() - - - def Veto(self): - """ - Prevents the change announced by this event from happening. - - It is in general a good idea to notify the user about the reasons for - vetoing the change because otherwise the applications behaviour (which - just refuses to do what the user wants) might be quite surprising. - """ - - self.notify.Veto() - - - def Allow(self): - """ - This is the opposite of L{Veto}: it explicitly allows the event to be - processed. For most events it is not necessary to call this method as the - events are allowed anyhow but some are forbidden by default (this will - be mentioned in the corresponding event description). - """ - - self.notify.Allow() - - -# ---------------------------------------------------------------------- - -class ToolbarCommandCapture(wx.PyEvtHandler): - """ A class to handle the dropdown window menu. """ - - def __init__(self): - """ Default class constructor. """ - - wx.PyEvtHandler.__init__(self) - self._last_id = 0 - - - def GetCommandId(self): - """ Returns the event command identifier. """ - - return self._last_id - - - def ProcessEvent(self, event): - """ - Processes an event, searching event tables and calling zero or more suitable - event handler function(s). - - :param `event`: the event to process. - - :note: Normally, your application would not call this function: it is called - in the wxPython implementation to dispatch incoming user interface events - to the framework (and application). - However, you might need to call it if implementing new functionality (such as - a new control) where you define new event types, as opposed to allowing the - user to override functions. - - An instance where you might actually override the L{ProcessEvent} function is where - you want to direct event processing to event handlers not normally noticed by - wxPython. For example, in the document/view architecture, documents and views - are potential event handlers. When an event reaches a frame, L{ProcessEvent} will - need to be called on the associated document and view in case event handler - functions are associated with these objects. - - The normal order of event table searching is as follows: - - 1. If the object is disabled (via a call to `SetEvtHandlerEnabled`) the function - skips to step (6). - 2. If the object is a `wx.Window`, L{ProcessEvent} is recursively called on the window's - `wx.Validator`. If this returns ``True``, the function exits. - 3. wxWidgets `SearchEventTable` is called for this event handler. If this fails, the - base class table is tried, and so on until no more tables exist or an appropriate - function was found, in which case the function exits. - 4. The search is applied down the entire chain of event handlers (usually the chain - has a length of one). If this succeeds, the function exits. - 5. If the object is a `wx.Window` and the event is a `wx.CommandEvent`, L{ProcessEvent} is - recursively applied to the parent window's event handler. If this returns ``True``, - the function exits. - 6. Finally, L{ProcessEvent} is called on the `wx.App` object. - """ - - if event.GetEventType() == wx.wxEVT_COMMAND_MENU_SELECTED: - self._last_id = event.GetId() - return True - - if self.GetNextHandler(): - return self.GetNextHandler().ProcessEvent(event) - - return False - - -# ---------------------------------------------------------------------- - -class AuiToolBarItem(object): - """ - AuiToolBarItem is a toolbar element. - - It has a unique id (except for the separators which always have id = -1), the - style (telling whether it is a normal button, separator or a control), the - state (toggled or not, enabled or not) and short and long help strings. The - default implementations use the short help string for the tooltip text which - is popped up when the mouse pointer enters the tool and the long help string - for the applications status bar. - """ - - def __init__(self, item=None): - """ - Default class constructor. - - :param `item`: another instance of L{AuiToolBarItem}. - """ - - if item: - self.Assign(item) - return - - self.window = None - self.clockwisebmp = wx.NullBitmap - self.counterclockwisebmp = wx.NullBitmap - self.clockwisedisbmp = wx.NullBitmap - self.counterclockwisedisbmp = wx.NullBitmap - self.sizer_item = None - self.spacer_pixels = 0 - self.id = 0 - self.kind = ITEM_NORMAL - self.state = 0 # normal, enabled - self.proportion = 0 - self.active = True - self.dropdown = True - self.sticky = True - self.user_data = 0 - - self.label = "" - self.bitmap = wx.NullBitmap - self.disabled_bitmap = wx.NullBitmap - self.hover_bitmap = wx.NullBitmap - self.short_help = "" - self.long_help = "" - self.min_size = wx.Size(-1, -1) - self.alignment = wx.ALIGN_CENTER - self.orientation = AUI_TBTOOL_HORIZONTAL - - - def Assign(self, c): - """ - Assigns the properties of the L{AuiToolBarItem} `c` to `self`. - - :param `c`: another instance of L{AuiToolBarItem}. - """ - - self.window = c.window - self.label = c.label - self.bitmap = c.bitmap - self.disabled_bitmap = c.disabled_bitmap - self.hover_bitmap = c.hover_bitmap - self.short_help = c.short_help - self.long_help = c.long_help - self.sizer_item = c.sizer_item - self.min_size = c.min_size - self.spacer_pixels = c.spacer_pixels - self.id = c.id - self.kind = c.kind - self.state = c.state - self.proportion = c.proportion - self.active = c.active - self.dropdown = c.dropdown - self.sticky = c.sticky - self.user_data = c.user_data - self.alignment = c.alignment - self.orientation = c.orientation - - - def SetWindow(self, w): - """ - Assigns a window to the toolbar item. - - :param `w`: an instance of `wx.Window`. - """ - - self.window = w - - - def GetWindow(self): - """ Returns window associated to the toolbar item. """ - - return self.window - - - def SetId(self, new_id): - """ - Sets the toolbar item identifier. - - :param `new_id`: the new tool id. - """ - - self.id = new_id - - - def GetId(self): - """ Returns the toolbar item identifier. """ - - return self.id - - - def SetKind(self, new_kind): - """ - Sets the L{AuiToolBarItem} kind. - - :param `new_kind`: can be one of the following items: - - ======================== ============================= - Item Kind Description - ======================== ============================= - ``ITEM_CONTROL`` The item in the `AuiToolBar` is a control - ``ITEM_LABEL`` The item in the `AuiToolBar` is a text label - ``ITEM_SPACER`` The item in the `AuiToolBar` is a spacer - ``ITEM_SEPARATOR`` The item in the `AuiToolBar` is a separator - ``ITEM_CHECK`` The item in the `AuiToolBar` is a toolbar check item - ``ITEM_NORMAL`` The item in the `AuiToolBar` is a standard toolbar item - ``ITEM_RADIO`` The item in the `AuiToolBar` is a toolbar radio item - ======================== ============================= - """ - - self.kind = new_kind - - - def GetKind(self): - """ Returns the toolbar item kind. See L{SetKind} for more details. """ - - return self.kind - - - def SetState(self, new_state): - """ - Sets the toolbar item state. - - :param `new_state`: can be one of the following states: - - ============================================ ====================================== - Button State Constant Description - ============================================ ====================================== - ``AUI_BUTTON_STATE_NORMAL`` Normal button state - ``AUI_BUTTON_STATE_HOVER`` Hovered button state - ``AUI_BUTTON_STATE_PRESSED`` Pressed button state - ``AUI_BUTTON_STATE_DISABLED`` Disabled button state - ``AUI_BUTTON_STATE_HIDDEN`` Hidden button state - ``AUI_BUTTON_STATE_CHECKED`` Checked button state - ============================================ ====================================== - - """ - - self.state = new_state - - - def GetState(self): - """ - Returns the toolbar item state. See L{SetState} for more details. - - :see: L{SetState} - """ - - return self.state - - - def SetSizerItem(self, s): - """ - Associates a sizer item to this toolbar item. - - :param `s`: an instance of `wx.SizerItem`. - """ - - self.sizer_item = s - - - def GetSizerItem(self): - """ Returns the associated sizer item. """ - - return self.sizer_item - - - def SetLabel(self, s): - """ - Sets the toolbar item label. - - :param `s`: a string specifying the toolbar item label. - """ - - self.label = s - - - def GetLabel(self): - """ Returns the toolbar item label. """ - - return self.label - - - def SetBitmap(self, bmp): - """ - Sets the toolbar item bitmap. - - :param `bmp`: an instance of `wx.Bitmap`. - """ - - self.bitmap = bmp - - - def GetBitmap(self): - """ Returns the toolbar item bitmap. """ - - return self.GetRotatedBitmap(False) - - - def SetDisabledBitmap(self, bmp): - """ - Sets the toolbar item disabled bitmap. - - :param `bmp`: an instance of `wx.Bitmap`. - """ - - self.disabled_bitmap = bmp - - - def GetDisabledBitmap(self): - """ Returns the toolbar item disabled bitmap. """ - - return self.GetRotatedBitmap(True) - - - def SetHoverBitmap(self, bmp): - """ - Sets the toolbar item hover bitmap. - - :param `bmp`: an instance of `wx.Bitmap`. - """ - - self.hover_bitmap = bmp - - - def SetOrientation(self, a): - """ - Sets the toolbar tool orientation. - - :param `a`: one of ``AUI_TBTOOL_HORIZONTAL``, ``AUI_TBTOOL_VERT_CLOCKWISE`` or - ``AUI_TBTOOL_VERT_COUNTERCLOCKWISE``. - """ - - self.orientation = a - - - def GetOrientation(self): - """ Returns the toolbar tool orientation. """ - - return self.orientation - - - def GetHoverBitmap(self): - """ Returns the toolbar item hover bitmap. """ - - return self.hover_bitmap - - - def GetRotatedBitmap(self, disabled): - """ - Returns the correct bitmap depending on the tool orientation. - - :param `disabled`: whether to return the disabled bitmap or not. - """ - - bitmap_to_rotate = (disabled and [self.disabled_bitmap] or [self.bitmap])[0] - if not bitmap_to_rotate.IsOk() or self.orientation == AUI_TBTOOL_HORIZONTAL: - return bitmap_to_rotate - - rotated_bitmap = wx.NullBitmap - clockwise = True - if self.orientation == AUI_TBTOOL_VERT_CLOCKWISE: - rotated_bitmap = (disabled and [self.clockwisedisbmp] or [self.clockwisebmp])[0] - - elif self.orientation == AUI_TBTOOL_VERT_COUNTERCLOCKWISE: - rotated_bitmap = (disabled and [self.counterclockwisedisbmp] or [self.counterclockwisebmp])[0] - clockwise = False - - if not rotated_bitmap.IsOk(): - rotated_bitmap = wx.BitmapFromImage(bitmap_to_rotate.ConvertToImage().Rotate90(clockwise)) - - return rotated_bitmap - - - def SetShortHelp(self, s): - """ - Sets the short help string for the L{AuiToolBarItem}, to be displayed in a - `wx.ToolTip` when the mouse hover over the toolbar item. - - :param `s`: the tool short help string. - """ - - self.short_help = s - - - def GetShortHelp(self): - """ Returns the short help string for the L{AuiToolBarItem}. """ - - return self.short_help - - - def SetLongHelp(self, s): - """ - Sets the long help string for the toolbar item. This string is shown in the - statusbar (if any) of the parent frame when the mouse pointer is inside the - tool. - - :param `s`: the tool long help string. - """ - - self.long_help = s - - - def GetLongHelp(self): - """ Returns the long help string for the L{AuiToolBarItem}. """ - - return self.long_help - - - def SetMinSize(self, s): - """ - Sets the toolbar item minimum size. - - :param `s`: an instance of `wx.Size`. - """ - - self.min_size = wx.Size(*s) - - - def GetMinSize(self): - """ Returns the toolbar item minimum size. """ - - return self.min_size - - - def SetSpacerPixels(self, s): - """ - Sets the number of pixels for a toolbar item with kind = ``ITEM_SEPARATOR``. - - :param `s`: number of pixels. - """ - - self.spacer_pixels = s - - - def GetSpacerPixels(self): - """ Returns the number of pixels for a toolbar item with kind = ``ITEM_SEPARATOR``. """ - - return self.spacer_pixels - - - def SetProportion(self, p): - """ - Sets the L{AuiToolBarItem} proportion in the toolbar. - - :param `p`: the item proportion. - """ - - self.proportion = p - - - def GetProportion(self): - """ Returns the L{AuiToolBarItem} proportion in the toolbar. """ - - return self.proportion - - - def SetActive(self, b): - """ - Activates/deactivates the toolbar item. - - :param `b`: ``True`` to activate the item, ``False`` to deactivate it. - """ - - self.active = b - - - def IsActive(self): - """ Returns whether the toolbar item is active or not. """ - - return self.active - - - def SetHasDropDown(self, b): - """ - Sets whether the toolbar item has an associated dropdown menu. - - :param `b`: ``True`` to set a dropdown menu, ``False`` otherwise. - """ - - self.dropdown = b - - - def HasDropDown(self): - """ Returns whether the toolbar item has an associated dropdown menu or not. """ - - return self.dropdown - - - def SetSticky(self, b): - """ - Sets whether the toolbar item is sticky (permanent highlight after mouse enter) - or not. - - :param `b`: ``True`` to set the item as sticky, ``False`` otherwise. - """ - - self.sticky = b - - - def IsSticky(self): - """ Returns whether the toolbar item has a sticky behaviour or not. """ - - return self.sticky - - - def SetUserData(self, l): - """ - Associates some kind of user data to the toolbar item. - - :param `l`: a Python object. - - :note: The user data can be any Python object. - """ - - self.user_data = l - - - def GetUserData(self): - """ Returns the associated user data. """ - - return self.user_data - - - def SetAlignment(self, l): - """ - Sets the toolbar item alignment. - - :param `l`: the item alignment, which can be one of the available `wx.Sizer` - alignments. - """ - - self.alignment = l - - - def GetAlignment(self): - """ Returns the toolbar item alignment. """ - - return self.alignment - - -# ---------------------------------------------------------------------- - -class AuiDefaultToolBarArt(object): - """ - Toolbar art provider code - a tab provider provides all drawing functionality to - the L{AuiToolBar}. This allows the L{AuiToolBar} to have a plugable look-and-feel. - - By default, a L{AuiToolBar} uses an instance of this class called L{AuiDefaultToolBarArt} - which provides bitmap art and a colour scheme that is adapted to the major platforms' - look. You can either derive from that class to alter its behaviour or write a - completely new tab art class. Call L{AuiToolBar.SetArtProvider} to make use this - new tab art. - """ - - def __init__(self): - """ Default class constructor. """ - - self._base_colour = GetBaseColour() - - self._agwFlags = 0 - self._text_orientation = AUI_TBTOOL_TEXT_BOTTOM - self._highlight_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) - - self._separator_size = 7 - self._orientation = AUI_TBTOOL_HORIZONTAL - self._gripper_size = 7 - self._overflow_size = 16 - - darker1_colour = StepColour(self._base_colour, 85) - darker2_colour = StepColour(self._base_colour, 75) - darker3_colour = StepColour(self._base_colour, 60) - darker4_colour = StepColour(self._base_colour, 50) - darker5_colour = StepColour(self._base_colour, 40) - - self._gripper_pen1 = wx.Pen(darker5_colour) - self._gripper_pen2 = wx.Pen(darker3_colour) - self._gripper_pen3 = wx.WHITE_PEN - - button_dropdown_bits = "\xe0\xf1\xfb" - overflow_bits = "\x80\xff\x80\xc1\xe3\xf7" - - self._button_dropdown_bmp = BitmapFromBits(button_dropdown_bits, 5, 3, wx.BLACK) - self._disabled_button_dropdown_bmp = BitmapFromBits(button_dropdown_bits, 5, 3, - wx.Colour(128, 128, 128)) - self._overflow_bmp = BitmapFromBits(overflow_bits, 7, 6, wx.BLACK) - self._disabled_overflow_bmp = BitmapFromBits(overflow_bits, 7, 6, wx.Colour(128, 128, 128)) - - self._font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - - - def Clone(self): - """ Clones the L{AuiToolBar} art. """ - - return AuiDefaultToolBarArt() - - - def SetAGWFlags(self, agwFlags): - """ - Sets the toolbar art flags. - - :param `agwFlags`: a combination of the following values: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_TB_TEXT`` Shows the text in the toolbar buttons; by default only icons are shown - ``AUI_TB_NO_TOOLTIPS`` Don't show tooltips on `AuiToolBar` items - ``AUI_TB_NO_AUTORESIZE`` Do not auto-resize the `AuiToolBar` - ``AUI_TB_GRIPPER`` Shows a gripper on the `AuiToolBar` - ``AUI_TB_OVERFLOW`` The `AuiToolBar` can contain overflow items - ``AUI_TB_VERTICAL`` The `AuiToolBar` is vertical - ``AUI_TB_HORZ_LAYOUT`` Shows the text and the icons alongside, not vertically stacked. This style must be used with ``AUI_TB_TEXT`` - ``AUI_TB_PLAIN_BACKGROUND`` Don't draw a gradient background on the toolbar - ``AUI_TB_HORZ_TEXT`` Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT`` - ==================================== ================================== - - """ - - self._agwFlags = agwFlags - - - def GetAGWFlags(self): - """ - Returns the L{AuiDefaultToolBarArt} flags. See L{SetAGWFlags} for more - details. - - :see: L{SetAGWFlags} - """ - - return self._agwFlags - - - def SetFont(self, font): - """ - Sets the L{AuiDefaultToolBarArt} font. - - :param `font`: a `wx.Font` object. - """ - - self._font = font - - - def SetTextOrientation(self, orientation): - """ - Sets the text orientation. - - :param `orientation`: can be one of the following constants: - - ==================================== ================================== - Orientation Switches Description - ==================================== ================================== - ``AUI_TBTOOL_TEXT_LEFT`` Text in `AuiToolBar` items is aligned left - ``AUI_TBTOOL_TEXT_RIGHT`` Text in `AuiToolBar` items is aligned right - ``AUI_TBTOOL_TEXT_TOP`` Text in `AuiToolBar` items is aligned top - ``AUI_TBTOOL_TEXT_BOTTOM`` Text in `AuiToolBar` items is aligned bottom - ==================================== ================================== - - """ - - self._text_orientation = orientation - - - def GetFont(self): - """ Returns the L{AuiDefaultToolBarArt} font. """ - - return self._font - - - def GetTextOrientation(self): - """ - Returns the L{AuiDefaultToolBarArt} text orientation. See - L{SetTextOrientation} for more details. - - :see: L{SetTextOrientation} - """ - - return self._text_orientation - - - def SetOrientation(self, orientation): - """ - Sets the toolbar tool orientation. - - :param `orientation`: one of ``AUI_TBTOOL_HORIZONTAL``, ``AUI_TBTOOL_VERT_CLOCKWISE`` or - ``AUI_TBTOOL_VERT_COUNTERCLOCKWISE``. - """ - - self._orientation = orientation - - - def GetOrientation(self): - """ Returns the toolbar orientation. """ - - return self._orientation - - - def DrawBackground(self, dc, wnd, _rect, horizontal=True): - """ - Draws a toolbar background with a gradient shading. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `_rect`: the L{AuiToolBar} rectangle; - :param `horizontal`: ``True`` if the toolbar is horizontal, ``False`` if it is vertical. - """ - - rect = wx.Rect(*_rect) - - start_colour = StepColour(self._base_colour, 180) - end_colour = StepColour(self._base_colour, 85) - reflex_colour = StepColour(self._base_colour, 95) - - dc.GradientFillLinear(rect, start_colour, end_colour, - (horizontal and [wx.SOUTH] or [wx.EAST])[0]) - - left = rect.GetLeft() - right = rect.GetRight() - top = rect.GetTop() - bottom = rect.GetBottom() - - dc.SetPen(wx.Pen(reflex_colour)) - if horizontal: - dc.DrawLine(left, bottom, right+1, bottom) - else: - dc.DrawLine(right, top, right, bottom+1) - - - def DrawPlainBackground(self, dc, wnd, _rect): - """ - Draws a toolbar background with a plain colour. - - This method contrasts with the default behaviour of the L{AuiToolBar} that - draws a background gradient and this break the window design when putting - it within a control that has margin between the borders and the toolbar - (example: put L{AuiToolBar} within a `wx.StaticBoxSizer` that has a plain background). - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `_rect`: the L{AuiToolBar} rectangle. - """ - - rect = wx.Rect(*_rect) - rect.height += 1 - - dc.SetBrush(wx.Brush(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE))) - dc.DrawRectangle(rect.x - 1, rect.y - 1, rect.width + 2, rect.height + 1) - - - def DrawLabel(self, dc, wnd, item, rect): - """ - Draws a toolbar item label. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `item`: an instance of L{AuiToolBarItem}; - :param `rect`: the L{AuiToolBarItem} rectangle. - """ - - dc.SetFont(self._font) - dc.SetTextForeground(wx.BLACK) - orient = item.GetOrientation() - - horizontal = orient == AUI_TBTOOL_HORIZONTAL - # we only care about the text height here since the text - # will get cropped based on the width of the item - label_size = GetLabelSize(dc, item.GetLabel(), not horizontal) - text_width = label_size.GetWidth() - text_height = label_size.GetHeight() - - if orient == AUI_TBTOOL_HORIZONTAL: - text_x = rect.x - text_y = rect.y + (rect.height-text_height)/2 - dc.DrawText(item.GetLabel(), text_x, text_y) - - elif orient == AUI_TBTOOL_VERT_CLOCKWISE: - text_x = rect.x + (rect.width+text_width)/2 - text_y = rect.y - dc.DrawRotatedText(item.GetLabel(), text_x, text_y, 270) - - elif AUI_TBTOOL_VERT_COUNTERCLOCKWISE: - text_x = rect.x + (rect.width-text_width)/2 - text_y = rect.y + text_height - dc.DrawRotatedText(item.GetLabel(), text_x, text_y, 90) - - - def DrawButton(self, dc, wnd, item, rect): - """ - Draws a toolbar item button. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `item`: an instance of L{AuiToolBarItem}; - :param `rect`: the L{AuiToolBarItem} rectangle. - """ - - bmp_rect, text_rect = self.GetToolsPosition(dc, item, rect) - - if not item.GetState() & AUI_BUTTON_STATE_DISABLED: - - if item.GetState() & AUI_BUTTON_STATE_PRESSED: - - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 150))) - dc.DrawRectangleRect(rect) - - elif item.GetState() & AUI_BUTTON_STATE_HOVER or item.IsSticky(): - - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) - - # draw an even lighter background for checked item hovers (since - # the hover background is the same colour as the check background) - if item.GetState() & AUI_BUTTON_STATE_CHECKED: - dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 180))) - - dc.DrawRectangleRect(rect) - - elif item.GetState() & AUI_BUTTON_STATE_CHECKED: - - # it's important to put this code in an else statment after the - # hover, otherwise hovers won't draw properly for checked items - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) - dc.DrawRectangleRect(rect) - - if item.GetState() & AUI_BUTTON_STATE_DISABLED: - bmp = item.GetDisabledBitmap() - else: - bmp = item.GetBitmap() - - if bmp.IsOk(): - dc.DrawBitmap(bmp, bmp_rect.x, bmp_rect.y, True) - - # set the item's text colour based on if it is disabled - dc.SetTextForeground(wx.BLACK) - if item.GetState() & AUI_BUTTON_STATE_DISABLED: - dc.SetTextForeground(DISABLED_TEXT_COLOUR) - - if self._agwFlags & AUI_TB_TEXT and item.GetLabel() != "": - self.DrawLabel(dc, wnd, item, text_rect) - - - def DrawDropDownButton(self, dc, wnd, item, rect): - """ - Draws a toolbar dropdown button. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `item`: an instance of L{AuiToolBarItem}; - :param `rect`: the L{AuiToolBarItem} rectangle. - """ - - dropbmp_x = dropbmp_y = 0 - - button_rect = wx.Rect(rect.x, rect.y, rect.width-BUTTON_DROPDOWN_WIDTH, rect.height) - dropdown_rect = wx.Rect(rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1, rect.y, BUTTON_DROPDOWN_WIDTH+1, rect.height) - - horizontal = item.GetOrientation() == AUI_TBTOOL_HORIZONTAL - - if horizontal: - button_rect = wx.Rect(rect.x, rect.y, rect.width-BUTTON_DROPDOWN_WIDTH, rect.height) - dropdown_rect = wx.Rect(rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1, rect.y, BUTTON_DROPDOWN_WIDTH+1, rect.height) - else: - button_rect = wx.Rect(rect.x, rect.y, rect.width, rect.height-BUTTON_DROPDOWN_WIDTH) - dropdown_rect = wx.Rect(rect.x, rect.y+rect.height-BUTTON_DROPDOWN_WIDTH-1, rect.width, BUTTON_DROPDOWN_WIDTH+1) - - dropbmp_width = self._button_dropdown_bmp.GetWidth() - dropbmp_height = self._button_dropdown_bmp.GetHeight() - if not horizontal: - tmp = dropbmp_width - dropbmp_width = dropbmp_height - dropbmp_height = tmp - - dropbmp_x = dropdown_rect.x + (dropdown_rect.width/2) - dropbmp_width/2 - dropbmp_y = dropdown_rect.y + (dropdown_rect.height/2) - dropbmp_height/2 - - bmp_rect, text_rect = self.GetToolsPosition(dc, item, button_rect) - - if item.GetState() & AUI_BUTTON_STATE_PRESSED: - - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 140))) - dc.DrawRectangleRect(button_rect) - dc.DrawRectangleRect(dropdown_rect) - - elif item.GetState() & AUI_BUTTON_STATE_HOVER or item.IsSticky(): - - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) - dc.DrawRectangleRect(button_rect) - dc.DrawRectangleRect(dropdown_rect) - - elif item.GetState() & AUI_BUTTON_STATE_CHECKED: - # it's important to put this code in an else statment after the - # hover, otherwise hovers won't draw properly for checked items - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) - dc.DrawRectangle(button_rect) - dc.DrawRectangle(dropdown_rect) - - if item.GetState() & AUI_BUTTON_STATE_DISABLED: - - bmp = item.GetDisabledBitmap() - dropbmp = self._disabled_button_dropdown_bmp - - else: - - bmp = item.GetBitmap() - dropbmp = self._button_dropdown_bmp - - if not bmp.IsOk(): - return - - dc.DrawBitmap(bmp, bmp_rect.x, bmp_rect.y, True) - if horizontal: - dc.DrawBitmap(dropbmp, dropbmp_x, dropbmp_y, True) - else: - dc.DrawBitmap(wx.BitmapFromImage(dropbmp.ConvertToImage().Rotate90(item.GetOrientation() == AUI_TBTOOL_VERT_CLOCKWISE)), - dropbmp_x, dropbmp_y, True) - - # set the item's text colour based on if it is disabled - dc.SetTextForeground(wx.BLACK) - if item.GetState() & AUI_BUTTON_STATE_DISABLED: - dc.SetTextForeground(DISABLED_TEXT_COLOUR) - - if self._agwFlags & AUI_TB_TEXT and item.GetLabel() != "": - self.DrawLabel(dc, wnd, item, text_rect) - - - def DrawControlLabel(self, dc, wnd, item, rect): - """ - Draws a label for a toolbar control. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `item`: an instance of L{AuiToolBarItem}; - :param `rect`: the L{AuiToolBarItem} rectangle. - """ - - label_size = GetLabelSize(dc, item.GetLabel(), item.GetOrientation() != AUI_TBTOOL_HORIZONTAL) - text_height = label_size.GetHeight() - text_width = label_size.GetWidth() - - dc.SetFont(self._font) - - if self._agwFlags & AUI_TB_TEXT: - - tx, text_height = dc.GetTextExtent("ABCDHgj") - - text_width, ty = dc.GetTextExtent(item.GetLabel()) - - # don't draw the label if it is wider than the item width - if text_width > rect.width: - return - - # set the label's text colour - dc.SetTextForeground(wx.BLACK) - - text_x = rect.x + (rect.width/2) - (text_width/2) + 1 - text_y = rect.y + rect.height - text_height - 1 - - if self._agwFlags & AUI_TB_TEXT and item.GetLabel() != "": - dc.DrawText(item.GetLabel(), text_x, text_y) - - - def GetLabelSize(self, dc, wnd, item): - """ - Returns the label size for a toolbar item. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `item`: an instance of L{AuiToolBarItem}. - """ - - dc.SetFont(self._font) - label_size = GetLabelSize(dc, item.GetLabel(), self._orientation != AUI_TBTOOL_HORIZONTAL) - - return wx.Size(item.GetMinSize().GetWidth(), label_size.GetHeight()) - - - def GetToolSize(self, dc, wnd, item): - """ - Returns the toolbar item size. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `item`: an instance of L{AuiToolBarItem}. - """ - - if not item.GetBitmap().IsOk() and not self._agwFlags & AUI_TB_TEXT: - return wx.Size(16, 16) - - width = item.GetBitmap().GetWidth() - height = item.GetBitmap().GetHeight() - - if self._agwFlags & AUI_TB_TEXT: - - dc.SetFont(self._font) - label_size = GetLabelSize(dc, item.GetLabel(), self.GetOrientation() != AUI_TBTOOL_HORIZONTAL) - padding = 6 - - if self._text_orientation == AUI_TBTOOL_TEXT_BOTTOM: - - if self.GetOrientation() != AUI_TBTOOL_HORIZONTAL: - height += 3 # space between top border and bitmap - height += 3 # space between bitmap and text - padding = 0 - - height += label_size.GetHeight() - - if item.GetLabel() != "": - width = max(width, label_size.GetWidth()+padding) - - elif self._text_orientation == AUI_TBTOOL_TEXT_RIGHT and item.GetLabel() != "": - - if self.GetOrientation() == AUI_TBTOOL_HORIZONTAL: - - width += 3 # space between left border and bitmap - width += 3 # space between bitmap and text - padding = 0 - - width += label_size.GetWidth() - height = max(height, label_size.GetHeight()+padding) - - # if the tool has a dropdown button, add it to the width - if item.HasDropDown(): - if item.GetOrientation() == AUI_TBTOOL_HORIZONTAL: - width += BUTTON_DROPDOWN_WIDTH+4 - else: - height += BUTTON_DROPDOWN_WIDTH+4 - - return wx.Size(width, height) - - - def DrawSeparator(self, dc, wnd, _rect): - """ - Draws a toolbar separator. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `_rect`: the L{AuiToolBarItem} rectangle. - """ - - horizontal = True - if self._agwFlags & AUI_TB_VERTICAL: - horizontal = False - - rect = wx.Rect(*_rect) - - if horizontal: - - rect.x += (rect.width/2) - rect.width = 1 - new_height = (rect.height*3)/4 - rect.y += (rect.height/2) - (new_height/2) - rect.height = new_height - - else: - - rect.y += (rect.height/2) - rect.height = 1 - new_width = (rect.width*3)/4 - rect.x += (rect.width/2) - (new_width/2) - rect.width = new_width - - start_colour = StepColour(self._base_colour, 80) - end_colour = StepColour(self._base_colour, 80) - dc.GradientFillLinear(rect, start_colour, end_colour, (horizontal and [wx.SOUTH] or [wx.EAST])[0]) - - - def DrawGripper(self, dc, wnd, rect): - """ - Draws the toolbar gripper. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `rect`: the L{AuiToolBar} rectangle. - """ - - i = 0 - while 1: - - if self._agwFlags & AUI_TB_VERTICAL: - - x = rect.x + (i*4) + 4 - y = rect.y + 3 - if x > rect.GetWidth() - 4: - break - - else: - - x = rect.x + 3 - y = rect.y + (i*4) + 4 - if y > rect.GetHeight() - 4: - break - - dc.SetPen(self._gripper_pen1) - dc.DrawPoint(x, y) - dc.SetPen(self._gripper_pen2) - dc.DrawPoint(x, y+1) - dc.DrawPoint(x+1, y) - dc.SetPen(self._gripper_pen3) - dc.DrawPoint(x+2, y+1) - dc.DrawPoint(x+2, y+2) - dc.DrawPoint(x+1, y+2) - - i += 1 - - - def DrawOverflowButton(self, dc, wnd, rect, state): - """ - Draws the overflow button for the L{AuiToolBar}. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` derived window; - :param `rect`: the L{AuiToolBar} rectangle; - :param `state`: the overflow button state. - """ - - if state & AUI_BUTTON_STATE_HOVER or state & AUI_BUTTON_STATE_PRESSED: - - cli_rect = wnd.GetClientRect() - light_gray_bg = StepColour(self._highlight_colour, 170) - - if self._agwFlags & AUI_TB_VERTICAL: - - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.DrawLine(rect.x, rect.y, rect.x+rect.width, rect.y) - dc.SetPen(wx.Pen(light_gray_bg)) - dc.SetBrush(wx.Brush(light_gray_bg)) - dc.DrawRectangle(rect.x, rect.y+1, rect.width, rect.height) - - else: - - dc.SetPen(wx.Pen(self._highlight_colour)) - dc.DrawLine(rect.x, rect.y, rect.x, rect.y+rect.height) - dc.SetPen(wx.Pen(light_gray_bg)) - dc.SetBrush(wx.Brush(light_gray_bg)) - dc.DrawRectangle(rect.x+1, rect.y, rect.width, rect.height) - - x = rect.x + 1 + (rect.width-self._overflow_bmp.GetWidth())/2 - y = rect.y + 1 + (rect.height-self._overflow_bmp.GetHeight())/2 - dc.DrawBitmap(self._overflow_bmp, x, y, True) - - - def GetElementSize(self, element_id): - """ - Returns the size of a UI element in the L{AuiToolBar}. - - :param `element_id`: can be one of the following: - - ==================================== ================================== - Element Identifier Description - ==================================== ================================== - ``AUI_TBART_SEPARATOR_SIZE`` Separator size in `AuiToolBar` - ``AUI_TBART_GRIPPER_SIZE`` Gripper size in `AuiToolBar` - ``AUI_TBART_OVERFLOW_SIZE`` Overflow button size in `AuiToolBar` - ==================================== ================================== - """ - - if element_id == AUI_TBART_SEPARATOR_SIZE: - return self._separator_size - elif element_id == AUI_TBART_GRIPPER_SIZE: - return self._gripper_size - elif element_id == AUI_TBART_OVERFLOW_SIZE: - return self._overflow_size - - return 0 - - - def SetElementSize(self, element_id, size): - """ - Sets the size of a UI element in the L{AuiToolBar}. - - :param `element_id`: can be one of the following: - - ==================================== ================================== - Element Identifier Description - ==================================== ================================== - ``AUI_TBART_SEPARATOR_SIZE`` Separator size in `AuiToolBar` - ``AUI_TBART_GRIPPER_SIZE`` Gripper size in `AuiToolBar` - ``AUI_TBART_OVERFLOW_SIZE`` Overflow button size in `AuiToolBar` - ==================================== ================================== - - :param `size`: the new size of the UI element. - """ - - if element_id == AUI_TBART_SEPARATOR_SIZE: - self._separator_size = size - elif element_id == AUI_TBART_GRIPPER_SIZE: - self._gripper_size = size - elif element_id == AUI_TBART_OVERFLOW_SIZE: - self._overflow_size = size - - - def ShowDropDown(self, wnd, items): - """ - Shows the drop down window menu for overflow items. - - :param `wnd`: an instance of `wx.Window`; - :param `items`: the overflow toolbar items (a Python list). - """ - - menuPopup = wx.Menu() - items_added = 0 - - for item in items: - - if item.GetKind() not in [ITEM_SEPARATOR, ITEM_SPACER, ITEM_CONTROL]: - - text = item.GetShortHelp() - if text == "": - text = item.GetLabel() - if text == "": - text = " " - - kind = item.GetKind() - m = wx.MenuItem(menuPopup, item.GetId(), text, item.GetShortHelp(), kind) - orientation = item.GetOrientation() - item.SetOrientation(AUI_TBTOOL_HORIZONTAL) - - if kind not in [ITEM_CHECK, ITEM_RADIO]: - m.SetBitmap(item.GetBitmap()) - - item.SetOrientation(orientation) - - menuPopup.AppendItem(m) - if kind in [ITEM_CHECK, ITEM_RADIO]: - state = (item.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] - m.Check(state) - - items_added += 1 - - else: - - if items_added > 0 and item.GetKind() == ITEM_SEPARATOR: - menuPopup.AppendSeparator() - - # find out where to put the popup menu of window items - pt = wx.GetMousePosition() - pt = wnd.ScreenToClient(pt) - - # find out the screen coordinate at the bottom of the tab ctrl - cli_rect = wnd.GetClientRect() - pt.y = cli_rect.y + cli_rect.height - - cc = ToolbarCommandCapture() - wnd.PushEventHandler(cc) - - # Adjustments to get slightly better menu placement - if wx.Platform == "__WXMAC__": - pt.y += 5 - pt.x -= 5 - - wnd.PopupMenu(menuPopup, pt) - command = cc.GetCommandId() - wnd.PopEventHandler(True) - - return command - - - def GetToolsPosition(self, dc, item, rect): - """ - Returns the bitmap and text rectangles for a toolbar item. - - :param `dc`: a `wx.DC` device context; - :param `item`: an instance of L{AuiToolBarItem}; - :param `rect`: the tool rect. - """ - - text_width = text_height = 0 - horizontal = self._orientation == AUI_TBTOOL_HORIZONTAL - text_bottom = self._text_orientation == AUI_TBTOOL_TEXT_BOTTOM - text_right = self._text_orientation == AUI_TBTOOL_TEXT_RIGHT - bmp_width = item.GetBitmap().GetWidth() - bmp_height = item.GetBitmap().GetHeight() - - if self._agwFlags & AUI_TB_TEXT: - dc.SetFont(self._font) - label_size = GetLabelSize(dc, item.GetLabel(), not horizontal) - text_height = label_size.GetHeight() - text_width = label_size.GetWidth() - - bmp_x = bmp_y = text_x = text_y = 0 - - if horizontal and text_bottom: - bmp_x = rect.x + (rect.width/2) - (bmp_width/2) - bmp_y = rect.y + 3 - text_x = rect.x + (rect.width/2) - (text_width/2) - text_y = rect.y + ((bmp_y - rect.y) * 2) + bmp_height - - elif horizontal and text_right: - bmp_x = rect.x + 3 - bmp_y = rect.y + (rect.height/2) - (bmp_height / 2) - text_x = rect.x + ((bmp_x - rect.x) * 2) + bmp_width - text_y = rect.y + (rect.height/2) - (text_height/2) - - elif not horizontal and text_bottom: - bmp_x = rect.x + (rect.width / 2) - (bmp_width / 2) - bmp_y = rect.y + 3 - text_x = rect.x + (rect.width / 2) - (text_width / 2) - text_y = rect.y + ((bmp_y - rect.y) * 2) + bmp_height - - bmp_rect = wx.Rect(bmp_x, bmp_y, bmp_width, bmp_height) - text_rect = wx.Rect(text_x, text_y, text_width, text_height) - - return bmp_rect, text_rect - - -class AuiToolBar(wx.PyControl): - """ - AuiToolBar is a completely owner-drawn toolbar perfectly integrated with the - AUI layout system. This allows drag and drop of toolbars, docking/floating - behaviour and the possibility to define "overflow" items in the toolbar itself. - - The default theme that is used is L{AuiDefaultToolBarArt}, which provides a modern, - glossy look and feel. The theme can be changed by calling L{AuiToolBar.SetArtProvider}. - """ - - def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, - size=wx.DefaultSize, style=0, agwStyle=AUI_TB_DEFAULT_STYLE): - """ - Default class constructor. - - :param `parent`: the L{AuiToolBar} parent; - :param `id`: an identifier for the control: a value of -1 is taken to mean a default; - :param `pos`: the control position. A value of (-1, -1) indicates a default position, - chosen by either the windowing system or wxPython, depending on platform; - :param `size`: the control size. A value of (-1, -1) indicates a default size, - chosen by either the windowing system or wxPython, depending on platform; - :param `style`: the control window style; - :param `agwStyle`: the AGW-specific window style. This can be a combination of the - following bits: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_TB_TEXT`` Shows the text in the toolbar buttons; by default only icons are shown - ``AUI_TB_NO_TOOLTIPS`` Don't show tooltips on `AuiToolBar` items - ``AUI_TB_NO_AUTORESIZE`` Do not auto-resize the `AuiToolBar` - ``AUI_TB_GRIPPER`` Shows a gripper on the `AuiToolBar` - ``AUI_TB_OVERFLOW`` The `AuiToolBar` can contain overflow items - ``AUI_TB_VERTICAL`` The `AuiToolBar` is vertical - ``AUI_TB_HORZ_LAYOUT`` Shows the text and the icons alongside, not vertically stacked. This style must be used with ``AUI_TB_TEXT`` - ``AUI_TB_PLAIN_BACKGROUND`` Don't draw a gradient background on the toolbar - ``AUI_TB_HORZ_TEXT`` Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT`` - ==================================== ================================== - - The default value for `agwStyle` is: ``AUI_TB_DEFAULT_STYLE`` = 0 - - """ - - wx.PyControl.__init__(self, parent, id, pos, size, style|wx.BORDER_NONE) - - self._sizer = wx.BoxSizer(wx.HORIZONTAL) - self.SetSizer(self._sizer) - self._button_width = -1 - self._button_height = -1 - self._sizer_element_count = 0 - self._action_pos = wx.Point(-1, -1) - self._action_item = None - self._tip_item = None - self._art = AuiDefaultToolBarArt() - self._tool_packing = 2 - self._tool_border_padding = 3 - self._tool_text_orientation = AUI_TBTOOL_TEXT_BOTTOM - self._tool_orientation = AUI_TBTOOL_HORIZONTAL - self._tool_alignment = wx.EXPAND - self._gripper_sizer_item = None - self._overflow_sizer_item = None - self._dragging = False - - self._agwStyle = self._originalStyle = agwStyle - - self._gripper_visible = (self._agwStyle & AUI_TB_GRIPPER and [True] or [False])[0] - self._overflow_visible = (self._agwStyle & AUI_TB_OVERFLOW and [True] or [False])[0] - self._overflow_state = 0 - self._custom_overflow_prepend = [] - self._custom_overflow_append = [] - - self._items = [] - - self.SetMargins(5, 5, 2, 2) - self.SetFont(wx.NORMAL_FONT) - self._art.SetAGWFlags(self._agwStyle) - self.SetExtraStyle(wx.WS_EX_PROCESS_IDLE) - - if agwStyle & AUI_TB_HORZ_LAYOUT: - self.SetToolTextOrientation(AUI_TBTOOL_TEXT_RIGHT) - elif agwStyle & AUI_TB_VERTICAL: - if agwStyle & AUI_TB_CLOCKWISE: - self.SetToolOrientation(AUI_TBTOOL_VERT_CLOCKWISE) - elif agwStyle & AUI_TB_COUNTERCLOCKWISE: - self.SetToolOrientation(AUI_TBTOOL_VERT_COUNTERCLOCKWISE) - - self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) - - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Bind(wx.EVT_IDLE, self.OnIdle) - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) - self.Bind(wx.EVT_PAINT, self.OnPaint) - self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) - self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown) - self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) - self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) - self.Bind(wx.EVT_RIGHT_DCLICK, self.OnRightDown) - self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) - self.Bind(wx.EVT_MIDDLE_DOWN, self.OnMiddleDown) - self.Bind(wx.EVT_MIDDLE_DCLICK, self.OnMiddleDown) - self.Bind(wx.EVT_MIDDLE_UP, self.OnMiddleUp) - self.Bind(wx.EVT_MOTION, self.OnMotion) - self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) - self.Bind(wx.EVT_SET_CURSOR, self.OnSetCursor) - - - def SetWindowStyleFlag(self, style): - """ - Sets the style of the window. - - :param `style`: the new window style. - - :note: Please note that some styles cannot be changed after the window - creation and that `Refresh` might need to be be called after changing the - others for the change to take place immediately. - - :note: Overridden from `wx.PyControl`. - """ - - wx.PyControl.SetWindowStyleFlag(self, style|wx.BORDER_NONE) - - - def SetAGWWindowStyleFlag(self, agwStyle): - """ - Sets the AGW-specific style of the window. - - :param `agwStyle`: the new window style. This can be a combination of the - following bits: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_TB_TEXT`` Shows the text in the toolbar buttons; by default only icons are shown - ``AUI_TB_NO_TOOLTIPS`` Don't show tooltips on `AuiToolBar` items - ``AUI_TB_NO_AUTORESIZE`` Do not auto-resize the `AuiToolBar` - ``AUI_TB_GRIPPER`` Shows a gripper on the `AuiToolBar` - ``AUI_TB_OVERFLOW`` The `AuiToolBar` can contain overflow items - ``AUI_TB_VERTICAL`` The `AuiToolBar` is vertical - ``AUI_TB_HORZ_LAYOUT`` Shows the text and the icons alongside, not vertically stacked. This style must be used with ``AUI_TB_TEXT`` - ``AUI_TB_PLAIN_BACKGROUND`` Don't draw a gradient background on the toolbar - ``AUI_TB_HORZ_TEXT`` Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT`` - ==================================== ================================== - - :note: Please note that some styles cannot be changed after the window - creation and that `Refresh` might need to be be called after changing the - others for the change to take place immediately. - """ - - self._agwStyle = self._originalStyle = agwStyle - - if self._art: - self._art.SetAGWFlags(self._agwStyle) - - if agwStyle & AUI_TB_GRIPPER: - self._gripper_visible = True - else: - self._gripper_visible = False - - if agwStyle & AUI_TB_OVERFLOW: - self._overflow_visible = True - else: - self._overflow_visible = False - - if agwStyle & AUI_TB_HORZ_LAYOUT: - self.SetToolTextOrientation(AUI_TBTOOL_TEXT_RIGHT) - else: - self.SetToolTextOrientation(AUI_TBTOOL_TEXT_BOTTOM) - - if agwStyle & AUI_TB_VERTICAL: - if agwStyle & AUI_TB_CLOCKWISE: - self.SetToolOrientation(AUI_TBTOOL_VERT_CLOCKWISE) - elif agwStyle & AUI_TB_COUNTERCLOCKWISE: - self.SetToolOrientation(AUI_TBTOOL_VERT_COUNTERCLOCKWISE) - - - def GetAGWWindowStyleFlag(self): - """ - Returns the AGW-specific window style flag. - - :see: L{SetAGWWindowStyleFlag} for an explanation of various AGW-specific style. - """ - - return self._agwStyle - - - def SetArtProvider(self, art): - """ - Instructs L{AuiToolBar} to use art provider specified by parameter `art` - for all drawing calls. This allows plugable look-and-feel features. - - :param `art`: an art provider. - - :note: The previous art provider object, if any, will be deleted by L{AuiToolBar}. - """ - - del self._art - self._art = art - - if self._art: - self._art.SetAGWFlags(self._agwStyle) - self._art.SetTextOrientation(self._tool_text_orientation) - self._art.SetOrientation(self._tool_orientation) - - - def GetArtProvider(self): - """ Returns the current art provider being used. """ - - return self._art - - - def AddSimpleTool(self, tool_id, label, bitmap, short_help_string="", kind=ITEM_NORMAL): - """ - Adds a tool to the toolbar. This is the simplest method you can use to - ass an item to the L{AuiToolBar}. - - :param `tool_id`: an integer by which the tool may be identified in subsequent operations; - :param `label`: the toolbar tool label; - :param `bitmap`: the primary tool bitmap; - :param `short_help_string`: this string is used for the tools tooltip; - :param `kind`: the item kind. Can be one of the following: - - ======================== ============================= - Item Kind Description - ======================== ============================= - ``ITEM_CONTROL`` The item in the `AuiToolBar` is a control - ``ITEM_LABEL`` The item in the `AuiToolBar` is a text label - ``ITEM_SPACER`` The item in the `AuiToolBar` is a spacer - ``ITEM_SEPARATOR`` The item in the `AuiToolBar` is a separator - ``ITEM_CHECK`` The item in the `AuiToolBar` is a toolbar check item - ``ITEM_NORMAL`` The item in the `AuiToolBar` is a standard toolbar item - ``ITEM_RADIO`` The item in the `AuiToolBar` is a toolbar radio item - ======================== ============================= - """ - - return self.AddTool(tool_id, label, bitmap, wx.NullBitmap, kind, short_help_string, "", None) - - - def AddToggleTool(self, tool_id, bitmap, disabled_bitmap, toggle=False, client_data=None, short_help_string="", long_help_string=""): - """ - Adds a toggle tool to the toolbar. - - :param `tool_id`: an integer by which the tool may be identified in subsequent operations; - :param `bitmap`: the primary tool bitmap; - :param `disabled_bitmap`: the bitmap to use when the tool is disabled. If it is equal to - `wx.NullBitmap`, the disabled bitmap is automatically generated by greing the normal one; - :param `client_data`: whatever Python object to associate with the toolbar item; - :param `short_help_string`: this string is used for the tools tooltip; - :param `long_help_string`: this string is shown in the statusbar (if any) of the parent - frame when the mouse pointer is inside the tool. - """ - - kind = (toggle and [ITEM_CHECK] or [ITEM_NORMAL])[0] - return self.AddTool(tool_id, "", bitmap, disabled_bitmap, kind, short_help_string, long_help_string, client_data) - - - def AddTool(self, tool_id, label, bitmap, disabled_bitmap, kind, short_help_string, long_help_string, client_data): - """ - Adds a tool to the toolbar. This is the full feature version of L{AddTool}. - - :param `tool_id`: an integer by which the tool may be identified in subsequent operations; - :param `label`: the toolbar tool label; - :param `bitmap`: the primary tool bitmap; - :param `disabled_bitmap`: the bitmap to use when the tool is disabled. If it is equal to - `wx.NullBitmap`, the disabled bitmap is automatically generated by greing the normal one; - :param `kind`: the item kind. Can be one of the following: - - ======================== ============================= - Item Kind Description - ======================== ============================= - ``ITEM_CONTROL`` The item in the `AuiToolBar` is a control - ``ITEM_LABEL`` The item in the `AuiToolBar` is a text label - ``ITEM_SPACER`` The item in the `AuiToolBar` is a spacer - ``ITEM_SEPARATOR`` The item in the `AuiToolBar` is a separator - ``ITEM_CHECK`` The item in the `AuiToolBar` is a toolbar check item - ``ITEM_NORMAL`` The item in the `AuiToolBar` is a standard toolbar item - ``ITEM_RADIO`` The item in the `AuiToolBar` is a toolbar radio item - ======================== ============================= - - :param `short_help_string`: this string is used for the tools tooltip; - :param `long_help_string`: this string is shown in the statusbar (if any) of the parent - frame when the mouse pointer is inside the tool. - :param `client_data`: whatever Python object to associate with the toolbar item. - """ - - item = AuiToolBarItem() - item.window = None - item.label = label - item.bitmap = bitmap - item.disabled_bitmap = disabled_bitmap - item.short_help = short_help_string - item.long_help = long_help_string - item.active = True - item.dropdown = False - item.spacer_pixels = 0 - - if tool_id == wx.ID_ANY: - tool_id = wx.NewId() - - item.id = tool_id - item.state = 0 - item.proportion = 0 - item.kind = kind - item.sizer_item = None - item.min_size = wx.Size(-1, -1) - item.user_data = 0 - item.sticky = False - item.orientation = self._tool_orientation - - if not item.disabled_bitmap.IsOk(): - # no disabled bitmap specified, we need to make one - if item.bitmap.IsOk(): - item.disabled_bitmap = MakeDisabledBitmap(item.bitmap) - - self._items.append(item) - return self._items[-1] - - - def AddCheckTool(self, tool_id, label, bitmap, disabled_bitmap, short_help_string="", long_help_string="", client_data=None): - """ - Adds a new check (or toggle) tool to the L{AuiToolBar}. - - :see: L{AddTool}. - """ - - return self.AddTool(tool_id, label, bitmap, disabled_bitmap, ITEM_CHECK, short_help_string, long_help_string, client_data) - - - def AddRadioTool(self, tool_id, label, bitmap, disabled_bitmap, short_help_string="", long_help_string="", client_data=None): - """ - Adds a new radio tool to the toolbar. - - Consecutive radio tools form a radio group such that exactly one button - in the group is pressed at any moment, in other words whenever a button - in the group is pressed the previously pressed button is automatically - released. You should avoid having the radio groups of only one element - as it would be impossible for the user to use such button. - - :note: By default, the first button in the radio group is initially pressed, - the others are not. - - :see: L{AddTool}. - """ - - return self.AddTool(tool_id, label, bitmap, disabled_bitmap, ITEM_RADIO, short_help_string, long_help_string, client_data) - - - def AddControl(self, control, label=""): - """ - Adds any control to the toolbar, typically e.g. a combobox. - - :param `control`: the control to be added; - :param `label`: the label which appears if the control goes into the - overflow items in the toolbar. - """ - - item = AuiToolBarItem() - item.window = control - item.label = label - item.bitmap = wx.NullBitmap - item.disabled_bitmap = wx.NullBitmap - item.active = True - item.dropdown = False - item.spacer_pixels = 0 - item.id = control.GetId() - item.state = 0 - item.proportion = 0 - item.kind = ITEM_CONTROL - item.sizer_item = None - item.min_size = control.GetEffectiveMinSize() - item.user_data = 0 - item.sticky = False - item.orientation = self._tool_orientation - - self._items.append(item) - return self._items[-1] - - - def AddLabel(self, tool_id, label="", width=0): - """ - Adds a label tool to the L{AuiToolBar}. - - :param `tool_id`: an integer by which the tool may be identified in subsequent operations; - :param `label`: the toolbar tool label; - :param `width`: the tool width. - """ - - min_size = wx.Size(-1, -1) - - if width != -1: - min_size.x = width - - item = AuiToolBarItem() - item.window = None - item.label = label - item.bitmap = wx.NullBitmap - item.disabled_bitmap = wx.NullBitmap - item.active = True - item.dropdown = False - item.spacer_pixels = 0 - - if tool_id == wx.ID_ANY: - tool_id = wx.NewId() - - item.id = tool_id - item.state = 0 - item.proportion = 0 - item.kind = ITEM_LABEL - item.sizer_item = None - item.min_size = min_size - item.user_data = 0 - item.sticky = False - item.orientation = self._tool_orientation - - self._items.append(item) - return self._items[-1] - - - def AddSeparator(self): - """ Adds a separator for spacing groups of tools. """ - - item = AuiToolBarItem() - item.window = None - item.label = "" - item.bitmap = wx.NullBitmap - item.disabled_bitmap = wx.NullBitmap - item.active = True - item.dropdown = False - item.id = -1 - item.state = 0 - item.proportion = 0 - item.kind = ITEM_SEPARATOR - item.sizer_item = None - item.min_size = wx.Size(-1, -1) - item.user_data = 0 - item.sticky = False - item.orientation = self._tool_orientation - - self._items.append(item) - return self._items[-1] - - - def AddSpacer(self, pixels): - """ - Adds a spacer for spacing groups of tools. - - :param `pixels`: the width of the spacer. - """ - - item = AuiToolBarItem() - item.window = None - item.label = "" - item.bitmap = wx.NullBitmap - item.disabled_bitmap = wx.NullBitmap - item.active = True - item.dropdown = False - item.spacer_pixels = pixels - item.id = -1 - item.state = 0 - item.proportion = 0 - item.kind = ITEM_SPACER - item.sizer_item = None - item.min_size = wx.Size(-1, -1) - item.user_data = 0 - item.sticky = False - item.orientation = self._tool_orientation - - self._items.append(item) - return self._items[-1] - - - def AddStretchSpacer(self, proportion=1): - """ - Adds a stretchable spacer for spacing groups of tools. - - :param `proportion`: the stretchable spacer proportion. - """ - - item = AuiToolBarItem() - item.window = None - item.label = "" - item.bitmap = wx.NullBitmap - item.disabled_bitmap = wx.NullBitmap - item.active = True - item.dropdown = False - item.spacer_pixels = 0 - item.id = -1 - item.state = 0 - item.proportion = proportion - item.kind = ITEM_SPACER - item.sizer_item = None - item.min_size = wx.Size(-1, -1) - item.user_data = 0 - item.sticky = False - item.orientation = self._tool_orientation - - self._items.append(item) - return self._items[-1] - - - def Clear(self): - """ Deletes all the tools in the L{AuiToolBar}. """ - - self._items = [] - self._sizer_element_count = 0 - - - def ClearTools(self): - """ Deletes all the tools in the L{AuiToolBar}. """ - - self.Clear() - - - def DeleteTool(self, tool_id): - """ - Removes the specified tool from the toolbar and deletes it. - - :param `tool_id`: the L{AuiToolBarItem} identifier. - - :returns: ``True`` if the tool was deleted, ``False`` otherwise. - - :note: Note that it is unnecessary to call L{Realize} for the change to - take place, it will happen immediately. - """ - - idx = self.GetToolIndex(tool_id) - - if idx >= 0 and idx < len(self._items): - self._items.pop(idx) - self.Realize() - return True - - return False - - - def DeleteToolByPos(self, pos): - """ - This function behaves like L{DeleteTool} but it deletes the tool at the - specified position and not the one with the given id. - - :param `pos`: the tool position. - - :see: L{DeleteTool} - """ - - if pos >= 0 and pos < len(self._items): - - self._items.pop(pos) - self.Realize() - return True - - return False - - - def FindControl(self, id): - """ - Returns a pointer to the control identified by `id` or ``None`` if no corresponding - control is found. - - :param `id`: the control identifier. - """ - - wnd = self.FindWindow(id) - return wnd - - - def FindTool(self, tool_id): - """ - Finds a tool for the given tool id. - - :param `tool_id`: the L{AuiToolBarItem} identifier. - """ - - for item in self._items: - if item.id == tool_id: - return item - - return None - - - def FindToolForPosition(self, x, y): - """ - Finds a tool for the given mouse position. - - :param `x`: mouse `x` position; - :param `y`: mouse `y` position. - - :returns: a pointer to a L{AuiToolBarItem} if a tool is found, or ``None`` otherwise. - """ - - for i, item in enumerate(self._items): - if not item.sizer_item: - continue - - rect = item.sizer_item.GetRect() - if rect.Contains((x,y)): - - # if the item doesn't fit on the toolbar, return None - if not self.GetToolFitsByIndex(i): - return None - - return item - - return None - - - def FindToolForPositionWithPacking(self, x, y): - """ - Finds a tool for the given mouse position, taking into account also the - tool packing. - - :param `x`: mouse `x` position; - :param `y`: mouse `y` position. - - :returns: a pointer to a L{AuiToolBarItem} if a tool is found, or ``None`` otherwise. - """ - - count = len(self._items) - - for i, item in enumerate(self._items): - if not item.sizer_item: - continue - - rect = item.sizer_item.GetRect() - - # apply tool packing - if i+1 < count: - rect.width += self._tool_packing - - if rect.Contains((x,y)): - - # if the item doesn't fit on the toolbar, return None - if not self.GetToolFitsByIndex(i): - return None - - return item - - return None - - - def FindToolByIndex(self, pos): - """ - Finds a tool for the given tool position in the L{AuiToolBar}. - - :param `pos`: the tool position in the toolbar. - - :returns: a pointer to a L{AuiToolBarItem} if a tool is found, or ``None`` otherwise. - """ - - if pos < 0 or pos >= len(self._items): - return None - - return self._items[pos] - - - def SetToolBitmapSize(self, size): - """ - Sets the default size of each tool bitmap. The default bitmap size is - 16 by 15 pixels. - - :param `size`: the size of the bitmaps in the toolbar. - - :note: This should be called to tell the toolbar what the tool bitmap - size is. Call it before you add tools. - - :note: Note that this is the size of the bitmap you pass to L{AddTool}, - and not the eventual size of the tool button. - - :todo: Add `wx.ToolBar` compatibility, actually implementing this method. - """ - - # TODO: wx.ToolBar compatibility - pass - - - def GetToolBitmapSize(self): - """ - Returns the size of bitmap that the toolbar expects to have. The default - bitmap size is 16 by 15 pixels. - - :note: Note that this is the size of the bitmap you pass to L{AddTool}, - and not the eventual size of the tool button. - - :todo: Add `wx.ToolBar` compatibility, actually implementing this method. - """ - - # TODO: wx.ToolBar compatibility - return wx.Size(16, 15) - - - def SetToolProportion(self, tool_id, proportion): - """ - Sets the tool proportion in the toolbar. - - :param `tool_id`: the L{AuiToolBarItem} identifier; - :param `proportion`: the tool proportion in the toolbar. - """ - - item = self.FindTool(tool_id) - if not item: - return - - item.proportion = proportion - - - def GetToolProportion(self, tool_id): - """ - Returns the tool proportion in the toolbar. - - :param `tool_id`: the L{AuiToolBarItem} identifier. - """ - - item = self.FindTool(tool_id) - if not item: - return - - return item.proportion - - - def SetToolSeparation(self, separation): - """ - Sets the separator size for the toolbar. - - :param `separation`: the separator size in pixels. - """ - - if self._art: - self._art.SetElementSize(AUI_TBART_SEPARATOR_SIZE, separation) - - - def GetToolSeparation(self): - """ Returns the separator size for the toolbar, in pixels. """ - - if self._art: - return self._art.GetElementSize(AUI_TBART_SEPARATOR_SIZE) - - return 5 - - - def SetToolDropDown(self, tool_id, dropdown): - """ - Assigns a drop down window menu to the toolbar item. - - :param `tool_id`: the L{AuiToolBarItem} identifier; - :param `dropdown`: whether to assign a drop down menu or not. - """ - - item = self.FindTool(tool_id) - if not item: - return - - item.dropdown = dropdown - - - def GetToolDropDown(self, tool_id): - """ - Returns whether the toolbar item identified by `tool_id` has an associated - drop down window menu or not. - - :param `tool_id`: the L{AuiToolBarItem} identifier. - """ - - item = self.FindTool(tool_id) - if not item: - return - - return item.dropdown - - - def SetToolSticky(self, tool_id, sticky): - """ - Sets the toolbar item as sticky or non-sticky. - - :param `tool_id`: the L{AuiToolBarItem} identifier; - :param `sticky`: whether the tool should be sticky or not. - """ - - # ignore separators - if tool_id == -1: - return - - item = self.FindTool(tool_id) - if not item: - return - - if item.sticky == sticky: - return - - item.sticky = sticky - - self.Refresh(False) - self.Update() - - - def GetToolSticky(self, tool_id): - """ - Returns whether the toolbar item identified by `tool_id` has a sticky - behaviour or not. - - :param `tool_id`: the L{AuiToolBarItem} identifier. - """ - - item = self.FindTool(tool_id) - if not item: - return - - return item.sticky - - - def SetToolBorderPadding(self, padding): - """ - Sets the padding between the tool border and the label. - - :param `padding`: the padding in pixels. - """ - - self._tool_border_padding = padding - - - def GetToolBorderPadding(self): - """ Returns the padding between the tool border and the label, in pixels. """ - - return self._tool_border_padding - - - def SetToolTextOrientation(self, orientation): - """ - Sets the label orientation for the toolbar items. - - :param `orientation`: the L{AuiToolBarItem} label orientation. - """ - - self._tool_text_orientation = orientation - - if self._art: - self._art.SetTextOrientation(orientation) - - - def GetToolTextOrientation(self): - """ Returns the label orientation for the toolbar items. """ - - return self._tool_text_orientation - - - def SetToolOrientation(self, orientation): - """ - Sets the tool orientation for the toolbar items. - - :param `orientation`: the L{AuiToolBarItem} orientation. - """ - - self._tool_orientation = orientation - if self._art: - self._art.SetOrientation(orientation) - - - def GetToolOrientation(self): - """ Returns the orientation for the toolbar items. """ - - return self._tool_orientation - - - def SetToolPacking(self, packing): - """ - Sets the value used for spacing tools. The default value is 1 pixel. - - :param `packing`: the value for packing. - """ - - self._tool_packing = packing - - - def GetToolPacking(self): - """ Returns the value used for spacing tools. The default value is 1 pixel. """ - - return self._tool_packing - - - def SetOrientation(self, orientation): - """ - Sets the toolbar orientation. - - :param `orientation`: either ``wx.VERTICAL`` or ``wx.HORIZONTAL``. - - :note: This can be temporarily overridden by L{AuiManager} when floating and - docking a L{AuiToolBar}. - """ - - pass - - - def SetMargins(self, left=-1, right=-1, top=-1, bottom=-1): - """ - Set the values to be used as margins for the toolbar. - - :param `left`: the left toolbar margin; - :param `right`: the right toolbar margin; - :param `top`: the top toolbar margin; - :param `bottom`: the bottom toolbar margin. - """ - - if left != -1: - self._left_padding = left - if right != -1: - self._right_padding = right - if top != -1: - self._top_padding = top - if bottom != -1: - self._bottom_padding = bottom - - - def SetMarginsSize(self, size): - """ - Set the values to be used as margins for the toolbar. - - :param `size`: the margin size (an instance of `wx.Size`). - """ - - self.SetMargins(size.x, size.x, size.y, size.y) - - - def SetMarginsXY(self, x, y): - """ - Set the values to be used as margins for the toolbar. - - :param `x`: left margin, right margin and inter-tool separation value; - :param `y`: top margin, bottom margin and inter-tool separation value. - """ - - self.SetMargins(x, x, y, y) - - - def GetGripperVisible(self): - """ Returns whether the toolbar gripper is visible or not. """ - - return self._gripper_visible - - - def SetGripperVisible(self, visible): - """ - Sets whether the toolbar gripper is visible or not. - - :param `visible`: ``True`` for a visible gripper, ``False`` otherwise. - """ - - self._gripper_visible = visible - if visible: - self._agwStyle |= AUI_TB_GRIPPER - else: - self._agwStyle &= ~AUI_TB_GRIPPER - - self.Realize() - self.Refresh(False) - - - def GetOverflowVisible(self): - """ Returns whether the overflow button is visible or not. """ - - return self._overflow_visible - - - def SetOverflowVisible(self, visible): - """ - Sets whether the overflow button is visible or not. - - :param `visible`: ``True`` for a visible overflow button, ``False`` otherwise. - """ - - self._overflow_visible = visible - if visible: - self._agwStyle |= AUI_TB_OVERFLOW - else: - self._agwStyle &= ~AUI_TB_OVERFLOW - - self.Refresh(False) - - - def SetFont(self, font): - """ - Sets the L{AuiToolBar} font. - - :param `font`: a `wx.Font` object. - - :note: Overridden from `wx.PyControl`. - """ - - res = wx.PyControl.SetFont(self, font) - - if self._art: - self._art.SetFont(font) - - return res - - - def SetHoverItem(self, pitem): - """ - Sets a toolbar item to be currently hovered by the mouse. - - :param `pitem`: an instance of L{AuiToolBarItem}. - """ - - former_hover = None - - for item in self._items: - - if item.state & AUI_BUTTON_STATE_HOVER: - former_hover = item - - item.state &= ~AUI_BUTTON_STATE_HOVER - - if pitem: - pitem.state |= AUI_BUTTON_STATE_HOVER - - if former_hover != pitem: - self.Refresh(False) - self.Update() - - - def SetPressedItem(self, pitem): - """ - Sets a toolbar item to be currently in a "pressed" state. - - :param `pitem`: an instance of L{AuiToolBarItem}. - """ - - former_item = None - - for item in self._items: - - if item.state & AUI_BUTTON_STATE_PRESSED: - former_item = item - - item.state &= ~AUI_BUTTON_STATE_PRESSED - - if pitem: - pitem.state &= ~AUI_BUTTON_STATE_HOVER - pitem.state |= AUI_BUTTON_STATE_PRESSED - - if former_item != pitem: - self.Refresh(False) - self.Update() - - - def RefreshOverflowState(self): - """ Refreshes the overflow button. """ - - if not self._overflow_sizer_item: - self._overflow_state = 0 - return - - overflow_state = 0 - overflow_rect = self.GetOverflowRect() - - # find out the mouse's current position - pt = wx.GetMousePosition() - pt = self.ScreenToClient(pt) - - # find out if the mouse cursor is inside the dropdown rectangle - if overflow_rect.Contains((pt.x, pt.y)): - - if _VERSION_STRING < "2.9": - leftDown = wx.GetMouseState().LeftDown() - else: - leftDown = wx.GetMouseState().LeftIsDown() - - if leftDown: - overflow_state = AUI_BUTTON_STATE_PRESSED - else: - overflow_state = AUI_BUTTON_STATE_HOVER - - if overflow_state != self._overflow_state: - self._overflow_state = overflow_state - self.Refresh(False) - self.Update() - - self._overflow_state = overflow_state - - - def ToggleTool(self, tool_id, state): - """ - Toggles a tool on or off. This does not cause any event to get emitted. - - :param `tool_id`: tool in question. - :param `state`: if ``True``, toggles the tool on, otherwise toggles it off. - - :note: This only applies to a tool that has been specified as a toggle tool. - """ - - tool = self.FindTool(tool_id) - - if tool: - if tool.kind not in [ITEM_CHECK, ITEM_RADIO]: - return - - if tool.kind == ITEM_RADIO: - idx = self.GetToolIndex(tool_id) - if idx >= 0 and idx < len(self._items): - for i in xrange(idx, len(self._items)): - tool = self.FindToolByIndex(i) - if tool.kind != ITEM_RADIO: - break - tool.state &= ~AUI_BUTTON_STATE_CHECKED - - for i in xrange(idx, -1, -1): - tool = self.FindToolByIndex(i) - if tool.kind != ITEM_RADIO: - break - tool.state &= ~AUI_BUTTON_STATE_CHECKED - - tool = self.FindTool(tool_id) - tool.state |= AUI_BUTTON_STATE_CHECKED - else: - if state == True: - tool.state |= AUI_BUTTON_STATE_CHECKED - else: - tool.state &= ~AUI_BUTTON_STATE_CHECKED - - - def GetToolToggled(self, tool_id): - """ - Returns whether a tool is toggled or not. - - :param `tool_id`: the toolbar item identifier. - - :note: This only applies to a tool that has been specified as a toggle tool. - """ - - tool = self.FindTool(tool_id) - - if tool: - if tool.kind not in [ITEM_CHECK, ITEM_RADIO]: - return False - - return (tool.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] - - return False - - - def EnableTool(self, tool_id, state): - """ - Enables or disables the tool. - - :param `tool_id`: identifier for the tool to enable or disable. - :param `state`: if ``True``, enables the tool, otherwise disables it. - """ - - tool = self.FindTool(tool_id) - - if tool: - - if state == True: - tool.state &= ~AUI_BUTTON_STATE_DISABLED - else: - tool.state |= AUI_BUTTON_STATE_DISABLED - - - def GetToolEnabled(self, tool_id): - """ - Returns whether the tool identified by `tool_id` is enabled or not. - - :param `tool_id`: the tool identifier. - """ - - tool = self.FindTool(tool_id) - - if tool: - return (tool.state & AUI_BUTTON_STATE_DISABLED and [False] or [True])[0] - - return False - - - def GetToolLabel(self, tool_id): - """ - Returns the tool label for the tool identified by `tool_id`. - - :param `tool_id`: the tool identifier. - """ - - tool = self.FindTool(tool_id) - if not tool: - return "" - - return tool.label - - - def SetToolLabel(self, tool_id, label): - """ - Sets the tool label for the tool identified by `tool_id`. - - :param `tool_id`: the tool identifier; - :param `label`: the new toolbar item label. - """ - - tool = self.FindTool(tool_id) - if tool: - tool.label = label - - - def GetToolBitmap(self, tool_id): - """ - Returns the tool bitmap for the tool identified by `tool_id`. - - :param `tool_id`: the tool identifier. - """ - - tool = self.FindTool(tool_id) - if not tool: - return wx.NullBitmap - - return tool.bitmap - - - def SetToolBitmap(self, tool_id, bitmap): - """ - Sets the tool bitmap for the tool identified by `tool_id`. - - :param `tool_id`: the tool identifier; - :param `bitmap`: the new bitmap for the toolbar item (an instance of `wx.Bitmap`). - """ - - tool = self.FindTool(tool_id) - if tool: - tool.bitmap = bitmap - - - def SetToolNormalBitmap(self, tool_id, bitmap): - """ - Sets the tool bitmap for the tool identified by `tool_id`. - - :param `tool_id`: the tool identifier; - :param `bitmap`: the new bitmap for the toolbar item (an instance of `wx.Bitmap`). - """ - - self.SetToolBitmap(tool_id, bitmap) - - - def SetToolDisabledBitmap(self, tool_id, bitmap): - """ - Sets the tool disabled bitmap for the tool identified by `tool_id`. - - :param `tool_id`: the tool identifier; - :param `bitmap`: the new disabled bitmap for the toolbar item (an instance of `wx.Bitmap`). - """ - - tool = self.FindTool(tool_id) - if tool: - tool.disabled_bitmap = bitmap - - - def GetToolShortHelp(self, tool_id): - """ - Returns the short help for the given tool. - - :param `tool_id`: the tool identifier. - """ - - tool = self.FindTool(tool_id) - if not tool: - return "" - - return tool.short_help - - - def SetToolShortHelp(self, tool_id, help_string): - """ - Sets the short help for the given tool. - - :param `tool_id`: the tool identifier; - :param `help_string`: the string for the short help. - """ - - tool = self.FindTool(tool_id) - if tool: - tool.short_help = help_string - - - def GetToolLongHelp(self, tool_id): - """ - Returns the long help for the given tool. - - :param `tool_id`: the tool identifier. - """ - - tool = self.FindTool(tool_id) - if not tool: - return "" - - return tool.long_help - - - def SetToolAlignment(self, alignment=wx.EXPAND): - """ - This sets the alignment for all of the tools within the - toolbar (only has an effect when the toolbar is expanded). - - :param `alignment`: `wx.Sizer` alignment value - (``wx.ALIGN_CENTER_HORIZONTAL`` or ``wx.ALIGN_CENTER_VERTICAL``). - """ - - self._tool_alignment = alignment - - - - def SetToolLongHelp(self, tool_id, help_string): - """ - Sets the long help for the given tool. - - :param `tool_id`: the tool identifier; - :param `help_string`: the string for the long help. - """ - - tool = self.FindTool(tool_id) - if tool: - tool.long_help = help_string - - - def SetCustomOverflowItems(self, prepend, append): - """ - Sets the two lists `prepend` and `append` as custom overflow items. - - :param `prepend`: a list of L{AuiToolBarItem} to be prepended; - :param `append`: a list of L{AuiToolBarItem} to be appended. - """ - - self._custom_overflow_prepend = prepend - self._custom_overflow_append = append - - - def GetToolCount(self): - """ Returns the number of tools in the L{AuiToolBar}. """ - - return len(self._items) - - - def GetToolIndex(self, tool_id): - """ - Returns the position of the tool in the toolbar given its identifier. - - :param `tool_id`: the toolbar item identifier. - """ - - # this will prevent us from returning the index of the - # first separator in the toolbar since its id is equal to -1 - if tool_id == -1: - return wx.NOT_FOUND - - for i, item in enumerate(self._items): - if item.id == tool_id: - return i - - return wx.NOT_FOUND - - - def GetToolPos(self, tool_id): - """ - Returns the position of the tool in the toolbar given its identifier. - - :param `tool_id`: the toolbar item identifier. - """ - - return self.GetToolIndex(tool_id) - - - def GetToolFitsByIndex(self, tool_id): - """ - Returns whether the tool identified by `tool_id` fits into the toolbar or not. - - :param `tool_id`: the toolbar item identifier. - """ - - if tool_id < 0 or tool_id >= len(self._items): - return False - - if not self._items[tool_id].sizer_item: - return False - - cli_w, cli_h = self.GetClientSize() - rect = self._items[tool_id].sizer_item.GetRect() - - if self._agwStyle & AUI_TB_VERTICAL: - # take the dropdown size into account - if self._overflow_visible: - cli_h -= self._overflow_sizer_item.GetSize().y - - if rect.y+rect.height < cli_h: - return True - - else: - - # take the dropdown size into account - if self._overflow_visible: - cli_w -= self._overflow_sizer_item.GetSize().x - - if rect.x+rect.width < cli_w: - return True - - return False - - - def GetToolFits(self, tool_id): - """ - Returns whether the tool identified by `tool_id` fits into the toolbar or not. - - :param `tool_id`: the toolbar item identifier. - """ - - return self.GetToolFitsByIndex(self.GetToolIndex(tool_id)) - - - def GetToolRect(self, tool_id): - """ - Returns the toolbar item rectangle - - :param `tool_id`: the toolbar item identifier. - """ - - tool = self.FindTool(tool_id) - if tool and tool.sizer_item: - return tool.sizer_item.GetRect() - - return wx.Rect() - - - def GetToolBarFits(self): - """ Returns whether the L{AuiToolBar} size fits in a specified size. """ - - if len(self._items) == 0: - # empty toolbar always 'fits' - return True - - # entire toolbar content fits if the last tool fits - return self.GetToolFitsByIndex(len(self._items) - 1) - - - def Realize(self): - """ Realizes the toolbar. This function should be called after you have added tools. """ - - dc = wx.ClientDC(self) - - if not dc.IsOk(): - return False - - horizontal = True - if self._agwStyle & AUI_TB_VERTICAL: - horizontal = False - - # create the new sizer to add toolbar elements to - sizer = wx.BoxSizer((horizontal and [wx.HORIZONTAL] or [wx.VERTICAL])[0]) - - # add gripper area - separator_size = self._art.GetElementSize(AUI_TBART_SEPARATOR_SIZE) - gripper_size = self._art.GetElementSize(AUI_TBART_GRIPPER_SIZE) - - if gripper_size > 0 and self._gripper_visible: - if horizontal: - self._gripper_sizer_item = sizer.Add((gripper_size, 1), 0, wx.EXPAND) - else: - self._gripper_sizer_item = sizer.Add((1, gripper_size), 0, wx.EXPAND) - else: - self._gripper_sizer_item = None - - # add "left" padding - if self._left_padding > 0: - if horizontal: - sizer.Add((self._left_padding, 1)) - else: - sizer.Add((1, self._left_padding)) - - count = len(self._items) - for i, item in enumerate(self._items): - - sizer_item = None - kind = item.kind - - if kind == ITEM_LABEL: - - size = self._art.GetLabelSize(dc, self, item) - sizer_item = sizer.Add((size.x + (self._tool_border_padding*2), - size.y + (self._tool_border_padding*2)), - item.proportion, - item.alignment) - if i+1 < count: - sizer.AddSpacer(self._tool_packing) - - - elif kind in [ITEM_CHECK, ITEM_NORMAL, ITEM_RADIO]: - - size = self._art.GetToolSize(dc, self, item) - sizer_item = sizer.Add((size.x + (self._tool_border_padding*2), - size.y + (self._tool_border_padding*2)), - 0, - item.alignment) - # add tool packing - if i+1 < count: - sizer.AddSpacer(self._tool_packing) - - elif kind == ITEM_SEPARATOR: - - if horizontal: - sizer_item = sizer.Add((separator_size, 1), 0, wx.EXPAND) - else: - sizer_item = sizer.Add((1, separator_size), 0, wx.EXPAND) - - # add tool packing - if i+1 < count: - sizer.AddSpacer(self._tool_packing) - - elif kind == ITEM_SPACER: - - if item.proportion > 0: - sizer_item = sizer.AddStretchSpacer(item.proportion) - else: - sizer_item = sizer.Add((item.spacer_pixels, 1)) - - elif kind == ITEM_CONTROL: - - vert_sizer = wx.BoxSizer(wx.VERTICAL) - vert_sizer.AddStretchSpacer(1) - ctrl_sizer_item = vert_sizer.Add(item.window, 0, wx.EXPAND) - vert_sizer.AddStretchSpacer(1) - - if self._agwStyle & AUI_TB_TEXT and \ - self._tool_text_orientation == AUI_TBTOOL_TEXT_BOTTOM and \ - item.GetLabel() != "": - - s = self.GetLabelSize(item.GetLabel()) - vert_sizer.Add((1, s.y)) - - sizer_item = sizer.Add(vert_sizer, item.proportion, wx.EXPAND) - min_size = item.min_size - - # proportional items will disappear from the toolbar if - # their min width is not set to something really small - if item.proportion != 0: - min_size.x = 1 - - if min_size.IsFullySpecified(): - sizer.SetItemMinSize(vert_sizer, min_size) - vert_sizer.SetItemMinSize(item.window, min_size) - - # add tool packing - if i+1 < count: - sizer.AddSpacer(self._tool_packing) - - item.sizer_item = sizer_item - - - # add "right" padding - if self._right_padding > 0: - if horizontal: - sizer.Add((self._right_padding, 1)) - else: - sizer.Add((1, self._right_padding)) - - # add drop down area - self._overflow_sizer_item = None - - if self._agwStyle & AUI_TB_OVERFLOW: - - overflow_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) - if overflow_size > 0 and self._overflow_visible: - - if horizontal: - self._overflow_sizer_item = sizer.Add((overflow_size, 1), 0, wx.EXPAND) - else: - self._overflow_sizer_item = sizer.Add((1, overflow_size), 0, wx.EXPAND) - - else: - - self._overflow_sizer_item = None - - # the outside sizer helps us apply the "top" and "bottom" padding - outside_sizer = wx.BoxSizer((horizontal and [wx.VERTICAL] or [wx.HORIZONTAL])[0]) - - # add "top" padding - if self._top_padding > 0: - - if horizontal: - outside_sizer.Add((1, self._top_padding)) - else: - outside_sizer.Add((self._top_padding, 1)) - - # add the sizer that contains all of the toolbar elements - outside_sizer.Add(sizer, 1, self._tool_alignment) - - # add "bottom" padding - if self._bottom_padding > 0: - - if horizontal: - outside_sizer.Add((1, self._bottom_padding)) - else: - outside_sizer.Add((self._bottom_padding, 1)) - - del self._sizer # remove old sizer - self._sizer = outside_sizer - self.SetSizer(outside_sizer) - - # calculate the rock-bottom minimum size - for item in self._items: - - if item.sizer_item and item.proportion > 0 and item.min_size.IsFullySpecified(): - item.sizer_item.SetMinSize((0, 0)) - - self._absolute_min_size = self._sizer.GetMinSize() - - # reset the min sizes to what they were - for item in self._items: - - if item.sizer_item and item.proportion > 0 and item.min_size.IsFullySpecified(): - item.sizer_item.SetMinSize(item.min_size) - - # set control size - size = self._sizer.GetMinSize() - self.SetMinSize(size) - self._minWidth = size.x - self._minHeight = size.y - - if self._agwStyle & AUI_TB_NO_AUTORESIZE == 0: - - cur_size = self.GetClientSize() - new_size = self.GetMinSize() - - if new_size != cur_size: - - self.SetClientSize(new_size) - - else: - - self._sizer.SetDimension(0, 0, cur_size.x, cur_size.y) - - else: - - cur_size = self.GetClientSize() - self._sizer.SetDimension(0, 0, cur_size.x, cur_size.y) - - self.Refresh(False) - return True - - - def GetOverflowState(self): - """ Returns the state of the overflow button. """ - - return self._overflow_state - - - def GetOverflowRect(self): - """ Returns the rectangle of the overflow button. """ - - cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) - overflow_rect = wx.Rect(*self._overflow_sizer_item.GetRect()) - overflow_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) - - if self._agwStyle & AUI_TB_VERTICAL: - - overflow_rect.y = cli_rect.height - overflow_size - overflow_rect.x = 0 - overflow_rect.width = cli_rect.width - overflow_rect.height = overflow_size - - else: - - overflow_rect.x = cli_rect.width - overflow_size - overflow_rect.y = 0 - overflow_rect.width = overflow_size - overflow_rect.height = cli_rect.height - - return overflow_rect - - - def GetLabelSize(self, label): - """ - Returns the standard size of a toolbar item. - - :param `label`: a test label. - """ - - dc = wx.ClientDC(self) - dc.SetFont(self._font) - - return GetLabelSize(dc, label, self._tool_orientation != AUI_TBTOOL_HORIZONTAL) - - - def GetAuiManager(self): - """ Returns the L{AuiManager} which manages the toolbar. """ - - try: - return self._auiManager - except AttributeError: - return False - - - def SetAuiManager(self, auiManager): - """ Sets the L{AuiManager} which manages the toolbar. """ - - self._auiManager = auiManager - - - def DoIdleUpdate(self): - """ Updates the toolbar during idle times. """ - - handler = self.GetEventHandler() - if not handler: - return - - need_refresh = False - - for item in self._items: - - if item.id == -1: - continue - - evt = wx.UpdateUIEvent(item.id) - evt.SetEventObject(self) - - if handler.ProcessEvent(evt): - - if evt.GetSetEnabled(): - - if item.window: - is_enabled = item.window.IsEnabled() - else: - is_enabled = (item.state & AUI_BUTTON_STATE_DISABLED and [False] or [True])[0] - - new_enabled = evt.GetEnabled() - if new_enabled != is_enabled: - - if item.window: - item.window.Enable(new_enabled) - else: - if new_enabled: - item.state &= ~AUI_BUTTON_STATE_DISABLED - else: - item.state |= AUI_BUTTON_STATE_DISABLED - - need_refresh = True - - if evt.GetSetChecked(): - - # make sure we aren't checking an item that can't be - if item.kind != ITEM_CHECK and item.kind != ITEM_RADIO: - continue - - is_checked = (item.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] - new_checked = evt.GetChecked() - - if new_checked != is_checked: - - if new_checked: - item.state |= AUI_BUTTON_STATE_CHECKED - else: - item.state &= ~AUI_BUTTON_STATE_CHECKED - - need_refresh = True - - if need_refresh: - self.Refresh(False) - - - def OnSize(self, event): - """ - Handles the ``wx.EVT_SIZE`` event for L{AuiToolBar}. - - :param `event`: a `wx.SizeEvent` event to be processed. - """ - - x, y = self.GetClientSize() - realize = False - - if x > y: - self.SetOrientation(wx.HORIZONTAL) - else: - self.SetOrientation(wx.VERTICAL) - - if (x >= y and self._absolute_min_size.x > x) or (y > x and self._absolute_min_size.y > y): - - # hide all flexible items - for item in self._items: - if item.sizer_item and item.proportion > 0 and item.sizer_item.IsShown(): - item.sizer_item.Show(False) - item.sizer_item.SetProportion(0) - - if self._originalStyle & AUI_TB_OVERFLOW: - if not self.GetOverflowVisible(): - self.SetOverflowVisible(True) - realize = True - - else: - - if self._originalStyle & AUI_TB_OVERFLOW and not self._custom_overflow_append and \ - not self._custom_overflow_prepend: - if self.GetOverflowVisible(): - self.SetOverflowVisible(False) - realize = True - - # show all flexible items - for item in self._items: - if item.sizer_item and item.proportion > 0 and not item.sizer_item.IsShown(): - item.sizer_item.Show(True) - item.sizer_item.SetProportion(item.proportion) - - self._sizer.SetDimension(0, 0, x, y) - - if realize: - self.Realize() - else: - self.Refresh(False) - - self.Update() - - - def DoSetSize(self, x, y, width, height, sizeFlags=wx.SIZE_AUTO): - """ - Sets the position and size of the window in pixels. The `sizeFlags` - parameter indicates the interpretation of the other params if they are - equal to -1. - - :param `x`: the window `x` position; - :param `y`: the window `y` position; - :param `width`: the window width; - :param `height`: the window height; - :param `sizeFlags`: may have one of this bit set: - - =================================== ====================================== - Size Flags Description - =================================== ====================================== - ``wx.SIZE_AUTO`` A -1 indicates that a class-specific default should be used. - ``wx.SIZE_AUTO_WIDTH`` A -1 indicates that a class-specific default should be used for the width. - ``wx.SIZE_AUTO_HEIGHT`` A -1 indicates that a class-specific default should be used for the height. - ``wx.SIZE_USE_EXISTING`` Existing dimensions should be used if -1 values are supplied. - ``wx.SIZE_ALLOW_MINUS_ONE`` Allow dimensions of -1 and less to be interpreted as real dimensions, not default values. - ``wx.SIZE_FORCE`` Normally, if the position and the size of the window are already the same as the parameters of this function, nothing is done. but with this flag a window resize may be forced even in this case (supported in wx 2.6.2 and later and only implemented for MSW and ignored elsewhere currently) - =================================== ====================================== - - :note: Overridden from `wx.PyControl`. - """ - - parent_size = self.GetParent().GetClientSize() - if x + width > parent_size.x: - width = max(0, parent_size.x - x) - if y + height > parent_size.y: - height = max(0, parent_size.y - y) - - wx.PyControl.DoSetSize(self, x, y, width, height, sizeFlags) - - - def OnIdle(self, event): - """ - Handles the ``wx.EVT_IDLE`` event for L{AuiToolBar}. - - :param `event`: a `wx.IdleEvent` event to be processed. - """ - - self.DoIdleUpdate() - event.Skip() - - - def DoGetBestSize(self): - """ - Gets the size which best suits the window: for a control, it would be the - minimal size which doesn't truncate the control, for a panel - the same - size as it would have after a call to `Fit()`. - - :note: Overridden from `wx.PyControl`. - """ - - return self._absolute_min_size - - - def OnPaint(self, event): - """ - Handles the ``wx.EVT_PAINT`` event for L{AuiToolBar}. - - :param `event`: a `wx.PaintEvent` event to be processed. - """ - - dc = wx.AutoBufferedPaintDC(self) - cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) - - horizontal = True - if self._agwStyle & AUI_TB_VERTICAL: - horizontal = False - - if self._agwStyle & AUI_TB_PLAIN_BACKGROUND: - self._art.DrawPlainBackground(dc, self, cli_rect) - else: - self._art.DrawBackground(dc, self, cli_rect, horizontal) - - gripper_size = self._art.GetElementSize(AUI_TBART_GRIPPER_SIZE) - dropdown_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) - - # paint the gripper - if gripper_size > 0 and self._gripper_sizer_item: - gripper_rect = wx.Rect(*self._gripper_sizer_item.GetRect()) - if horizontal: - gripper_rect.width = gripper_size - else: - gripper_rect.height = gripper_size - - self._art.DrawGripper(dc, self, gripper_rect) - - # calculated how far we can draw items - if horizontal: - last_extent = cli_rect.width - else: - last_extent = cli_rect.height - - if self._overflow_visible: - last_extent -= dropdown_size - - # paint each individual tool - for item in self._items: - - if not item.sizer_item: - continue - - item_rect = wx.Rect(*item.sizer_item.GetRect()) - - if (horizontal and item_rect.x + item_rect.width >= last_extent) or \ - (not horizontal and item_rect.y + item_rect.height >= last_extent): - - break - - if item.kind == ITEM_SEPARATOR: - # draw a separator - self._art.DrawSeparator(dc, self, item_rect) - - elif item.kind == ITEM_LABEL: - # draw a text label only - self._art.DrawLabel(dc, self, item, item_rect) - - elif item.kind == ITEM_NORMAL: - # draw a regular button or dropdown button - if not item.dropdown: - self._art.DrawButton(dc, self, item, item_rect) - else: - self._art.DrawDropDownButton(dc, self, item, item_rect) - - elif item.kind == ITEM_CHECK: - # draw a regular toggle button or a dropdown one - if not item.dropdown: - self._art.DrawButton(dc, self, item, item_rect) - else: - self._art.DrawDropDownButton(dc, self, item, item_rect) - - elif item.kind == ITEM_RADIO: - # draw a toggle button - self._art.DrawButton(dc, self, item, item_rect) - - elif item.kind == ITEM_CONTROL: - # draw the control's label - self._art.DrawControlLabel(dc, self, item, item_rect) - - # fire a signal to see if the item wants to be custom-rendered - self.OnCustomRender(dc, item, item_rect) - - # paint the overflow button - if dropdown_size > 0 and self._overflow_sizer_item: - dropdown_rect = self.GetOverflowRect() - self._art.DrawOverflowButton(dc, self, dropdown_rect, self._overflow_state) - - - def OnEraseBackground(self, event): - """ - Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiToolBar}. - - :param `event`: a `wx.EraseEvent` event to be processed. - - :note: This is intentionally empty, to reduce flicker. - """ - - pass - - - def OnLeftDown(self, event): - """ - Handles the ``wx.EVT_LEFT_DOWN`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) - self.StopPreviewTimer() - - if self._gripper_sizer_item: - - gripper_rect = wx.Rect(*self._gripper_sizer_item.GetRect()) - if gripper_rect.Contains(event.GetPosition()): - - # find aui manager - manager = self.GetAuiManager() - if not manager: - return - - x_drag_offset = event.GetX() - gripper_rect.GetX() - y_drag_offset = event.GetY() - gripper_rect.GetY() - - clientPt = wx.Point(*event.GetPosition()) - screenPt = self.ClientToScreen(clientPt) - managedWindow = manager.GetManagedWindow() - managerClientPt = managedWindow.ScreenToClient(screenPt) - - # gripper was clicked - manager.OnGripperClicked(self, managerClientPt, wx.Point(x_drag_offset, y_drag_offset)) - return - - if self._overflow_sizer_item: - overflow_rect = self.GetOverflowRect() - - if self._art and self._overflow_visible and overflow_rect.Contains(event.GetPosition()): - - e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, -1) - e.SetEventObject(self) - e.SetToolId(-1) - e.SetClickPoint(event.GetPosition()) - processed = self.ProcessEvent(e) - - if processed: - self.DoIdleUpdate() - else: - overflow_items = [] - - # add custom overflow prepend items, if any - count = len(self._custom_overflow_prepend) - for i in xrange(count): - overflow_items.append(self._custom_overflow_prepend[i]) - - # only show items that don't fit in the dropdown - count = len(self._items) - for i in xrange(count): - - if not self.GetToolFitsByIndex(i): - overflow_items.append(self._items[i]) - - # add custom overflow append items, if any - count = len(self._custom_overflow_append) - for i in xrange(count): - overflow_items.append(self._custom_overflow_append[i]) - - res = self._art.ShowDropDown(self, overflow_items) - self._overflow_state = 0 - self.Refresh(False) - if res != -1: - e = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, res) - e.SetEventObject(self) - if not self.GetParent().ProcessEvent(e): - tool = self.FindTool(res) - if tool: - state = (tool.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] - self.ToggleTool(res, not state) - - return - - self._dragging = False - self._action_pos = wx.Point(*event.GetPosition()) - self._action_item = self.FindToolForPosition(*event.GetPosition()) - - if self._action_item: - - if self._action_item.state & AUI_BUTTON_STATE_DISABLED: - - self._action_pos = wx.Point(-1, -1) - self._action_item = None - return - - self.SetPressedItem(self._action_item) - - # fire the tool dropdown event - e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, self._action_item.id) - e.SetEventObject(self) - e.SetToolId(self._action_item.id) - e.SetDropDownClicked(False) - - mouse_x, mouse_y = event.GetX(), event.GetY() - rect = wx.Rect(*self._action_item.sizer_item.GetRect()) - - if self._action_item.dropdown: - if (self._action_item.orientation == AUI_TBTOOL_HORIZONTAL and \ - mouse_x >= (rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1) and \ - mouse_x < (rect.x+rect.width)) or \ - (self._action_item.orientation != AUI_TBTOOL_HORIZONTAL and \ - mouse_y >= (rect.y+rect.height-BUTTON_DROPDOWN_WIDTH-1) and \ - mouse_y < (rect.y+rect.height)): - - e.SetDropDownClicked(True) - - e.SetClickPoint(event.GetPosition()) - e.SetItemRect(rect) - self.ProcessEvent(e) - self.DoIdleUpdate() - - - def OnLeftUp(self, event): - """ - Handles the ``wx.EVT_LEFT_UP`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - self.SetPressedItem(None) - - hit_item = self.FindToolForPosition(*event.GetPosition()) - - if hit_item and not hit_item.state & AUI_BUTTON_STATE_DISABLED: - self.SetHoverItem(hit_item) - - if self._dragging: - # reset drag and drop member variables - self._dragging = False - self._action_pos = wx.Point(-1, -1) - self._action_item = None - - else: - - if self._action_item and hit_item == self._action_item: - self.SetToolTipString("") - - if hit_item.kind in [ITEM_CHECK, ITEM_RADIO]: - toggle = not (self._action_item.state & AUI_BUTTON_STATE_CHECKED) - self.ToggleTool(self._action_item.id, toggle) - - # repaint immediately - self.Refresh(False) - self.Update() - - e = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, self._action_item.id) - e.SetEventObject(self) - e.SetInt(toggle) - self._action_pos = wx.Point(-1, -1) - self._action_item = None - - self.ProcessEvent(e) - self.DoIdleUpdate() - - else: - - if self._action_item.id == ID_RESTORE_FRAME: - # find aui manager - manager = self.GetAuiManager() - - if not manager: - return - - pane = manager.GetPane(self) - e = framemanager.AuiManagerEvent(framemanager.wxEVT_AUI_PANE_MIN_RESTORE) - - e.SetManager(manager) - e.SetPane(pane) - - manager.ProcessEvent(e) - self.DoIdleUpdate() - - else: - - e = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, self._action_item.id) - e.SetEventObject(self) - self.ProcessEvent(e) - self.DoIdleUpdate() - - # reset drag and drop member variables - self._dragging = False - self._action_pos = wx.Point(-1, -1) - self._action_item = None - - - def OnRightDown(self, event): - """ - Handles the ``wx.EVT_RIGHT_DOWN`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) - - if self._gripper_sizer_item: - gripper_rect = self._gripper_sizer_item.GetRect() - if gripper_rect.Contains(event.GetPosition()): - return - - if self._overflow_sizer_item: - - dropdown_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) - if dropdown_size > 0 and event.GetX() > cli_rect.width - dropdown_size and \ - event.GetY() >= 0 and event.GetY() < cli_rect.height and self._art: - return - - self._action_pos = wx.Point(*event.GetPosition()) - self._action_item = self.FindToolForPosition(*event.GetPosition()) - - if self._action_item: - if self._action_item.state & AUI_BUTTON_STATE_DISABLED: - - self._action_pos = wx.Point(-1, -1) - self._action_item = None - return - - - def OnRightUp(self, event): - """ - Handles the ``wx.EVT_RIGHT_UP`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - hit_item = self.FindToolForPosition(*event.GetPosition()) - - if self._action_item and hit_item == self._action_item: - - e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, self._action_item.id) - e.SetEventObject(self) - e.SetToolId(self._action_item.id) - e.SetClickPoint(self._action_pos) - self.ProcessEvent(e) - self.DoIdleUpdate() - - else: - - # right-clicked on the invalid area of the toolbar - e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, -1) - e.SetEventObject(self) - e.SetToolId(-1) - e.SetClickPoint(self._action_pos) - self.ProcessEvent(e) - self.DoIdleUpdate() - - # reset member variables - self._action_pos = wx.Point(-1, -1) - self._action_item = None - - - def OnMiddleDown(self, event): - """ - Handles the ``wx.EVT_MIDDLE_DOWN`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) - - if self._gripper_sizer_item: - - gripper_rect = self._gripper_sizer_item.GetRect() - if gripper_rect.Contains(event.GetPosition()): - return - - if self._overflow_sizer_item: - - dropdown_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) - if dropdown_size > 0 and event.GetX() > cli_rect.width - dropdown_size and \ - event.GetY() >= 0 and event.GetY() < cli_rect.height and self._art: - return - - self._action_pos = wx.Point(*event.GetPosition()) - self._action_item = self.FindToolForPosition(*event.GetPosition()) - - if self._action_item: - if self._action_item.state & AUI_BUTTON_STATE_DISABLED: - - self._action_pos = wx.Point(-1, -1) - self._action_item = None - return - - - def OnMiddleUp(self, event): - """ - Handles the ``wx.EVT_MIDDLE_UP`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - hit_item = self.FindToolForPosition(*event.GetPosition()) - - if self._action_item and hit_item == self._action_item: - if hit_item.kind == ITEM_NORMAL: - - e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, self._action_item.id) - e.SetEventObject(self) - e.SetToolId(self._action_item.id) - e.SetClickPoint(self._action_pos) - self.ProcessEvent(e) - self.DoIdleUpdate() - - # reset member variables - self._action_pos = wx.Point(-1, -1) - self._action_item = None - - - def OnMotion(self, event): - """ - Handles the ``wx.EVT_MOTION`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - # start a drag event - if not self._dragging and self._action_item != None and self._action_pos != wx.Point(-1, -1) and \ - abs(event.GetX() - self._action_pos.x) + abs(event.GetY() - self._action_pos.y) > 5: - - self.SetToolTipString("") - self._dragging = True - - e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, self.GetId()) - e.SetEventObject(self) - e.SetToolId(self._action_item.id) - self.ProcessEvent(e) - self.DoIdleUpdate() - return - - hit_item = self.FindToolForPosition(*event.GetPosition()) - - if hit_item: - if not hit_item.state & AUI_BUTTON_STATE_DISABLED: - self.SetHoverItem(hit_item) - else: - self.SetHoverItem(None) - - else: - # no hit item, remove any hit item - self.SetHoverItem(hit_item) - - # figure out tooltips - packing_hit_item = self.FindToolForPositionWithPacking(*event.GetPosition()) - - if packing_hit_item: - - if packing_hit_item != self._tip_item: - self._tip_item = packing_hit_item - - if packing_hit_item.short_help != "": - self.StartPreviewTimer() - self.SetToolTipString(packing_hit_item.short_help) - else: - self.SetToolTipString("") - self.StopPreviewTimer() - - else: - - self.SetToolTipString("") - self._tip_item = None - self.StopPreviewTimer() - - # if we've pressed down an item and we're hovering - # over it, make sure it's state is set to pressed - if self._action_item: - - if self._action_item == hit_item: - self.SetPressedItem(self._action_item) - else: - self.SetPressedItem(None) - - # figure out the dropdown button state (are we hovering or pressing it?) - self.RefreshOverflowState() - - - def OnLeaveWindow(self, event): - """ - Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{AuiToolBar}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - self.RefreshOverflowState() - self.SetHoverItem(None) - self.SetPressedItem(None) - - self._tip_item = None - self.StopPreviewTimer() - - - def OnSetCursor(self, event): - """ - Handles the ``wx.EVT_SET_CURSOR`` event for L{AuiToolBar}. - - :param `event`: a `wx.SetCursorEvent` event to be processed. - """ - - cursor = wx.NullCursor - - if self._gripper_sizer_item: - - gripper_rect = self._gripper_sizer_item.GetRect() - if gripper_rect.Contains((event.GetX(), event.GetY())): - cursor = wx.StockCursor(wx.CURSOR_SIZING) - - event.SetCursor(cursor) - - - def OnCustomRender(self, dc, item, rect): - """ - Handles custom render for single L{AuiToolBar} items. - - :param `dc`: a `wx.DC` device context; - :param `item`: an instance of L{AuiToolBarItem}; - :param `rect`: the toolbar item rect. - - :note: This method must be overridden to provide custom rendering of items. - """ - - pass - - - def IsPaneMinimized(self): - """ Returns whether this L{AuiToolBar} contains a minimized pane tool. """ - - manager = self.GetAuiManager() - if not manager: - return False - - if manager.GetAGWFlags() & AUI_MGR_PREVIEW_MINIMIZED_PANES == 0: - # No previews here - return False - - self_name = manager.GetPane(self).name - - if not self_name.endswith("_min"): - # Wrong tool name - return False - - return self_name[0:-4] - - - def StartPreviewTimer(self): - """ Starts a timer in L{AuiManager} to slide-in/slide-out the minimized pane. """ - - self_name = self.IsPaneMinimized() - if not self_name: - return - - manager = self.GetAuiManager() - manager.StartPreviewTimer(self) - - - def StopPreviewTimer(self): - """ Stops a timer in L{AuiManager} to slide-in/slide-out the minimized pane. """ - - self_name = self.IsPaneMinimized() - if not self_name: - return - - manager = self.GetAuiManager() - manager.StopPreviewTimer() - diff --git a/aui/auibook.py b/aui/auibook.py deleted file mode 100644 index 62ae00c..0000000 --- a/aui/auibook.py +++ /dev/null @@ -1,5737 +0,0 @@ -""" -auibook contains a notebook control which implements many features common in -applications with dockable panes. Specifically, L{AuiNotebook} implements functionality -which allows the user to rearrange tab order via drag-and-drop, split the tab window -into many different splitter configurations, and toggle through different themes to -customize the control's look and feel. - -An effort has been made to try to maintain an API as similar to that of `wx.Notebook`. - -The default theme that is used is L{AuiDefaultTabArt}, which provides a modern, glossy -look and feel. The theme can be changed by calling L{AuiNotebook.SetArtProvider}. -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx -import types -import datetime - -from wx.lib.expando import ExpandoTextCtrl - -import framemanager -import tabart as TA - -from aui_utilities import LightColour, MakeDisabledBitmap, TabDragImage -from aui_utilities import TakeScreenShot, RescaleScreenShot - -from aui_constants import * - -# AuiNotebook events -wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_BUTTON = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_END_DRAG = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_DOWN = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_UP = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_DOWN = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_UP = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK = wx.NewEventType() - -# Define a new event for a drag cancelled -wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG = wx.NewEventType() - -# Define events for editing a tab label -wxEVT_COMMAND_AUINOTEBOOK_BEGIN_LABEL_EDIT = wx.NewEventType() -wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT = wx.NewEventType() - -# Create event binders -EVT_AUINOTEBOOK_PAGE_CLOSE = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, 1) -""" A tab in `AuiNotebook` is being closed. Can be vetoed by calling `Veto()`. """ -EVT_AUINOTEBOOK_PAGE_CLOSED = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, 1) -""" A tab in `AuiNotebook` has been closed. """ -EVT_AUINOTEBOOK_PAGE_CHANGED = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, 1) -""" The page selection was changed. """ -EVT_AUINOTEBOOK_PAGE_CHANGING = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, 1) -""" The page selection is being changed. """ -EVT_AUINOTEBOOK_BUTTON = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, 1) -""" The user clicked on a button in the `AuiNotebook` tab area. """ -EVT_AUINOTEBOOK_BEGIN_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, 1) -""" A drag-and-drop operation on a notebook tab has started. """ -EVT_AUINOTEBOOK_END_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, 1) -""" A drag-and-drop operation on a notebook tab has finished. """ -EVT_AUINOTEBOOK_DRAG_MOTION = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, 1) -""" A drag-and-drop operation on a notebook tab is ongoing. """ -EVT_AUINOTEBOOK_ALLOW_DND = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, 1) -""" Fires an event asking if it is OK to drag and drop a tab. """ -EVT_AUINOTEBOOK_DRAG_DONE = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, 1) -""" A drag-and-drop operation on a notebook tab has finished. """ -EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, 1) -""" The user clicked with the middle mouse button on a tab. """ -EVT_AUINOTEBOOK_TAB_MIDDLE_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, 1) -""" The user clicked with the middle mouse button on a tab. """ -EVT_AUINOTEBOOK_TAB_RIGHT_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, 1) -""" The user clicked with the right mouse button on a tab. """ -EVT_AUINOTEBOOK_TAB_RIGHT_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, 1) -""" The user clicked with the right mouse button on a tab. """ -EVT_AUINOTEBOOK_BG_MIDDLE_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_DOWN, 1) -""" The user middle-clicked in the tab area but not over a tab or a button. """ -EVT_AUINOTEBOOK_BG_MIDDLE_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_UP, 1) -""" The user middle-clicked in the tab area but not over a tab or a button. """ -EVT_AUINOTEBOOK_BG_RIGHT_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_DOWN, 1) -""" The user right-clicked in the tab area but not over a tab or a button. """ -EVT_AUINOTEBOOK_BG_RIGHT_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_UP, 1) -""" The user right-clicked in the tab area but not over a tab or a button. """ -EVT_AUINOTEBOOK_BG_DCLICK = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, 1) -""" The user left-clicked on the tab area not occupied by `AuiNotebook` tabs. """ -EVT_AUINOTEBOOK_CANCEL_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, 1) -""" A drag and drop operation has been cancelled. """ -EVT_AUINOTEBOOK_TAB_DCLICK = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK, 1) -""" The user double-clicked with the left mouse button on a tab. """ -EVT_AUINOTEBOOK_BEGIN_LABEL_EDIT = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_LABEL_EDIT, 1) -""" The user double-clicked with the left mouse button on a tab which text is editable. """ -EVT_AUINOTEBOOK_END_LABEL_EDIT = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT, 1) -""" The user finished editing a tab label. """ - - -# ----------------------------------------------------------------------------- -# Auxiliary class: TabTextCtrl -# This is the temporary ExpandoTextCtrl created when you edit the text of a tab -# ----------------------------------------------------------------------------- - -class TabTextCtrl(ExpandoTextCtrl): - """ Control used for in-place edit. """ - - def __init__(self, owner, tab, page_index): - """ - Default class constructor. - For internal use: do not call it in your code! - - :param `owner`: the L{AuiTabCtrl} owning the tab; - :param `tab`: the actual L{AuiNotebookPage} tab; - :param `page_index`: the L{AuiNotebook} page index for the tab. - """ - - self._owner = owner - self._tabEdited = tab - self._pageIndex = page_index - self._startValue = tab.caption - self._finished = False - self._aboutToFinish = False - self._currentValue = self._startValue - - x, y, w, h = self._tabEdited.rect - - wnd = self._tabEdited.control - if wnd: - x += wnd.GetSize()[0] + 2 - h = 0 - - image_h = 0 - image_w = 0 - - image = tab.bitmap - - if image.IsOk(): - image_w, image_h = image.GetWidth(), image.GetHeight() - image_w += 6 - - dc = wx.ClientDC(self._owner) - h = max(image_h, dc.GetMultiLineTextExtent(tab.caption)[1]) - h = h + 2 - - # FIXME: what are all these hardcoded 4, 8 and 11s really? - x += image_w - w -= image_w + 4 - - y = (self._tabEdited.rect.height - h)/2 + 1 - - expandoStyle = wx.WANTS_CHARS - if wx.Platform in ["__WXGTK__", "__WXMAC__"]: - expandoStyle |= wx.SIMPLE_BORDER - xSize, ySize = w + 2, h - else: - expandoStyle |= wx.SUNKEN_BORDER - xSize, ySize = w + 2, h+2 - - ExpandoTextCtrl.__init__(self, self._owner, wx.ID_ANY, self._startValue, - wx.Point(x, y), wx.Size(xSize, ySize), - expandoStyle) - - if wx.Platform == "__WXMAC__": - self.SetFont(owner.GetFont()) - bs = self.GetBestSize() - self.SetSize((-1, bs.height)) - - self.Bind(wx.EVT_CHAR, self.OnChar) - self.Bind(wx.EVT_KEY_UP, self.OnKeyUp) - self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) - - - def AcceptChanges(self): - """ Accepts/refuses the changes made by the user. """ - - value = self.GetValue() - notebook = self._owner.GetParent() - - if value == self._startValue: - # nothing changed, always accept - # when an item remains unchanged, the owner - # needs to be notified that the user decided - # not to change the tree item label, and that - # the edit has been cancelled - notebook.OnRenameCancelled(self._pageIndex) - return True - - if not notebook.OnRenameAccept(self._pageIndex, value): - # vetoed by the user - return False - - # accepted, do rename the item - notebook.SetPageText(self._pageIndex, value) - - return True - - - def Finish(self): - """ Finish editing. """ - - if not self._finished: - - notebook = self._owner.GetParent() - - self._finished = True - self._owner.SetFocus() - notebook.ResetTextControl() - - - def OnChar(self, event): - """ - Handles the ``wx.EVT_CHAR`` event for L{TabTextCtrl}. - - :param `event`: a `wx.KeyEvent` event to be processed. - """ - - keycode = event.GetKeyCode() - shiftDown = event.ShiftDown() - - if keycode == wx.WXK_RETURN: - if shiftDown and self._tabEdited.IsMultiline(): - event.Skip() - else: - self._aboutToFinish = True - self.SetValue(self._currentValue) - # Notify the owner about the changes - self.AcceptChanges() - # Even if vetoed, close the control (consistent with MSW) - wx.CallAfter(self.Finish) - - elif keycode == wx.WXK_ESCAPE: - self.StopEditing() - - else: - event.Skip() - - - def OnKeyUp(self, event): - """ - Handles the ``wx.EVT_KEY_UP`` event for L{TabTextCtrl}. - - :param `event`: a `wx.KeyEvent` event to be processed. - """ - - if not self._finished: - - # auto-grow the textctrl: - mySize = self.GetSize() - - dc = wx.ClientDC(self) - sx, sy, dummy = dc.GetMultiLineTextExtent(self.GetValue() + "M") - - self.SetSize((sx, -1)) - self._currentValue = self.GetValue() - - event.Skip() - - - def OnKillFocus(self, event): - """ - Handles the ``wx.EVT_KILL_FOCUS`` event for L{TabTextCtrl}. - - :param `event`: a `wx.FocusEvent` event to be processed. - """ - - if not self._finished and not self._aboutToFinish: - - # We must finish regardless of success, otherwise we'll get - # focus problems: - if not self.AcceptChanges(): - self._owner.GetParent().OnRenameCancelled(self._pageIndex) - - # We must let the native text control handle focus, too, otherwise - # it could have problems with the cursor (e.g., in wxGTK). - event.Skip() - wx.CallAfter(self._owner.GetParent().ResetTextControl) - - - def StopEditing(self): - """ Suddenly stops the editing. """ - - self._owner.GetParent().OnRenameCancelled(self._pageIndex) - self.Finish() - - - def item(self): - """ Returns the item currently edited. """ - - return self._tabEdited - - -# ---------------------------------------------------------------------- - -class AuiNotebookPage(object): - """ - A simple class which holds information about tab captions, bitmaps and - colours. - """ - - def __init__(self): - """ - Default class constructor. - Used internally, do not call it in your code! - """ - - self.window = None # page's associated window - self.caption = "" # caption displayed on the tab - self.bitmap = wx.NullBitmap # tab's bitmap - self.dis_bitmap = wx.NullBitmap # tab's disabled bitmap - self.rect = wx.Rect() # tab's hit rectangle - self.active = False # True if the page is currently active - self.enabled = True # True if the page is currently enabled - self.hasCloseButton = True # True if the page has a close button using the style - # AUI_NB_CLOSE_ON_ALL_TABS - self.control = None # A control can now be inside a tab - self.renamable = False # If True, a tab can be renamed by a left double-click - - self.text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT) - - self.access_time = datetime.datetime.now() # Last time this page was selected - - - def IsMultiline(self): - """ Returns whether the tab contains multiline text. """ - - return "\n" in self.caption - - -# ---------------------------------------------------------------------- - -class AuiTabContainerButton(object): - """ - A simple class which holds information about tab buttons and their state. - """ - - def __init__(self): - """ - Default class constructor. - Used internally, do not call it in your code! - """ - - self.id = -1 # button's id - self.cur_state = AUI_BUTTON_STATE_NORMAL # current state (normal, hover, pressed, etc.) - self.location = wx.LEFT # buttons location (wxLEFT, wxRIGHT, or wxCENTER) - self.bitmap = wx.NullBitmap # button's hover bitmap - self.dis_bitmap = wx.NullBitmap # button's disabled bitmap - self.rect = wx.Rect() # button's hit rectangle - - -# ---------------------------------------------------------------------- - -class CommandNotebookEvent(wx.PyCommandEvent): - """ A specialized command event class for events sent by L{AuiNotebook} . """ - - def __init__(self, command_type=None, win_id=0): - """ - Default class constructor. - - :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. - :param `win_id`: the window identification number. - """ - - if type(command_type) == types.IntType: - wx.PyCommandEvent.__init__(self, command_type, win_id) - else: - wx.PyCommandEvent.__init__(self, command_type.GetEventType(), command_type.GetId()) - - self.old_selection = -1 - self.selection = -1 - self.drag_source = None - self.dispatched = 0 - self.label = "" - self.editCancelled = False - - - def SetSelection(self, s): - """ - Sets the selection member variable. - - :param `s`: the new selection. - """ - - self.selection = s - self._commandInt = s - - - def GetSelection(self): - """ Returns the currently selected page, or -1 if none was selected. """ - - return self.selection - - - def SetOldSelection(self, s): - """ - Sets the id of the page selected before the change. - - :param `s`: the old selection. - """ - - self.old_selection = s - - - def GetOldSelection(self): - """ - Returns the page that was selected before the change, or -1 if none was - selected. - """ - - return self.old_selection - - - def SetDragSource(self, s): - """ - Sets the drag and drop source. - - :param `s`: the drag source. - """ - - self.drag_source = s - - - def GetDragSource(self): - """ Returns the drag and drop source. """ - - return self.drag_source - - - def SetDispatched(self, b): - """ - Sets the event as dispatched (used for automatic L{AuiNotebook} ). - - :param `b`: whether the event was dispatched or not. - """ - - self.dispatched = b - - - def GetDispatched(self): - """ Returns whether the event was dispatched (used for automatic L{AuiNotebook} ). """ - - return self.dispatched - - - def IsEditCancelled(self): - """ Returns the edit cancel flag (for ``EVT_AUINOTEBOOK_BEGIN`` | ``END_LABEL_EDIT`` only).""" - - return self.editCancelled - - - def SetEditCanceled(self, editCancelled): - """ - Sets the edit cancel flag (for ``EVT_AUINOTEBOOK_BEGIN`` | ``END_LABEL_EDIT`` only). - - :param `editCancelled`: whether the editing action has been cancelled or not. - """ - - self.editCancelled = editCancelled - - - def GetLabel(self): - """Returns the label-itemtext (for ``EVT_AUINOTEBOOK_BEGIN`` | ``END_LABEL_EDIT`` only).""" - - return self.label - - - def SetLabel(self, label): - """ - Sets the label. Useful only for ``EVT_AUINOTEBOOK_END_LABEL_EDIT``. - - :param `label`: the new label. - """ - - self.label = label - - -# ---------------------------------------------------------------------- - -class AuiNotebookEvent(CommandNotebookEvent): - """ A specialized command event class for events sent by L{AuiNotebook}. """ - - def __init__(self, command_type=None, win_id=0): - """ - Default class constructor. - - :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. - :param `win_id`: the window identification number. - """ - - CommandNotebookEvent.__init__(self, command_type, win_id) - - if type(command_type) == types.IntType: - self.notify = wx.NotifyEvent(command_type, win_id) - else: - self.notify = wx.NotifyEvent(command_type.GetEventType(), command_type.GetId()) - - - def GetNotifyEvent(self): - """ Returns the actual `wx.NotifyEvent`. """ - - return self.notify - - - def IsAllowed(self): - """ Returns whether the event is allowed or not. """ - - return self.notify.IsAllowed() - - - def Veto(self): - """ - Prevents the change announced by this event from happening. - - It is in general a good idea to notify the user about the reasons for - vetoing the change because otherwise the applications behaviour (which - just refuses to do what the user wants) might be quite surprising. - """ - - self.notify.Veto() - - - def Allow(self): - """ - This is the opposite of L{Veto}: it explicitly allows the event to be - processed. For most events it is not necessary to call this method as the - events are allowed anyhow but some are forbidden by default (this will - be mentioned in the corresponding event description). - """ - - self.notify.Allow() - - -# ---------------------------------------------------------------------------- # -# Class TabNavigatorWindow -# ---------------------------------------------------------------------------- # - -class TabNavigatorWindow(wx.Dialog): - """ - This class is used to create a modal dialog that enables "Smart Tabbing", - similar to what you would get by hitting ``Alt`` + ``Tab`` on Windows. - """ - - def __init__(self, parent=None, icon=None): - """ - Default class constructor. Used internally. - - :param `parent`: the L{TabNavigatorWindow} parent; - :param `icon`: the L{TabNavigatorWindow} icon. - """ - - wx.Dialog.__init__(self, parent, wx.ID_ANY, "", style=0) - - self._selectedItem = -1 - self._indexMap = [] - - if icon is None: - self._bmp = Mondrian.GetBitmap() - else: - self._bmp = icon - - if self._bmp.GetSize() != (16, 16): - img = self._bmp.ConvertToImage() - img.Rescale(16, 16, wx.IMAGE_QUALITY_HIGH) - self._bmp = wx.BitmapFromImage(img) - - sz = wx.BoxSizer(wx.VERTICAL) - - self._listBox = wx.ListBox(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(200, 150), [], wx.LB_SINGLE | wx.NO_BORDER) - - mem_dc = wx.MemoryDC() - mem_dc.SelectObject(wx.EmptyBitmap(1,1)) - font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) - font.SetWeight(wx.BOLD) - mem_dc.SetFont(font) - - panelHeight = mem_dc.GetCharHeight() - panelHeight += 4 # Place a spacer of 2 pixels - - # Out signpost bitmap is 24 pixels - if panelHeight < 24: - panelHeight = 24 - - self._panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(200, panelHeight)) - - sz.Add(self._panel) - sz.Add(self._listBox, 1, wx.EXPAND) - - self.SetSizer(sz) - - # Connect events to the list box - self._listBox.Bind(wx.EVT_KEY_UP, self.OnKeyUp) - self._listBox.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigationKey) - self._listBox.Bind(wx.EVT_LISTBOX_DCLICK, self.OnItemSelected) - - # Connect paint event to the panel - self._panel.Bind(wx.EVT_PAINT, self.OnPanelPaint) - self._panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnPanelEraseBg) - - self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) - self._listBox.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) - self.PopulateListControl(parent) - - self.GetSizer().Fit(self) - self.GetSizer().SetSizeHints(self) - self.GetSizer().Layout() - self.Centre() - - # Set focus on the list box to avoid having to click on it to change - # the tab selection under GTK. - self._listBox.SetFocus() - - - def OnKeyUp(self, event): - """ - Handles the ``wx.EVT_KEY_UP`` for the L{TabNavigatorWindow}. - - :param `event`: a `wx.KeyEvent` event to be processed. - """ - - if event.GetKeyCode() == wx.WXK_CONTROL: - self.CloseDialog() - - - def OnNavigationKey(self, event): - """ - Handles the ``wx.EVT_NAVIGATION_KEY`` for the L{TabNavigatorWindow}. - - :param `event`: a `wx.NavigationKeyEvent` event to be processed. - """ - - selected = self._listBox.GetSelection() - bk = self.GetParent() - maxItems = bk.GetPageCount() - - if event.GetDirection(): - - # Select next page - if selected == maxItems - 1: - itemToSelect = 0 - else: - itemToSelect = selected + 1 - - else: - - # Previous page - if selected == 0: - itemToSelect = maxItems - 1 - else: - itemToSelect = selected - 1 - - self._listBox.SetSelection(itemToSelect) - - - def PopulateListControl(self, book): - """ - Populates the L{TabNavigatorWindow} listbox with a list of tabs. - - :param `book`: the actual L{AuiNotebook}. - """ - # Index of currently selected page - selection = book.GetSelection() - # Total number of pages - count = book.GetPageCount() - # List of (index, AuiNotebookPage) - pages = list(enumerate(book.GetTabContainer().GetPages())) - if book.GetAGWWindowStyleFlag() & AUI_NB_ORDER_BY_ACCESS: - # Sort pages using last access time. Most recently used is the - # first in line - pages.sort( - key = lambda element: element[1].access_time, - reverse = True - ) - else: - # Manually add the current selection as first item - # Remaining ones are added in the next loop - del pages[selection] - self._listBox.Append(book.GetPageText(selection)) - self._indexMap.append(selection) - - for (index, page) in pages: - self._listBox.Append(book.GetPageText(index)) - self._indexMap.append(index) - - # Select the next entry after the current selection - self._listBox.SetSelection(0) - dummy = wx.NavigationKeyEvent() - dummy.SetDirection(True) - self.OnNavigationKey(dummy) - - - def OnItemSelected(self, event): - """ - Handles the ``wx.EVT_LISTBOX_DCLICK`` event for the wx.ListBox inside L{TabNavigatorWindow}. - - :param `event`: a `wx.ListEvent` event to be processed. - """ - - self.CloseDialog() - - - def CloseDialog(self): - """ Closes the L{TabNavigatorWindow} dialog, setting selection in L{AuiNotebook}. """ - - bk = self.GetParent() - self._selectedItem = self._listBox.GetSelection() - self.EndModal(wx.ID_OK) - - - def GetSelectedPage(self): - """ Gets the page index that was selected when the dialog was closed. """ - - return self._indexMap[self._selectedItem] - - - def OnPanelPaint(self, event): - """ - Handles the ``wx.EVT_PAINT`` event for L{TabNavigatorWindow} top panel. - - :param `event`: a `wx.PaintEvent` event to be processed. - """ - - dc = wx.PaintDC(self._panel) - rect = self._panel.GetClientRect() - - bmp = wx.EmptyBitmap(rect.width, rect.height) - - mem_dc = wx.MemoryDC() - mem_dc.SelectObject(bmp) - - endColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW) - startColour = LightColour(endColour, 50) - mem_dc.GradientFillLinear(rect, startColour, endColour, wx.SOUTH) - - # Draw the caption title and place the bitmap - # get the bitmap optimal position, and draw it - bmpPt, txtPt = wx.Point(), wx.Point() - bmpPt.y = (rect.height - self._bmp.GetHeight())/2 - bmpPt.x = 3 - mem_dc.DrawBitmap(self._bmp, bmpPt.x, bmpPt.y, True) - - # get the text position, and draw it - font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) - font.SetWeight(wx.BOLD) - mem_dc.SetFont(font) - fontHeight = mem_dc.GetCharHeight() - - txtPt.x = bmpPt.x + self._bmp.GetWidth() + 4 - txtPt.y = (rect.height - fontHeight)/2 - mem_dc.SetTextForeground(wx.WHITE) - mem_dc.DrawText("Opened tabs:", txtPt.x, txtPt.y) - mem_dc.SelectObject(wx.NullBitmap) - - dc.DrawBitmap(bmp, 0, 0) - - - def OnPanelEraseBg(self, event): - """ - Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{TabNavigatorWindow} top panel. - - :param `event`: a `wx.EraseEvent` event to be processed. - - :note: This is intentionally empty, to reduce flicker. - """ - - pass - - -# ---------------------------------------------------------------------- -# -- AuiTabContainer class implementation -- - -class AuiTabContainer(object): - """ - AuiTabContainer is a class which contains information about each - tab. It also can render an entire tab control to a specified DC. - It's not a window class itself, because this code will be used by - the L{AuiManager}, where it is disadvantageous to have separate - windows for each tab control in the case of "docked tabs". - - A derived class, L{AuiTabCtrl}, is an actual `wx.Window`-derived window - which can be used as a tab control in the normal sense. - """ - - def __init__(self, auiNotebook): - """ - Default class constructor. - Used internally, do not call it in your code! - - :param `auiNotebook`: the parent L{AuiNotebook} window. - """ - - self._tab_offset = 0 - self._agwFlags = 0 - self._art = TA.AuiDefaultTabArt() - - self._buttons = [] - self._pages = [] - self._tab_close_buttons = [] - - self._rect = wx.Rect() - self._auiNotebook = auiNotebook - - self.AddButton(AUI_BUTTON_LEFT, wx.LEFT) - self.AddButton(AUI_BUTTON_RIGHT, wx.RIGHT) - self.AddButton(AUI_BUTTON_WINDOWLIST, wx.RIGHT) - self.AddButton(AUI_BUTTON_CLOSE, wx.RIGHT) - - - def SetArtProvider(self, art): - """ - Instructs L{AuiTabContainer} to use art provider specified by parameter `art` - for all drawing calls. This allows plugable look-and-feel features. - - :param `art`: an art provider. - - :note: The previous art provider object, if any, will be deleted by L{AuiTabContainer}. - """ - - del self._art - self._art = art - - if self._art: - self._art.SetAGWFlags(self._agwFlags) - - - def GetArtProvider(self): - """ Returns the current art provider being used. """ - - return self._art - - - def SetAGWFlags(self, agwFlags): - """ - Sets the tab art flags. - - :param `agwFlags`: a combination of the following values: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook - ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet - ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet - ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook - ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab - ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging - ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control - ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width - ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed - ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available - ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar - ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab - ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs - ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click - ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks - ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present - ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows - ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items - ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) - ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages - ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) - ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs - ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle - ==================================== ================================== - - :todo: Implementation of flags ``AUI_NB_RIGHT`` and ``AUI_NB_LEFT``. - - """ - - self._agwFlags = agwFlags - - # check for new close button settings - self.RemoveButton(AUI_BUTTON_LEFT) - self.RemoveButton(AUI_BUTTON_RIGHT) - self.RemoveButton(AUI_BUTTON_WINDOWLIST) - self.RemoveButton(AUI_BUTTON_CLOSE) - - if agwFlags & AUI_NB_SCROLL_BUTTONS: - self.AddButton(AUI_BUTTON_LEFT, wx.LEFT) - self.AddButton(AUI_BUTTON_RIGHT, wx.RIGHT) - - if agwFlags & AUI_NB_WINDOWLIST_BUTTON: - self.AddButton(AUI_BUTTON_WINDOWLIST, wx.RIGHT) - - if agwFlags & AUI_NB_CLOSE_BUTTON: - self.AddButton(AUI_BUTTON_CLOSE, wx.RIGHT) - - if self._art: - self._art.SetAGWFlags(self._agwFlags) - - - def GetAGWFlags(self): - """ - Returns the tab art flags. - - See L{SetAGWFlags} for a list of possible return values. - - :see: L{SetAGWFlags} - """ - - return self._agwFlags - - - def SetNormalFont(self, font): - """ - Sets the normal font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._art.SetNormalFont(font) - - - def SetSelectedFont(self, font): - """ - Sets the selected tab font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._art.SetSelectedFont(font) - - - def SetMeasuringFont(self, font): - """ - Sets the font for calculating text measurements. - - :param `font`: a `wx.Font` object. - """ - - self._art.SetMeasuringFont(font) - - - def SetTabRect(self, rect): - """ - Sets the tab area rectangle. - - :param `rect`: an instance of `wx.Rect`, specifying the available area for L{AuiTabContainer}. - """ - - self._rect = rect - - if self._art: - minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() - self._art.SetSizingInfo(rect.GetSize(), len(self._pages), minMaxTabWidth) - - - def AddPage(self, page, info): - """ - Adds a page to the tab control. - - :param `page`: the window associated with this tab; - :param `info`: an instance of L{AuiNotebookPage}. - """ - - page_info = info - page_info.window = page - - self._pages.append(page_info) - - # let the art provider know how many pages we have - if self._art: - minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() - self._art.SetSizingInfo(self._rect.GetSize(), len(self._pages), minMaxTabWidth) - - return True - - - def InsertPage(self, page, info, idx): - """ - Inserts a page in the tab control in the position specified by `idx`. - - :param `page`: the window associated with this tab; - :param `info`: an instance of L{AuiNotebookPage}; - :param `idx`: the page insertion index. - """ - - page_info = info - page_info.window = page - - if idx >= len(self._pages): - self._pages.append(page_info) - else: - self._pages.insert(idx, page_info) - - # let the art provider know how many pages we have - if self._art: - minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() - self._art.SetSizingInfo(self._rect.GetSize(), len(self._pages), minMaxTabWidth) - - return True - - - def MovePage(self, page, new_idx): - """ - Moves a page in a new position specified by `new_idx`. - - :param `page`: the window associated with this tab; - :param `new_idx`: the new page position. - """ - - idx = self.GetIdxFromWindow(page) - if idx == -1: - return False - - # get page entry, make a copy of it - p = self.GetPage(idx) - - # remove old page entry - self.RemovePage(page) - - # insert page where it should be - self.InsertPage(page, p, new_idx) - - return True - - - def RemovePage(self, wnd): - """ - Removes a page from the tab control. - - :param `wnd`: an instance of `wx.Window`, a window associated with this tab. - """ - - minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() - - for page in self._pages: - if page.window == wnd: - self._pages.remove(page) - self._tab_offset = min(self._tab_offset, len(self._pages) - 1) - - # let the art provider know how many pages we have - if self._art: - self._art.SetSizingInfo(self._rect.GetSize(), len(self._pages), minMaxTabWidth) - - return True - - return False - - - def SetActivePage(self, wndOrInt): - """ - Sets the L{AuiTabContainer} active page. - - :param `wndOrInt`: an instance of `wx.Window` or an integer specifying a tab index. - """ - - if type(wndOrInt) == types.IntType: - - if wndOrInt >= len(self._pages): - return False - - wnd = self._pages[wndOrInt].window - - else: - wnd = wndOrInt - - found = False - - for indx, page in enumerate(self._pages): - if page.window == wnd: - page.active = True - found = True - else: - page.active = False - - return found - - - def SetNoneActive(self): - """ Sets all the tabs as inactive (non-selected). """ - - for page in self._pages: - page.active = False - - - def GetActivePage(self): - """ Returns the current selected tab or ``wx.NOT_FOUND`` if none is selected. """ - - for indx, page in enumerate(self._pages): - if page.active: - return indx - - return wx.NOT_FOUND - - - def GetWindowFromIdx(self, idx): - """ - Returns the window associated with the tab with index `idx`. - - :param `idx`: the tab index. - """ - - if idx >= len(self._pages): - return None - - return self._pages[idx].window - - - def GetIdxFromWindow(self, wnd): - """ - Returns the tab index based on the window `wnd` associated with it. - - :param `wnd`: an instance of `wx.Window`. - """ - - for indx, page in enumerate(self._pages): - if page.window == wnd: - return indx - - return wx.NOT_FOUND - - - def GetPage(self, idx): - """ - Returns the page specified by the given index. - - :param `idx`: the tab index. - """ - - if idx < 0 or idx >= len(self._pages): - raise Exception("Invalid Page index") - - return self._pages[idx] - - - def GetPages(self): - """ Returns a list of all the pages in this L{AuiTabContainer}. """ - - return self._pages - - - def GetPageCount(self): - """ Returns the number of pages in the L{AuiTabContainer}. """ - - return len(self._pages) - - - def GetEnabled(self, idx): - """ - Returns whether a tab is enabled or not. - - :param `idx`: the tab index. - """ - - if idx < 0 or idx >= len(self._pages): - return False - - return self._pages[idx].enabled - - - def EnableTab(self, idx, enable=True): - """ - Enables/disables a tab in the L{AuiTabContainer}. - - :param `idx`: the tab index; - :param `enable`: ``True`` to enable a tab, ``False`` to disable it. - """ - - if idx < 0 or idx >= len(self._pages): - raise Exception("Invalid Page index") - - self._pages[idx].enabled = enable - wnd = self.GetWindowFromIdx(idx) - wnd.Enable(enable) - - - def AddButton(self, id, location, normal_bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap): - """ - Adds a button in the tab area. - - :param `id`: the button identifier. This can be one of the following: - - ============================== ================================= - Button Identifier Description - ============================== ================================= - ``AUI_BUTTON_CLOSE`` Shows a close button on the tab area - ``AUI_BUTTON_WINDOWLIST`` Shows a window list button on the tab area - ``AUI_BUTTON_LEFT`` Shows a left button on the tab area - ``AUI_BUTTON_RIGHT`` Shows a right button on the tab area - ============================== ================================= - - :param `location`: the button location. Can be ``wx.LEFT`` or ``wx.RIGHT``; - :param `normal_bitmap`: the bitmap for an enabled tab; - :param `disabled_bitmap`: the bitmap for a disabled tab. - """ - - button = AuiTabContainerButton() - button.id = id - button.bitmap = normal_bitmap - button.dis_bitmap = disabled_bitmap - button.location = location - button.cur_state = AUI_BUTTON_STATE_NORMAL - - self._buttons.append(button) - - - def RemoveButton(self, id): - """ - Removes a button from the tab area. - - :param `id`: the button identifier. See L{AddButton} for a list of button identifiers. - - :see: L{AddButton} - """ - - for button in self._buttons: - if button.id == id: - self._buttons.remove(button) - return - - - def GetTabOffset(self): - """ Returns the tab offset. """ - - return self._tab_offset - - - def SetTabOffset(self, offset): - """ - Sets the tab offset. - - :param `offset`: the tab offset. - """ - - self._tab_offset = offset - - - def MinimizeTabOffset(self, dc, wnd, max_width): - """ - Minimize `self._tab_offset` to fit as many tabs as possible in the available space. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: an instance of `wx.Window`; - :param `max_width`: the maximum available width for the tabs. - """ - - total_width = 0 - - for i, page in reversed(list(enumerate(self._pages))): - - tab_button = self._tab_close_buttons[i] - (tab_width, tab_height), x_extent = self._art.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, tab_button.cur_state, page.control) - total_width += tab_width - - if total_width > max_width: - - tab_offset = i + 1 - - if tab_offset < self._tab_offset and tab_offset < len(self._pages): - self._tab_offset = tab_offset - - break - - if i == 0: - self._tab_offset = 0 - - - def Render(self, raw_dc, wnd): - """ - Renders the tab catalog to the specified `wx.DC`. - - It is a virtual function and can be overridden to provide custom drawing - capabilities. - - :param `raw_dc`: a `wx.DC` device context; - :param `wnd`: an instance of `wx.Window`. - """ - - if not raw_dc or not raw_dc.IsOk(): - return - - dc = wx.MemoryDC() - - # use the same layout direction as the window DC uses to ensure that the - # text is rendered correctly - dc.SetLayoutDirection(raw_dc.GetLayoutDirection()) - - page_count = len(self._pages) - button_count = len(self._buttons) - - # create off-screen bitmap - bmp = wx.EmptyBitmap(self._rect.GetWidth(), self._rect.GetHeight()) - dc.SelectObject(bmp) - - if not dc.IsOk(): - return - - # find out if size of tabs is larger than can be - # afforded on screen - total_width = visible_width = 0 - - for i in xrange(page_count): - page = self._pages[i] - - # determine if a close button is on this tab - close_button = False - if (self._agwFlags & AUI_NB_CLOSE_ON_ALL_TABS and page.hasCloseButton) or \ - (self._agwFlags & AUI_NB_CLOSE_ON_ACTIVE_TAB and page.active and page.hasCloseButton): - - close_button = True - - control = page.control - if control: - try: - control.GetSize() - except wx.PyDeadObjectError: - page.control = None - - size, x_extent = self._art.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, - (close_button and [AUI_BUTTON_STATE_NORMAL] or \ - [AUI_BUTTON_STATE_HIDDEN])[0], page.control) - - if i+1 < page_count: - total_width += x_extent - else: - total_width += size[0] - - if i >= self._tab_offset: - if i+1 < page_count: - visible_width += x_extent - else: - visible_width += size[0] - - if total_width > self._rect.GetWidth() or self._tab_offset != 0: - - # show left/right buttons - for button in self._buttons: - if button.id == AUI_BUTTON_LEFT or \ - button.id == AUI_BUTTON_RIGHT: - - button.cur_state &= ~AUI_BUTTON_STATE_HIDDEN - - else: - - # hide left/right buttons - for button in self._buttons: - if button.id == AUI_BUTTON_LEFT or \ - button.id == AUI_BUTTON_RIGHT: - - button.cur_state |= AUI_BUTTON_STATE_HIDDEN - - # determine whether left button should be enabled - for button in self._buttons: - if button.id == AUI_BUTTON_LEFT: - if self._tab_offset == 0: - button.cur_state |= AUI_BUTTON_STATE_DISABLED - else: - button.cur_state &= ~AUI_BUTTON_STATE_DISABLED - - if button.id == AUI_BUTTON_RIGHT: - if visible_width < self._rect.GetWidth() - 16*button_count: - button.cur_state |= AUI_BUTTON_STATE_DISABLED - else: - button.cur_state &= ~AUI_BUTTON_STATE_DISABLED - - # draw background - self._art.DrawBackground(dc, wnd, self._rect) - - # draw buttons - left_buttons_width = 0 - right_buttons_width = 0 - - # draw the buttons on the right side - offset = self._rect.x + self._rect.width - - for i in xrange(button_count): - button = self._buttons[button_count - i - 1] - - if button.location != wx.RIGHT: - continue - if button.cur_state & AUI_BUTTON_STATE_HIDDEN: - continue - - button_rect = wx.Rect(*self._rect) - button_rect.SetY(1) - button_rect.SetWidth(offset) - - button.rect = self._art.DrawButton(dc, wnd, button_rect, button, wx.RIGHT) - - offset -= button.rect.GetWidth() - right_buttons_width += button.rect.GetWidth() - - offset = 0 - - # draw the buttons on the left side - for i in xrange(button_count): - button = self._buttons[button_count - i - 1] - - if button.location != wx.LEFT: - continue - if button.cur_state & AUI_BUTTON_STATE_HIDDEN: - continue - - button_rect = wx.Rect(offset, 1, 1000, self._rect.height) - - button.rect = self._art.DrawButton(dc, wnd, button_rect, button, wx.LEFT) - - offset += button.rect.GetWidth() - left_buttons_width += button.rect.GetWidth() - - offset = left_buttons_width - - if offset == 0: - offset += self._art.GetIndentSize() - - # prepare the tab-close-button array - # make sure tab button entries which aren't used are marked as hidden - for i in xrange(page_count, len(self._tab_close_buttons)): - self._tab_close_buttons[i].cur_state = AUI_BUTTON_STATE_HIDDEN - - # make sure there are enough tab button entries to accommodate all tabs - while len(self._tab_close_buttons) < page_count: - tempbtn = AuiTabContainerButton() - tempbtn.id = AUI_BUTTON_CLOSE - tempbtn.location = wx.CENTER - tempbtn.cur_state = AUI_BUTTON_STATE_HIDDEN - self._tab_close_buttons.append(tempbtn) - - # buttons before the tab offset must be set to hidden - for i in xrange(self._tab_offset): - self._tab_close_buttons[i].cur_state = AUI_BUTTON_STATE_HIDDEN - if self._pages[i].control: - if self._pages[i].control.IsShown(): - self._pages[i].control.Hide() - - self.MinimizeTabOffset(dc, wnd, self._rect.GetWidth() - right_buttons_width - offset - 2) - - # draw the tabs - active = 999 - active_offset = 0 - - rect = wx.Rect(*self._rect) - rect.y = 0 - rect.height = self._rect.height - - for i in xrange(self._tab_offset, page_count): - - page = self._pages[i] - tab_button = self._tab_close_buttons[i] - - # determine if a close button is on this tab - if (self._agwFlags & AUI_NB_CLOSE_ON_ALL_TABS and page.hasCloseButton) or \ - (self._agwFlags & AUI_NB_CLOSE_ON_ACTIVE_TAB and page.active and page.hasCloseButton): - - if tab_button.cur_state == AUI_BUTTON_STATE_HIDDEN: - - tab_button.id = AUI_BUTTON_CLOSE - tab_button.cur_state = AUI_BUTTON_STATE_NORMAL - tab_button.location = wx.CENTER - - else: - - tab_button.cur_state = AUI_BUTTON_STATE_HIDDEN - - rect.x = offset - rect.width = self._rect.width - right_buttons_width - offset - 2 - - if rect.width <= 0: - break - - page.rect, tab_button.rect, x_extent = self._art.DrawTab(dc, wnd, page, rect, tab_button.cur_state) - - if page.active: - active = i - active_offset = offset - active_rect = wx.Rect(*rect) - - offset += x_extent - - lenPages = len(self._pages) - # make sure to deactivate buttons which are off the screen to the right - for j in xrange(i+1, len(self._tab_close_buttons)): - self._tab_close_buttons[j].cur_state = AUI_BUTTON_STATE_HIDDEN - if j > 0 and j <= lenPages: - if self._pages[j-1].control: - if self._pages[j-1].control.IsShown(): - self._pages[j-1].control.Hide() - - # draw the active tab again so it stands in the foreground - if active >= self._tab_offset and active < len(self._pages): - - page = self._pages[active] - tab_button = self._tab_close_buttons[active] - - rect.x = active_offset - dummy = self._art.DrawTab(dc, wnd, page, active_rect, tab_button.cur_state) - - raw_dc.Blit(self._rect.x, self._rect.y, self._rect.GetWidth(), self._rect.GetHeight(), dc, 0, 0) - - - def IsTabVisible(self, tabPage, tabOffset, dc, wnd): - """ - Returns whether a tab is visible or not. - - :param `tabPage`: the tab index; - :param `tabOffset`: the tab offset; - :param `dc`: a `wx.DC` device context; - :param `wnd`: an instance of `wx.Window` derived window. - """ - - if not dc or not dc.IsOk(): - return False - - page_count = len(self._pages) - button_count = len(self._buttons) - self.Render(dc, wnd) - - # Hasn't been rendered yet assume it's visible - if len(self._tab_close_buttons) < page_count: - return True - - if self._agwFlags & AUI_NB_SCROLL_BUTTONS: - # First check if both buttons are disabled - if so, there's no need to - # check further for visibility. - arrowButtonVisibleCount = 0 - for i in xrange(button_count): - - button = self._buttons[i] - if button.id == AUI_BUTTON_LEFT or \ - button.id == AUI_BUTTON_RIGHT: - - if button.cur_state & AUI_BUTTON_STATE_HIDDEN == 0: - arrowButtonVisibleCount += 1 - - # Tab must be visible - if arrowButtonVisibleCount == 0: - return True - - # If tab is less than the given offset, it must be invisible by definition - if tabPage < tabOffset: - return False - - # draw buttons - left_buttons_width = 0 - right_buttons_width = 0 - - offset = 0 - - # calculate size of the buttons on the right side - offset = self._rect.x + self._rect.width - - for i in xrange(button_count): - button = self._buttons[button_count - i - 1] - - if button.location != wx.RIGHT: - continue - if button.cur_state & AUI_BUTTON_STATE_HIDDEN: - continue - - offset -= button.rect.GetWidth() - right_buttons_width += button.rect.GetWidth() - - offset = 0 - - # calculate size of the buttons on the left side - for i in xrange(button_count): - button = self._buttons[button_count - i - 1] - - if button.location != wx.LEFT: - continue - if button.cur_state & AUI_BUTTON_STATE_HIDDEN: - continue - - offset += button.rect.GetWidth() - left_buttons_width += button.rect.GetWidth() - - offset = left_buttons_width - - if offset == 0: - offset += self._art.GetIndentSize() - - rect = wx.Rect(*self._rect) - rect.y = 0 - rect.height = self._rect.height - - # See if the given page is visible at the given tab offset (effectively scroll position) - for i in xrange(tabOffset, page_count): - - page = self._pages[i] - tab_button = self._tab_close_buttons[i] - - rect.x = offset - rect.width = self._rect.width - right_buttons_width - offset - 2 - - if rect.width <= 0: - return False # haven't found the tab, and we've run out of space, so return False - - size, x_extent = self._art.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, tab_button.cur_state, page.control) - offset += x_extent - - if i == tabPage: - - # If not all of the tab is visible, and supposing there's space to display it all, - # we could do better so we return False. - if (self._rect.width - right_buttons_width - offset - 2) <= 0 and (self._rect.width - right_buttons_width - left_buttons_width) > x_extent: - return False - else: - return True - - # Shouldn't really get here, but if it does, assume the tab is visible to prevent - # further looping in calling code. - return True - - - def MakeTabVisible(self, tabPage, win): - """ - Make the tab visible if it wasn't already. - - :param `tabPage`: the tab index; - :param `win`: an instance of `wx.Window` derived window. - """ - - dc = wx.ClientDC(win) - - if not self.IsTabVisible(tabPage, self.GetTabOffset(), dc, win): - for i in xrange(len(self._pages)): - if self.IsTabVisible(tabPage, i, dc, win): - self.SetTabOffset(i) - win.Refresh() - return - - - def TabHitTest(self, x, y): - """ - TabHitTest() tests if a tab was hit, passing the window pointer - back if that condition was fulfilled. - - :param `x`: the mouse `x` position; - :param `y`: the mouse `y` position. - """ - - if not self._rect.Contains((x,y)): - return None - - btn = self.ButtonHitTest(x, y) - if btn: - if btn in self._buttons: - return None - - for i in xrange(self._tab_offset, len(self._pages)): - page = self._pages[i] - if page.rect.Contains((x,y)): - return page.window - - return None - - - def ButtonHitTest(self, x, y): - """ - Tests if a button was hit. - - :param `x`: the mouse `x` position; - :param `y`: the mouse `y` position. - - :returns: and instance of L{AuiTabContainerButton} if a button was hit, ``None`` otherwise. - """ - - if not self._rect.Contains((x,y)): - return None - - for button in self._buttons: - if button.rect.Contains((x,y)) and \ - (button.cur_state & (AUI_BUTTON_STATE_HIDDEN|AUI_BUTTON_STATE_DISABLED)) == 0: - return button - - for button in self._tab_close_buttons: - if button.rect.Contains((x,y)) and \ - (button.cur_state & (AUI_BUTTON_STATE_HIDDEN|AUI_BUTTON_STATE_DISABLED)) == 0: - return button - - return None - - - def DoShowHide(self): - """ - This function shows the active window, then hides all of the other windows - (in that order). - """ - - pages = self.GetPages() - - # show new active page first - for page in pages: - if page.active: - page.window.Show(True) - break - - # hide all other pages - for page in pages: - if not page.active: - page.window.Show(False) - - -# ---------------------------------------------------------------------- -# -- AuiTabCtrl class implementation -- - -class AuiTabCtrl(wx.PyControl, AuiTabContainer): - """ - This is an actual `wx.Window`-derived window which can be used as a tab - control in the normal sense. - """ - - def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, - style=wx.NO_BORDER|wx.WANTS_CHARS|wx.TAB_TRAVERSAL): - """ - Default class constructor. - Used internally, do not call it in your code! - - :param `parent`: the L{AuiTabCtrl} parent; - :param `id`: an identifier for the control: a value of -1 is taken to mean a default; - :param `pos`: the control position. A value of (-1, -1) indicates a default position, - chosen by either the windowing system or wxPython, depending on platform; - :param `size`: the control size. A value of (-1, -1) indicates a default size, - chosen by either the windowing system or wxPython, depending on platform; - :param `style`: the window style. - """ - - wx.PyControl.__init__(self, parent, id, pos, size, style, name="AuiTabCtrl") - AuiTabContainer.__init__(self, parent) - - self._click_pt = wx.Point(-1, -1) - self._is_dragging = False - self._hover_button = None - self._pressed_button = None - self._drag_image = None - self._drag_img_offset = (0, 0) - self._on_button = False - - self.Bind(wx.EVT_PAINT, self.OnPaint) - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) - self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick) - self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) - self.Bind(wx.EVT_MIDDLE_DOWN, self.OnMiddleDown) - self.Bind(wx.EVT_MIDDLE_UP, self.OnMiddleUp) - self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) - self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) - self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus) - self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) - self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) - self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnCaptureLost) - self.Bind(wx.EVT_MOTION, self.OnMotion) - self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) - self.Bind(EVT_AUINOTEBOOK_BUTTON, self.OnButton) - - - def IsDragging(self): - """ Returns whether the user is dragging a tab with the mouse or not. """ - - return self._is_dragging - - - def GetDefaultBorder(self): - """ Returns the default border style for L{AuiTabCtrl}. """ - - return wx.BORDER_NONE - - - def OnPaint(self, event): - """ - Handles the ``wx.EVT_PAINT`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.PaintEvent` event to be processed. - """ - - dc = wx.PaintDC(self) - dc.SetFont(self.GetFont()) - - if self.GetPageCount() > 0: - self.Render(dc, self) - - - def OnEraseBackground(self, event): - """ - Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.EraseEvent` event to be processed. - - :note: This is intentionally empty, to reduce flicker. - """ - - pass - - - def DoGetBestSize(self): - """ - Gets the size which best suits the window: for a control, it would be the - minimal size which doesn't truncate the control, for a panel - the same - size as it would have after a call to `Fit()`. - - :note: Overridden from `wx.PyControl`. - """ - - return wx.Size(self._rect.width, self._rect.height) - - - def OnSize(self, event): - """ - Handles the ``wx.EVT_SIZE`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.SizeEvent` event to be processed. - """ - - s = event.GetSize() - self.SetTabRect(wx.Rect(0, 0, s.GetWidth(), s.GetHeight())) - - - def OnLeftDown(self, event): - """ - Handles the ``wx.EVT_LEFT_DOWN`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - self.CaptureMouse() - self._click_pt = wx.Point(-1, -1) - self._is_dragging = False - self._click_tab = None - self._pressed_button = None - - wnd = self.TabHitTest(event.GetX(), event.GetY()) - - if wnd is not None: - new_selection = self.GetIdxFromWindow(wnd) - - # AuiNotebooks always want to receive this event - # even if the tab is already active, because they may - # have multiple tab controls - if new_selection != self.GetActivePage() or isinstance(self.GetParent(), AuiNotebook): - - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) - e.SetSelection(new_selection) - e.SetOldSelection(self.GetActivePage()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - self._click_pt.x = event.GetX() - self._click_pt.y = event.GetY() - self._click_tab = wnd - else: - page_index = self.GetActivePage() - if page_index != wx.NOT_FOUND: - self.GetWindowFromIdx(page_index).SetFocus() - - if self._hover_button: - self._pressed_button = self._hover_button - self._pressed_button.cur_state = AUI_BUTTON_STATE_PRESSED - self._on_button = True - self.Refresh() - self.Update() - - - def OnCaptureLost(self, event): - """ - Handles the ``wx.EVT_MOUSE_CAPTURE_LOST`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseCaptureLostEvent` event to be processed. - """ - - if self._is_dragging: - self._is_dragging = False - self._on_button = False - - if self._drag_image: - self._drag_image.EndDrag() - del self._drag_image - self._drag_image = None - - event = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, self.GetId()) - event.SetSelection(self.GetIdxFromWindow(self._click_tab)) - event.SetOldSelection(event.GetSelection()) - event.SetEventObject(self) - self.GetEventHandler().ProcessEvent(event) - - - def OnLeftUp(self, event): - """ - Handles the ``wx.EVT_LEFT_UP`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - self._on_button = False - - if self._is_dragging: - - if self.HasCapture(): - self.ReleaseMouse() - - self._is_dragging = False - if self._drag_image: - self._drag_image.EndDrag() - del self._drag_image - self._drag_image = None - self.GetParent().Refresh() - - evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, self.GetId()) - evt.SetSelection(self.GetIdxFromWindow(self._click_tab)) - evt.SetOldSelection(evt.GetSelection()) - evt.SetEventObject(self) - self.GetEventHandler().ProcessEvent(evt) - - return - - self.GetParent()._mgr.HideHint() - - if self.HasCapture(): - self.ReleaseMouse() - - if self._hover_button: - self._pressed_button = self._hover_button - - if self._pressed_button: - - # make sure we're still clicking the button - button = self.ButtonHitTest(event.GetX(), event.GetY()) - - if button is None: - return - - if button != self._pressed_button: - self._pressed_button = None - return - - self.Refresh() - self.Update() - - if self._pressed_button.cur_state & AUI_BUTTON_STATE_DISABLED == 0: - - evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, self.GetId()) - evt.SetSelection(self.GetIdxFromWindow(self._click_tab)) - evt.SetInt(self._pressed_button.id) - evt.SetEventObject(self) - eventHandler = self.GetEventHandler() - - if eventHandler is not None: - eventHandler.ProcessEvent(evt) - - self._pressed_button = None - - self._click_pt = wx.Point(-1, -1) - self._is_dragging = False - self._click_tab = None - - - def OnMiddleUp(self, event): - """ - Handles the ``wx.EVT_MIDDLE_UP`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - eventHandler = self.GetEventHandler() - if not isinstance(eventHandler, AuiTabCtrl): - event.Skip() - return - - x, y = event.GetX(), event.GetY() - wnd = self.TabHitTest(x, y) - - if wnd: - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, self.GetId()) - e.SetEventObject(self) - e.SetSelection(self.GetIdxFromWindow(wnd)) - self.GetEventHandler().ProcessEvent(e) - elif not self.ButtonHitTest(x, y): - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_UP, self.GetId()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnMiddleDown(self, event): - """ - Handles the ``wx.EVT_MIDDLE_DOWN`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - eventHandler = self.GetEventHandler() - if not isinstance(eventHandler, AuiTabCtrl): - event.Skip() - return - - x, y = event.GetX(), event.GetY() - wnd = self.TabHitTest(x, y) - - if wnd: - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, self.GetId()) - e.SetEventObject(self) - e.SetSelection(self.GetIdxFromWindow(wnd)) - self.GetEventHandler().ProcessEvent(e) - elif not self.ButtonHitTest(x, y): - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_DOWN, self.GetId()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnRightUp(self, event): - """ - Handles the ``wx.EVT_RIGHT_UP`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - x, y = event.GetX(), event.GetY() - wnd = self.TabHitTest(x, y) - - if wnd: - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, self.GetId()) - e.SetEventObject(self) - e.SetSelection(self.GetIdxFromWindow(wnd)) - self.GetEventHandler().ProcessEvent(e) - elif not self.ButtonHitTest(x, y): - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_UP, self.GetId()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnRightDown(self, event): - """ - Handles the ``wx.EVT_RIGHT_DOWN`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - x, y = event.GetX(), event.GetY() - wnd = self.TabHitTest(x, y) - - if wnd: - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, self.GetId()) - e.SetEventObject(self) - e.SetSelection(self.GetIdxFromWindow(wnd)) - self.GetEventHandler().ProcessEvent(e) - elif not self.ButtonHitTest(x, y): - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_DOWN, self.GetId()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnLeftDClick(self, event): - """ - Handles the ``wx.EVT_LEFT_DCLICK`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - x, y = event.GetX(), event.GetY() - wnd = self.TabHitTest(x, y) - - if wnd: - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK, self.GetId()) - e.SetEventObject(self) - e.SetSelection(self.GetIdxFromWindow(wnd)) - self.GetEventHandler().ProcessEvent(e) - elif not self.ButtonHitTest(x, y): - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, self.GetId()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnMotion(self, event): - """ - Handles the ``wx.EVT_MOTION`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - pos = event.GetPosition() - - # check if the mouse is hovering above a button - - button = self.ButtonHitTest(pos.x, pos.y) - wnd = self.TabHitTest(pos.x, pos.y) - - if wnd is not None: - mouse_tab = self.GetIdxFromWindow(wnd) - if not self._pages[mouse_tab].enabled: - self._hover_button = None - return - - if self._on_button: - return - - if button: - - if self._hover_button and button != self._hover_button: - self._hover_button.cur_state = AUI_BUTTON_STATE_NORMAL - self._hover_button = None - self.Refresh() - self.Update() - - if button.cur_state != AUI_BUTTON_STATE_HOVER: - button.cur_state = AUI_BUTTON_STATE_HOVER - self.Refresh() - self.Update() - self._hover_button = button - return - - else: - - if self._hover_button: - self._hover_button.cur_state = AUI_BUTTON_STATE_NORMAL - self._hover_button = None - self.Refresh() - self.Update() - - if not event.LeftIsDown() or self._click_pt == wx.Point(-1, -1): - return - - if not self.HasCapture(): - return - - wnd = self.TabHitTest(pos.x, pos.y) - - if not self._is_dragging: - - drag_x_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_X) - drag_y_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_Y) - - if abs(pos.x - self._click_pt.x) > drag_x_threshold or \ - abs(pos.y - self._click_pt.y) > drag_y_threshold: - - self._is_dragging = True - - if self._drag_image: - self._drag_image.EndDrag() - del self._drag_image - self._drag_image = None - - if self._agwFlags & AUI_NB_DRAW_DND_TAB: - # Create the custom draw image from the icons and the text of the item - mouse_tab = self.GetIdxFromWindow(wnd) - page = self._pages[mouse_tab] - tab_button = self._tab_close_buttons[mouse_tab] - self._drag_image = TabDragImage(self, page, tab_button.cur_state, self._art) - - if self._agwFlags & AUI_NB_TAB_FLOAT: - self._drag_image.BeginDrag(wx.Point(0,0), self, fullScreen=True) - else: - self._drag_image.BeginDragBounded(wx.Point(0,0), self, self.GetParent()) - - # Capture the mouse cursor position offset relative to - # The tab image location - self._drag_img_offset = (pos[0] - page.rect.x, - pos[1] - page.rect.y) - - self._drag_image.Show() - - if not wnd: - evt2 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, self.GetId()) - evt2.SetSelection(self.GetIdxFromWindow(self._click_tab)) - evt2.SetOldSelection(evt2.GetSelection()) - evt2.SetEventObject(self) - self.GetEventHandler().ProcessEvent(evt2) - if evt2.GetDispatched(): - return - - evt3 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, self.GetId()) - evt3.SetSelection(self.GetIdxFromWindow(self._click_tab)) - evt3.SetOldSelection(evt3.GetSelection()) - evt3.SetEventObject(self) - self.GetEventHandler().ProcessEvent(evt3) - - if self._drag_image: - # Apply the drag images offset - pos -= self._drag_img_offset - self._drag_image.Move(pos) - - - def OnLeaveWindow(self, event): - """ - Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.MouseEvent` event to be processed. - """ - - if self._hover_button: - self._hover_button.cur_state = AUI_BUTTON_STATE_NORMAL - self._hover_button = None - self.Refresh() - self.Update() - - - def OnButton(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_BUTTON`` event for L{AuiTabCtrl}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - button = event.GetInt() - - if button == AUI_BUTTON_LEFT or button == AUI_BUTTON_RIGHT: - if button == AUI_BUTTON_LEFT: - if self.GetTabOffset() > 0: - - self.SetTabOffset(self.GetTabOffset()-1) - self.Refresh() - self.Update() - else: - self.SetTabOffset(self.GetTabOffset()+1) - self.Refresh() - self.Update() - - elif button == AUI_BUTTON_WINDOWLIST: - idx = self.GetArtProvider().ShowDropDown(self, self._pages, self.GetActivePage()) - - if idx != -1: - - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) - e.SetSelection(idx) - e.SetOldSelection(self.GetActivePage()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - else: - event.Skip() - - - def OnSetFocus(self, event): - """ - Handles the ``wx.EVT_SET_FOCUS`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.FocusEvent` event to be processed. - """ - - self.Refresh() - - - def OnKillFocus(self, event): - """ - Handles the ``wx.EVT_KILL_FOCUS`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.FocusEvent` event to be processed. - """ - - self.Refresh() - - - def OnKeyDown(self, event): - """ - Handles the ``wx.EVT_KEY_DOWN`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.KeyEvent` event to be processed. - """ - - key = event.GetKeyCode() - nb = self.GetParent() - - if key == wx.WXK_LEFT: - nb.AdvanceSelection(False) - self.SetFocus() - - elif key == wx.WXK_RIGHT: - nb.AdvanceSelection(True) - self.SetFocus() - - elif key == wx.WXK_HOME: - newPage = 0 - nb.SetSelection(newPage) - self.SetFocus() - - elif key == wx.WXK_END: - newPage = nb.GetPageCount() - 1 - nb.SetSelection(newPage) - self.SetFocus() - - elif key == wx.WXK_TAB: - if not event.ControlDown(): - flags = 0 - if not event.ShiftDown(): flags |= wx.NavigationKeyEvent.IsForward - if event.CmdDown(): flags |= wx.NavigationKeyEvent.WinChange - self.Navigate(flags) - else: - - if not nb or not isinstance(nb, AuiNotebook): - event.Skip() - return - - bForward = bWindowChange = 0 - if not event.ShiftDown(): bForward |= wx.NavigationKeyEvent.IsForward - if event.CmdDown(): bWindowChange |= wx.NavigationKeyEvent.WinChange - - keyEvent = wx.NavigationKeyEvent() - keyEvent.SetDirection(bForward) - keyEvent.SetWindowChange(bWindowChange) - keyEvent.SetFromTab(True) - keyEvent.SetEventObject(nb) - - if not nb.GetEventHandler().ProcessEvent(keyEvent): - - # Not processed? Do an explicit tab into the page. - win = self.GetWindowFromIdx(self.GetActivePage()) - if win: - win.SetFocus() - - self.SetFocus() - - return - - else: - event.Skip() - - - def OnKeyDown2(self, event): - """ - Deprecated. - - Handles the ``wx.EVT_KEY_DOWN`` event for L{AuiTabCtrl}. - - :param `event`: a `wx.KeyEvent` event to be processed. - - :warning: This method implementation is now deprecated. Refer to L{OnKeyDown} - for the correct one. - """ - - if self.GetActivePage() == -1: - event.Skip() - return - - # We can't leave tab processing to the system on Windows, tabs and keys - # get eaten by the system and not processed properly if we specify both - # wxTAB_TRAVERSAL and wxWANTS_CHARS. And if we specify just wxTAB_TRAVERSAL, - # we don't key arrow key events. - - key = event.GetKeyCode() - - if key == wx.WXK_NUMPAD_PAGEUP: - key = wx.WXK_PAGEUP - if key == wx.WXK_NUMPAD_PAGEDOWN: - key = wx.WXK_PAGEDOWN - if key == wx.WXK_NUMPAD_HOME: - key = wx.WXK_HOME - if key == wx.WXK_NUMPAD_END: - key = wx.WXK_END - if key == wx.WXK_NUMPAD_LEFT: - key = wx.WXK_LEFT - if key == wx.WXK_NUMPAD_RIGHT: - key = wx.WXK_RIGHT - - if key == wx.WXK_TAB or key == wx.WXK_PAGEUP or key == wx.WXK_PAGEDOWN: - - bCtrlDown = event.ControlDown() - bShiftDown = event.ShiftDown() - - bForward = (key == wx.WXK_TAB and not bShiftDown) or (key == wx.WXK_PAGEDOWN) - bWindowChange = (key == wx.WXK_PAGEUP) or (key == wx.WXK_PAGEDOWN) or bCtrlDown - bFromTab = (key == wx.WXK_TAB) - - nb = self.GetParent() - if not nb or not isinstance(nb, AuiNotebook): - event.Skip() - return - - keyEvent = wx.NavigationKeyEvent() - keyEvent.SetDirection(bForward) - keyEvent.SetWindowChange(bWindowChange) - keyEvent.SetFromTab(bFromTab) - keyEvent.SetEventObject(nb) - - if not nb.GetEventHandler().ProcessEvent(keyEvent): - - # Not processed? Do an explicit tab into the page. - win = self.GetWindowFromIdx(self.GetActivePage()) - if win: - win.SetFocus() - - return - - if len(self._pages) < 2: - event.Skip() - return - - newPage = -1 - - if self.GetLayoutDirection() == wx.Layout_RightToLeft: - forwardKey = wx.WXK_LEFT - backwardKey = wx.WXK_RIGHT - else: - forwardKey = wx.WXK_RIGHT - backwardKey = wx.WXK_LEFT - - if key == forwardKey: - if self.GetActivePage() == -1: - newPage = 0 - elif self.GetActivePage() < len(self._pages) - 1: - newPage = self.GetActivePage() + 1 - - elif key == backwardKey: - if self.GetActivePage() == -1: - newPage = len(self._pages) - 1 - elif self.GetActivePage() > 0: - newPage = self.GetActivePage() - 1 - - elif key == wx.WXK_HOME: - newPage = 0 - - elif key == wx.WXK_END: - newPage = len(self._pages) - 1 - - else: - event.Skip() - - if newPage != -1: - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) - e.SetSelection(newPage) - e.SetOldSelection(newPage) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - else: - event.Skip() - - -# ---------------------------------------------------------------------- - -class TabFrame(wx.PyWindow): - """ - TabFrame is an interesting case. It's important that all child pages - of the multi-notebook control are all actually children of that control - (and not grandchildren). TabFrame facilitates this. There is one - instance of TabFrame for each tab control inside the multi-notebook. - - It's important to know that TabFrame is not a real window, but it merely - used to capture the dimensions/positioning of the internal tab control and - it's managed page windows. - """ - - def __init__(self, parent): - """ - Default class constructor. - Used internally, do not call it in your code! - """ - - pre = wx.PrePyWindow() - - self._tabs = None - self._rect = wx.Rect(0, 0, 200, 200) - self._tab_ctrl_height = 20 - self._tab_rect = wx.Rect() - self._parent = parent - - self.PostCreate(pre) - - - def SetTabCtrlHeight(self, h): - """ - Sets the tab control height. - - :param `h`: the tab area height. - """ - - self._tab_ctrl_height = h - - - def DoSetSize(self, x, y, width, height, flags=wx.SIZE_AUTO): - """ - Sets the position and size of the window in pixels. The `flags` - parameter indicates the interpretation of the other params if they are - equal to -1. - - :param `x`: the window `x` position; - :param `y`: the window `y` position; - :param `width`: the window width; - :param `height`: the window height; - :param `flags`: may have one of this bit set: - - =================================== ====================================== - Size Flags Description - =================================== ====================================== - ``wx.SIZE_AUTO`` A -1 indicates that a class-specific default should be used. - ``wx.SIZE_AUTO_WIDTH`` A -1 indicates that a class-specific default should be used for the width. - ``wx.SIZE_AUTO_HEIGHT`` A -1 indicates that a class-specific default should be used for the height. - ``wx.SIZE_USE_EXISTING`` Existing dimensions should be used if -1 values are supplied. - ``wx.SIZE_ALLOW_MINUS_ONE`` Allow dimensions of -1 and less to be interpreted as real dimensions, not default values. - ``wx.SIZE_FORCE`` Normally, if the position and the size of the window are already the same as the parameters of this function, nothing is done. but with this flag a window resize may be forced even in this case (supported in wx 2.6.2 and later and only implemented for MSW and ignored elsewhere currently) - =================================== ====================================== - - :note: Overridden from `wx.PyControl`. - """ - - self._rect = wx.Rect(x, y, max(1, width), max(1, height)) - self.DoSizing() - - - def DoGetSize(self): - """ - Returns the window size. - - :note: Overridden from `wx.PyControl`. - """ - - return self._rect.width, self._rect.height - - - def DoGetClientSize(self): - """ - Returns the window client size. - - :note: Overridden from `wx.PyControl`. - """ - - return self._rect.width, self._rect.height - - - def Show(self, show=True): - """ - Shows/hides the window. - - :param `show`: ``True`` to show the window, ``False`` otherwise. - - :note: Overridden from `wx.PyControl`, this method always returns ``False`` as - L{TabFrame} should never be phisically shown on screen. - """ - - return False - - - def DoSizing(self): - """ Does the actual sizing of the tab control. """ - - if not self._tabs: - return - - hideOnSingle = ((self._tabs.GetAGWFlags() & AUI_NB_HIDE_ON_SINGLE_TAB) and \ - self._tabs.GetPageCount() <= 1) - - if not hideOnSingle and not self._parent._hide_tabs: - tab_height = self._tab_ctrl_height - - self._tab_rect = wx.Rect(self._rect.x, self._rect.y, self._rect.width, self._tab_ctrl_height) - - if self._tabs.GetAGWFlags() & AUI_NB_BOTTOM: - self._tab_rect = wx.Rect(self._rect.x, self._rect.y + self._rect.height - tab_height, - self._rect.width, tab_height) - self._tabs.SetDimensions(self._rect.x, self._rect.y + self._rect.height - tab_height, - self._rect.width, tab_height) - self._tabs.SetTabRect(wx.Rect(0, 0, self._rect.width, tab_height)) - - else: - - self._tab_rect = wx.Rect(self._rect.x, self._rect.y, self._rect.width, tab_height) - self._tabs.SetDimensions(self._rect.x, self._rect.y, self._rect.width, tab_height) - self._tabs.SetTabRect(wx.Rect(0, 0, self._rect.width, tab_height)) - - # TODO: elif (GetAGWFlags() & AUI_NB_LEFT) - # TODO: elif (GetAGWFlags() & AUI_NB_RIGHT) - - self._tabs.Refresh() - self._tabs.Update() - - else: - - tab_height = 0 - self._tabs.SetDimensions(self._rect.x, self._rect.y, self._rect.width, tab_height) - self._tabs.SetTabRect(wx.Rect(0, 0, self._rect.width, tab_height)) - - pages = self._tabs.GetPages() - - for page in pages: - - height = self._rect.height - tab_height - - if height < 0: - # avoid passing negative height to wx.Window.SetSize(), this - # results in assert failures/GTK+ warnings - height = 0 - - if self._tabs.GetAGWFlags() & AUI_NB_BOTTOM: - page.window.SetDimensions(self._rect.x, self._rect.y, self._rect.width, height) - - else: - page.window.SetDimensions(self._rect.x, self._rect.y + tab_height, - self._rect.width, height) - - # TODO: elif (GetAGWFlags() & AUI_NB_LEFT) - # TODO: elif (GetAGWFlags() & AUI_NB_RIGHT) - - if repr(page.window.__class__).find("AuiMDIChildFrame") >= 0: - page.window.ApplyMDIChildFrameRect() - - - def Update(self): - """ - Calling this method immediately repaints the invalidated area of the window - and all of its children recursively while this would usually only happen when - the flow of control returns to the event loop. - - :note: Notice that this function doesn't invalidate any area of the window so - nothing happens if nothing has been invalidated (i.e. marked as requiring a redraw). - Use `Refresh` first if you want to immediately redraw the window unconditionally. - - :note: Overridden from `wx.PyControl`. - """ - - # does nothing - pass - - -# ---------------------------------------------------------------------- -# -- AuiNotebook class implementation -- - -class AuiNotebook(wx.PyPanel): - """ - AuiNotebook is a notebook control which implements many features common in - applications with dockable panes. Specifically, AuiNotebook implements functionality - which allows the user to rearrange tab order via drag-and-drop, split the tab window - into many different splitter configurations, and toggle through different themes to - customize the control's look and feel. - - An effort has been made to try to maintain an API as similar to that of `wx.Notebook`. - - The default theme that is used is L{AuiDefaultTabArt}, which provides a modern, glossy - look and feel. The theme can be changed by calling L{AuiNotebook.SetArtProvider}. - """ - - def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, - style=0, agwStyle=AUI_NB_DEFAULT_STYLE): - """ - Default class constructor. - - :param `parent`: the L{AuiNotebook} parent; - :param `id`: an identifier for the control: a value of -1 is taken to mean a default; - :param `pos`: the control position. A value of (-1, -1) indicates a default position, - chosen by either the windowing system or wxPython, depending on platform; - :param `size`: the control size. A value of (-1, -1) indicates a default size, - chosen by either the windowing system or wxPython, depending on platform; - :param `style`: the underlying `wx.PyPanel` window style; - :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook - ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. - ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. - ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook - ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab - ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging - ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control - ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width - ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed - ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available - ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar - ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab - ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs - ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click - ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks - ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present - ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows - ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items - ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) - ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages - ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) - ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs - ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle - ==================================== ================================== - - Default value for `agwStyle` is: - ``AUI_NB_DEFAULT_STYLE`` = ``AUI_NB_TOP`` | ``AUI_NB_TAB_SPLIT`` | ``AUI_NB_TAB_MOVE`` | ``AUI_NB_SCROLL_BUTTONS`` | ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` | ``AUI_NB_MIDDLE_CLICK_CLOSE`` | ``AUI_NB_DRAW_DND_TAB`` - - """ - - self._curpage = -1 - self._tab_id_counter = AuiBaseTabCtrlId - self._dummy_wnd = None - self._hide_tabs = False - self._sash_dclick_unsplit = False - self._tab_ctrl_height = 20 - self._requested_bmp_size = wx.Size(-1, -1) - self._requested_tabctrl_height = -1 - self._textCtrl = None - self._tabBounds = (-1, -1) - self._click_tab = None - - wx.PyPanel.__init__(self, parent, id, pos, size, style|wx.BORDER_NONE|wx.TAB_TRAVERSAL) - self._mgr = framemanager.AuiManager() - self._tabs = AuiTabContainer(self) - - self.InitNotebook(agwStyle) - - - def GetTabContainer(self): - """ Returns the instance of L{AuiTabContainer}. """ - - return self._tabs - - - def InitNotebook(self, agwStyle): - """ - Contains common initialization code called by all constructors. - - :param `agwStyle`: the notebook style. - - :see: L{__init__} - """ - - self.SetName("AuiNotebook") - self._agwFlags = agwStyle - - self._popupWin = None - self._naviIcon = None - self._imageList = None - self._last_drag_x = 0 - - self._normal_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - self._selected_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - self._selected_font.SetWeight(wx.BOLD) - - self.SetArtProvider(TA.AuiDefaultTabArt()) - - self._dummy_wnd = wx.Window(self, wx.ID_ANY, wx.Point(0, 0), wx.Size(0, 0)) - self._dummy_wnd.SetSize((200, 200)) - self._dummy_wnd.Show(False) - - self._mgr.SetManagedWindow(self) - self._mgr.SetAGWFlags(AUI_MGR_DEFAULT) - self._mgr.SetDockSizeConstraint(1.0, 1.0) # no dock size constraint - - self._mgr.AddPane(self._dummy_wnd, framemanager.AuiPaneInfo().Name("dummy").Bottom().CaptionVisible(False).Show(False)) - self._mgr.Update() - - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocusNotebook) - self.Bind(EVT_AUINOTEBOOK_PAGE_CHANGING, self.OnTabClicked, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_BEGIN_DRAG, self.OnTabBeginDrag, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_END_DRAG, self.OnTabEndDrag, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_DRAG_MOTION, self.OnTabDragMotion, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_CANCEL_DRAG, self.OnTabCancelDrag, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_BUTTON, self.OnTabButton, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, self.OnTabMiddleDown, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_TAB_MIDDLE_UP, self.OnTabMiddleUp, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_TAB_RIGHT_DOWN, self.OnTabRightDown, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_TAB_RIGHT_UP, self.OnTabRightUp, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_BG_DCLICK, self.OnTabBgDClick, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - self.Bind(EVT_AUINOTEBOOK_TAB_DCLICK, self.OnTabDClick, - id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) - - self.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigationKeyNotebook) - - - def SetArtProvider(self, art): - """ - Sets the art provider to be used by the notebook. - - :param `art`: an art provider. - """ - - self._tabs.SetArtProvider(art) - self.UpdateTabCtrlHeight(force=True) - - - def SavePerspective(self): - """ - Saves the entire user interface layout into an encoded string, which can then - be stored by the application (probably using `wx.Config`). When a perspective - is restored using L{LoadPerspective}, the entire user interface will return - to the state it was when the perspective was saved. - """ - - # Build list of panes/tabs - tabs = "" - all_panes = self._mgr.GetAllPanes() - - for pane in all_panes: - - if pane.name == "dummy": - continue - - tabframe = pane.window - - if tabs: - tabs += "|" - - tabs += pane.name + "=" - - # add tab id's - page_count = tabframe._tabs.GetPageCount() - - for p in xrange(page_count): - - page = tabframe._tabs.GetPage(p) - page_idx = self._tabs.GetIdxFromWindow(page.window) - - if p: - tabs += "," - - if p == tabframe._tabs.GetActivePage(): - tabs += "+" - elif page_idx == self._curpage: - tabs += "*" - - tabs += "%u"%page_idx - - tabs += "@" - - # Add frame perspective - tabs += self._mgr.SavePerspective() - - return tabs - - - def LoadPerspective(self, layout): - """ - Loads a layout which was saved with L{SavePerspective}. - - :param `layout`: a string which contains a saved L{AuiNotebook} layout. - """ - - # Remove all tab ctrls (but still keep them in main index) - tab_count = self._tabs.GetPageCount() - for i in xrange(tab_count): - wnd = self._tabs.GetWindowFromIdx(i) - - # find out which onscreen tab ctrl owns this tab - ctrl, ctrl_idx = self.FindTab(wnd) - if not ctrl: - return False - - # remove the tab from ctrl - if not ctrl.RemovePage(wnd): - return False - - self.RemoveEmptyTabFrames() - - sel_page = 0 - tabs = layout[0:layout.index("@")] - to_break1 = False - - while 1: - - if "|" not in tabs: - to_break1 = True - tab_part = tabs - else: - tab_part = tabs[0:tabs.index('|')] - - if "=" not in tab_part: - # No pages in this perspective... - return False - - # Get pane name - pane_name = tab_part[0:tab_part.index("=")] - - # create a new tab frame - new_tabs = TabFrame(self) - self._tab_id_counter += 1 - new_tabs._tabs = AuiTabCtrl(self, self._tab_id_counter) - new_tabs._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) - new_tabs.SetTabCtrlHeight(self._tab_ctrl_height) - new_tabs._tabs.SetAGWFlags(self._agwFlags) - dest_tabs = new_tabs._tabs - - # create a pane info structure with the information - # about where the pane should be added - pane_info = framemanager.AuiPaneInfo().Name(pane_name).Bottom().CaptionVisible(False) - self._mgr.AddPane(new_tabs, pane_info) - - # Get list of tab id's and move them to pane - tab_list = tab_part[tab_part.index("=")+1:] - to_break2, active_found = False, False - - while 1: - if "," not in tab_list: - to_break2 = True - tab = tab_list - else: - tab = tab_list[0:tab_list.index(",")] - tab_list = tab_list[tab_list.index(",")+1:] - - # Check if this page has an 'active' marker - c = tab[0] - if c in ['+', '*']: - tab = tab[1:] - - tab_idx = int(tab) - if tab_idx >= self.GetPageCount(): - to_break1 = True - break - - # Move tab to pane - page = self._tabs.GetPage(tab_idx) - newpage_idx = dest_tabs.GetPageCount() - dest_tabs.InsertPage(page.window, page, newpage_idx) - - if c == '+': - dest_tabs.SetActivePage(newpage_idx) - active_found = True - elif c == '*': - sel_page = tab_idx - - if to_break2: - break - - if not active_found: - dest_tabs.SetActivePage(0) - - new_tabs.DoSizing() - dest_tabs.DoShowHide() - dest_tabs.Refresh() - - if to_break1: - break - - tabs = tabs[tabs.index('|')+1:] - - # Load the frame perspective - frames = layout[layout.index('@')+1:] - self._mgr.LoadPerspective(frames) - - # Force refresh of selection - self._curpage = -1 - self.SetSelection(sel_page) - - return True - - - def SetTabCtrlHeight(self, height): - """ - Sets the tab height. - - By default, the tab control height is calculated by measuring the text - height and bitmap sizes on the tab captions. - - Calling this method will override that calculation and set the tab control - to the specified height parameter. A call to this method will override - any call to L{SetUniformBitmapSize}. Specifying -1 as the height will - return the control to its default auto-sizing behaviour. - - :param `height`: the tab control area height. - """ - - self._requested_tabctrl_height = height - - # if window is already initialized, recalculate the tab height - if self._dummy_wnd: - self.UpdateTabCtrlHeight() - - - def SetUniformBitmapSize(self, size): - """ - Ensures that all tabs will have the same height, even if some tabs - don't have bitmaps. Passing ``wx.DefaultSize`` to this - function will instruct the control to use dynamic tab height, which is - the default behaviour. Under the default behaviour, when a tab with a - large bitmap is added, the tab control's height will automatically - increase to accommodate the larger bitmap. - - :param `size`: an instance of `wx.Size` specifying the tab bitmap size. - """ - - self._requested_bmp_size = wx.Size(*size) - - # if window is already initialized, recalculate the tab height - if self._dummy_wnd: - self.UpdateTabCtrlHeight() - - - def UpdateTabCtrlHeight(self, force=False): - """ - UpdateTabCtrlHeight() does the actual tab resizing. It's meant - to be used interally. - - :param `force`: ``True`` to force the tab art to repaint. - """ - - # get the tab ctrl height we will use - height = self.CalculateTabCtrlHeight() - - # if the tab control height needs to change, update - # all of our tab controls with the new height - if self._tab_ctrl_height != height or force: - art = self._tabs.GetArtProvider() - - self._tab_ctrl_height = height - - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - - if pane.name == "dummy": - continue - - tab_frame = pane.window - tabctrl = tab_frame._tabs - tab_frame.SetTabCtrlHeight(self._tab_ctrl_height) - tabctrl.SetArtProvider(art.Clone()) - tab_frame.DoSizing() - - - def UpdateHintWindowSize(self): - """ Updates the L{AuiManager} hint window size. """ - - size = self.CalculateNewSplitSize() - - # the placeholder hint window should be set to this size - info = self._mgr.GetPane("dummy") - - if info.IsOk(): - info.MinSize(size) - info.BestSize(size) - self._dummy_wnd.SetSize(size) - - - def CalculateNewSplitSize(self): - """ Calculates the size of the new split. """ - - # count number of tab controls - tab_ctrl_count = 0 - all_panes = self._mgr.GetAllPanes() - - for pane in all_panes: - if pane.name == "dummy": - continue - - tab_ctrl_count += 1 - - # if there is only one tab control, the first split - # should happen around the middle - if tab_ctrl_count < 2: - new_split_size = self.GetClientSize() - new_split_size.x /= 2 - new_split_size.y /= 2 - - else: - - # this is in place of a more complicated calculation - # that needs to be implemented - new_split_size = wx.Size(180, 180) - - return new_split_size - - - def CalculateTabCtrlHeight(self): - """ Calculates the tab control area height. """ - - # if a fixed tab ctrl height is specified, - # just return that instead of calculating a - # tab height - if self._requested_tabctrl_height != -1: - return self._requested_tabctrl_height - - # find out new best tab height - art = self._tabs.GetArtProvider() - - return art.GetBestTabCtrlSize(self, self._tabs.GetPages(), self._requested_bmp_size) - - - def GetArtProvider(self): - """ Returns the associated art provider. """ - - return self._tabs.GetArtProvider() - - - def SetAGWWindowStyleFlag(self, agwStyle): - """ - Sets the AGW-specific style of the window. - - :param `agwStyle`: the new window style. This can be a combination of the following bits: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook - ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. - ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. - ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook - ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab - ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging - ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control - ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width - ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed - ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available - ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar - ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab - ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs - ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click - ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks - ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present - ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows - ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items - ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) - ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages - ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) - ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs - ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle - ==================================== ================================== - - :note: Please note that some styles cannot be changed after the window - creation and that `Refresh` might need to be be called after changing the - others for the change to take place immediately. - - :todo: Implementation of flags ``AUI_NB_RIGHT`` and ``AUI_NB_LEFT``. - """ - - self._agwFlags = agwStyle - - # if the control is already initialized - if self._mgr.GetManagedWindow() == self: - - # let all of the tab children know about the new style - - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabframe = pane.window - tabctrl = tabframe._tabs - tabctrl.SetAGWFlags(self._agwFlags) - tabframe.DoSizing() - tabctrl.Refresh() - tabctrl.Update() - - - def GetAGWWindowStyleFlag(self): - """ - Returns the AGW-specific style of the window. - - :see: L{SetAGWWindowStyleFlag} for a list of possible AGW-specific window styles. - """ - - return self._agwFlags - - - def AddPage(self, page, caption, select=False, bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap, control=None): - """ - Adds a page. If the `select` parameter is ``True``, calling this will generate a - page change event. - - :param `page`: the page to be added; - :param `caption`: specifies the text for the new page; - :param `select`: specifies whether the page should be selected; - :param `bitmap`: the `wx.Bitmap` to display in the enabled tab; - :param `disabled_bitmap`: the `wx.Bitmap` to display in the disabled tab; - :param `control`: a `wx.Window` instance inside a tab (or ``None``). - """ - - return self.InsertPage(self.GetPageCount(), page, caption, select, bitmap, disabled_bitmap, control) - - - def InsertPage(self, page_idx, page, caption, select=False, bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap, - control=None): - """ - This is similar to L{AddPage}, but allows the ability to specify the insert location. - - :param `page_idx`: specifies the position for the new page; - :param `page`: the page to be added; - :param `caption`: specifies the text for the new page; - :param `select`: specifies whether the page should be selected; - :param `bitmap`: the `wx.Bitmap` to display in the enabled tab; - :param `disabled_bitmap`: the `wx.Bitmap` to display in the disabled tab; - :param `control`: a `wx.Window` instance inside a tab (or ``None``). - """ - - if not page: - return False - - page.Reparent(self) - info = AuiNotebookPage() - info.window = page - info.caption = caption - info.bitmap = bitmap - info.active = False - info.control = control - - originalPaneMgr = framemanager.GetManager(page) - if originalPaneMgr: - originalPane = originalPaneMgr.GetPane(page) - - if originalPane: - info.hasCloseButton = originalPane.HasCloseButton() - - if bitmap.IsOk() and not disabled_bitmap.IsOk(): - disabled_bitmap = MakeDisabledBitmap(bitmap) - info.dis_bitmap = disabled_bitmap - - # if there are currently no tabs, the first added - # tab must be active - if self._tabs.GetPageCount() == 0: - info.active = True - - self._tabs.InsertPage(page, info, page_idx) - - # if that was the first page added, even if - # select is False, it must become the "current page" - # (though no select events will be fired) - if not select and self._tabs.GetPageCount() == 1: - select = True - - active_tabctrl = self.GetActiveTabCtrl() - if page_idx >= active_tabctrl.GetPageCount(): - active_tabctrl.AddPage(page, info) - else: - active_tabctrl.InsertPage(page, info, page_idx) - - force = False - if control: - force = True - control.Reparent(active_tabctrl) - control.Show() - - self.UpdateTabCtrlHeight(force=force) - self.DoSizing() - active_tabctrl.DoShowHide() - - # adjust selected index - if self._curpage >= page_idx: - self._curpage += 1 - - if select: - self.SetSelectionToWindow(page) - - return True - - - def DeletePage(self, page_idx): - """ - Deletes a page at the given index. Calling this method will generate a page - change event. - - :param `page_idx`: the page index to be deleted. - - :note: L{DeletePage} removes a tab from the multi-notebook, and destroys the window as well. - - :see: L{RemovePage} - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - wnd = self._tabs.GetWindowFromIdx(page_idx) - # hide the window in advance, as this will - # prevent flicker - wnd.Show(False) - - self.RemoveControlFromPage(page_idx) - - if not self.RemovePage(page_idx): - return False - - wnd.Destroy() - - return True - - - def RemovePage(self, page_idx): - """ - Removes a page, without deleting the window pointer. - - :param `page_idx`: the page index to be removed. - - :note: L{RemovePage} removes a tab from the multi-notebook, but does not destroy the window. - - :see: L{DeletePage} - """ - - # save active window pointer - active_wnd = None - if self._curpage >= 0: - active_wnd = self._tabs.GetWindowFromIdx(self._curpage) - - # save pointer of window being deleted - wnd = self._tabs.GetWindowFromIdx(page_idx) - new_active = None - - # make sure we found the page - if not wnd: - return False - - # find out which onscreen tab ctrl owns this tab - ctrl, ctrl_idx = self.FindTab(wnd) - if not ctrl: - return False - - currentPage = ctrl.GetPage(ctrl_idx) - is_curpage = (self._curpage == page_idx) - is_active_in_split = currentPage.active - - # remove the tab from main catalog - if not self._tabs.RemovePage(wnd): - return False - - # remove the tab from the onscreen tab ctrl - ctrl.RemovePage(wnd) - - if is_active_in_split: - - ctrl_new_page_count = ctrl.GetPageCount() - - if ctrl_idx >= ctrl_new_page_count: - ctrl_idx = ctrl_new_page_count - 1 - - if ctrl_idx >= 0 and ctrl_idx < ctrl.GetPageCount(): - - ctrl_idx = self.FindNextActiveTab(ctrl_idx, ctrl) - - # set new page as active in the tab split - ctrl.SetActivePage(ctrl_idx) - - # if the page deleted was the current page for the - # entire tab control, then record the window - # pointer of the new active page for activation - if is_curpage: - new_active = ctrl.GetWindowFromIdx(ctrl_idx) - - else: - - # we are not deleting the active page, so keep it the same - new_active = active_wnd - - if not new_active: - - # we haven't yet found a new page to active, - # so select the next page from the main tab - # catalogue - - if 0 <= page_idx < self._tabs.GetPageCount(): - new_active = self._tabs.GetPage(page_idx).window - if not new_active and self._tabs.GetPageCount() > 0: - new_active = self._tabs.GetPage(0).window - - self.RemoveEmptyTabFrames() - - # set new active pane - if new_active: - if not self.IsBeingDeleted(): - self._curpage = -1 - self.SetSelectionToWindow(new_active) - else: - self._curpage = -1 - self._tabs.SetNoneActive() - - return True - - - def FindNextActiveTab(self, ctrl_idx, ctrl): - """ - Finds the next active tab (used mainly when L{AuiNotebook} has inactive/disabled - tabs in it). - - :param `ctrl_idx`: the index of the first (most obvious) tab to check for active status; - :param `ctrl`: an instance of L{AuiTabCtrl}. - """ - - if self.GetEnabled(ctrl_idx): - return ctrl_idx - - for indx in xrange(ctrl_idx, ctrl.GetPageCount()): - if self.GetEnabled(indx): - return indx - - for indx in xrange(ctrl_idx, -1, -1): - if self.GetEnabled(indx): - return indx - - return 0 - - - def HideAllTabs(self, hidden=True): - """ - Hides all tabs on the L{AuiNotebook} control. - - :param `hidden`: if ``True`` hides all tabs. - """ - - self._hide_tabs = hidden - - - def SetSashDClickUnsplit(self, unsplit=True): - """ - Sets whether to unsplit a splitted L{AuiNotebook} when double-clicking on a sash. - - :param `unsplit`: ``True`` to unsplit on sash double-clicking, ``False`` otherwise. - """ - - self._sash_dclick_unsplit = unsplit - - - def GetSashDClickUnsplit(self): - """ - Returns whether a splitted L{AuiNotebook} can be unsplitted by double-clicking - on the splitter sash. - """ - - return self._sash_dclick_unsplit - - - def SetMinMaxTabWidth(self, minTabWidth, maxTabWidth): - """ - Sets the minimum and/or the maximum tab widths for L{AuiNotebook} when the - ``AUI_NB_TAB_FIXED_WIDTH`` style is defined. - - Pass -1 to either `minTabWidth` or `maxTabWidth` to reset to the default tab - width behaviour for L{AuiNotebook}. - - :param `minTabWidth`: the minimum allowed tab width, in pixels; - :param `maxTabWidth`: the maximum allowed tab width, in pixels. - - :note: Minimum and maximum tabs widths are used only when the ``AUI_NB_TAB_FIXED_WIDTH`` - style is present. - """ - - if minTabWidth > maxTabWidth: - raise Exception("Minimum tab width must be less or equal than maximum tab width") - - self._tabBounds = (minTabWidth, maxTabWidth) - self.SetAGWWindowStyleFlag(self._agwFlags) - - - def GetMinMaxTabWidth(self): - """ - Returns the minimum and the maximum tab widths for L{AuiNotebook} when the - ``AUI_NB_TAB_FIXED_WIDTH`` style is defined. - - :note: Minimum and maximum tabs widths are used only when the ``AUI_NB_TAB_FIXED_WIDTH`` - style is present. - - :see: L{SetMinMaxTabWidth} for more information. - """ - - return self._tabBounds - - - def GetPageIndex(self, page_wnd): - """ - Returns the page index for the specified window. If the window is not - found in the notebook, ``wx.NOT_FOUND`` is returned. - """ - - return self._tabs.GetIdxFromWindow(page_wnd) - - - def SetPageText(self, page_idx, text): - """ - Sets the tab label for the page. - - :param `page_idx`: the page index; - :param `text`: the new tab label. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - should_refresh = page_info.caption != text - page_info.caption = text - - # update what's on screen - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - info = ctrl.GetPage(ctrl_idx) - should_refresh = should_refresh or info.caption != text - info.caption = text - - if should_refresh: - ctrl.Refresh() - ctrl.Update() - - self.UpdateTabCtrlHeight(force=True) - - return True - - - def GetPageText(self, page_idx): - """ - Returns the tab label for the page. - - :param `page_idx`: the page index. - """ - - if page_idx >= self._tabs.GetPageCount(): - return "" - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - return page_info.caption - - - def SetPageBitmap(self, page_idx, bitmap): - """ - Sets the tab bitmap for the page. - - :param `page_idx`: the page index; - :param `bitmap`: an instance of `wx.Bitmap`. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - should_refresh = page_info.bitmap is not bitmap - page_info.bitmap = bitmap - if bitmap.IsOk() and not page_info.dis_bitmap.IsOk(): - page_info.dis_bitmap = MakeDisabledBitmap(bitmap) - - # tab height might have changed - self.UpdateTabCtrlHeight() - - # update what's on screen - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - info = ctrl.GetPage(ctrl_idx) - should_refresh = should_refresh or info.bitmap is not bitmap - info.bitmap = bitmap - info.dis_bitmap = page_info.dis_bitmap - if should_refresh: - ctrl.Refresh() - ctrl.Update() - - return True - - - def GetPageBitmap(self, page_idx): - """ - Returns the tab bitmap for the page. - - :param `page_idx`: the page index. - """ - - if page_idx >= self._tabs.GetPageCount(): - return wx.NullBitmap - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - return page_info.bitmap - - - def SetImageList(self, imageList): - """ - Sets the image list for the L{AuiNotebook} control. - - :param `imageList`: an instance of `wx.ImageList`. - """ - - self._imageList = imageList - - - def AssignImageList(self, imageList): - """ - Sets the image list for the L{AuiNotebook} control. - - :param `imageList`: an instance of `wx.ImageList`. - """ - - self.SetImageList(imageList) - - - def GetImageList(self): - """ Returns the associated image list (if any). """ - - return self._imageList - - - def SetPageImage(self, page, image): - """ - Sets the image index for the given page. - - :param `page`: the page index; - :param `image`: an index into the image list which was set with L{SetImageList}. - """ - - if page >= self._tabs.GetPageCount(): - return False - - if not isinstance(image, types.IntType): - raise Exception("The image parameter must be an integer, you passed " \ - "%s"%repr(image)) - - if not self._imageList: - raise Exception("To use SetPageImage you need to associate an image list " \ - "Using SetImageList or AssignImageList") - - if image >= self._imageList.GetImageCount(): - raise Exception("Invalid image index (%d), the image list contains only" \ - " (%d) bitmaps"%(image, self._imageList.GetImageCount())) - - if image == -1: - self.SetPageBitmap(page, wx.NullBitmap) - return - - bitmap = self._imageList.GetBitmap(image) - self.SetPageBitmap(page, bitmap) - - - def GetPageImage(self, page): - """ - Returns the image index for the given page. - - :param `page`: the given page for which to retrieve the image index. - """ - - if page >= self._tabs.GetPageCount(): - return False - - bitmap = self.GetPageBitmap(page) - for indx in xrange(self._imageList.GetImageCount()): - imgListBmp = self._imageList.GetBitmap(indx) - if imgListBmp == bitmap: - return indx - - return wx.NOT_FOUND - - - def SetPageTextColour(self, page_idx, colour): - """ - Sets the tab text colour for the page. - - :param `page_idx`: the page index; - :param `colour`: an instance of `wx.Colour`. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - should_refresh = page_info.text_colour != colour - page_info.text_colour = colour - - # update what's on screen - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - info = ctrl.GetPage(ctrl_idx) - should_refresh = should_refresh or info.text_colour != colour - info.text_colour = page_info.text_colour - - if should_refresh: - ctrl.Refresh() - ctrl.Update() - - return True - - - def GetPageTextColour(self, page_idx): - """ - Returns the tab text colour for the page. - - :param `page_idx`: the page index. - """ - - if page_idx >= self._tabs.GetPageCount(): - return wx.NullColour - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - return page_info.text_colour - - - def AddControlToPage(self, page_idx, control): - """ - Adds a control inside a tab (not in the tab area). - - :param `page_idx`: the page index; - :param `control`: an instance of `wx.Window`. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - page_info.control = control - - # tab height might have changed - self.UpdateTabCtrlHeight(force=True) - - # update what's on screen - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - control.Reparent(ctrl) - - info = ctrl.GetPage(ctrl_idx) - info.control = control - ctrl.Refresh() - ctrl.Update() - - return True - - - def RemoveControlFromPage(self, page_idx): - """ - Removes a control from a tab (not from the tab area). - - :param `page_idx`: the page index. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - page_info = self._tabs.GetPage(page_idx) - if page_info.control is None: - return False - - page_info.control.Destroy() - page_info.control = None - - # tab height might have changed - self.UpdateTabCtrlHeight(force=True) - - # update what's on screen - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - info = ctrl.GetPage(ctrl_idx) - info.control = None - ctrl.Refresh() - ctrl.Update() - - return True - - - def SetCloseButton(self, page_idx, hasCloseButton): - """ - Sets whether a tab should display a close button or not. - - :param `page_idx`: the page index; - :param `hasCloseButton`: ``True`` if the page displays a close button. - - :note: This can only be called if ``AUI_NB_CLOSE_ON_ALL_TABS`` is specified. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - if self._agwFlags & AUI_NB_CLOSE_ON_ALL_TABS == 0: - raise Exception("SetCloseButton can only be used with AUI_NB_CLOSE_ON_ALL_TABS style.") - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - page_info.hasCloseButton = hasCloseButton - - # update what's on screen - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - info = ctrl.GetPage(ctrl_idx) - info.hasCloseButton = page_info.hasCloseButton - ctrl.Refresh() - ctrl.Update() - - return True - - - def HasCloseButton(self, page_idx): - """ - Returns whether a tab displays a close button or not. - - :param `page_idx`: the page index. - - :note: This can only be called if ``AUI_NB_CLOSE_ON_ALL_TABS`` is specified. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - page_info = self._tabs.GetPage(page_idx) - return page_info.hasCloseButton - - - def GetSelection(self): - """ Returns the index of the currently active page, or -1 if none was selected. """ - - return self._curpage - - - def GetCurrentPage(self): - """ Returns the currently active page (not the index), or ``None`` if none was selected. """ - - if self._curpage >= 0 and self._curpage < self._tabs.GetPageCount(): - return self.GetPage(self._curpage) - - return None - - - def EnsureVisible(self, indx): - """ - Ensures the input page index `indx` is visible. - - :param `indx`: the page index. - """ - - self._tabs.MakeTabVisible(indx, self) - - - def SetSelection(self, new_page, force=False): - """ - Sets the page selection. Calling this method will generate a page change event. - - :param `new_page`: the index of the new selection; - :param `force`: whether to force the selection or not. - """ - wnd = self._tabs.GetWindowFromIdx(new_page) - - #Update page access time - self._tabs.GetPages()[new_page].access_time = datetime.datetime.now() - - if not wnd or not self.GetEnabled(new_page): - return self._curpage - - # don't change the page unless necessary - # however, clicking again on a tab should give it the focus. - if new_page == self._curpage and not force: - - ctrl, ctrl_idx = self.FindTab(wnd) - if wx.Window.FindFocus() != ctrl: - ctrl.SetFocus() - - return self._curpage - - evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) - evt.SetSelection(new_page) - evt.SetOldSelection(self._curpage) - evt.SetEventObject(self) - - if not self.GetEventHandler().ProcessEvent(evt) or evt.IsAllowed(): - - old_curpage = self._curpage - self._curpage = new_page - - # program allows the page change - evt.SetEventType(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED) - self.GetEventHandler().ProcessEvent(evt) - - if not evt.IsAllowed(): # event is no longer allowed after handler - return self._curpage - - ctrl, ctrl_idx = self.FindTab(wnd) - - if ctrl: - self._tabs.SetActivePage(wnd) - ctrl.SetActivePage(ctrl_idx) - self.DoSizing() - ctrl.DoShowHide() - ctrl.MakeTabVisible(ctrl_idx, ctrl) - - # set fonts - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabctrl = pane.window._tabs - if tabctrl != ctrl: - tabctrl.SetSelectedFont(self._normal_font) - else: - tabctrl.SetSelectedFont(self._selected_font) - - tabctrl.Refresh() - tabctrl.Update() - - # Set the focus to the page if we're not currently focused on the tab. - # This is Firefox-like behaviour. - if wnd.IsShownOnScreen() and wx.Window.FindFocus() != ctrl: - wnd.SetFocus() - - return old_curpage - - return self._curpage - - - def SetSelectionToWindow(self, win): - """ - Sets the selection based on the input window `win`. - - :param `win`: a `wx.Window` derived window. - """ - - idx = self._tabs.GetIdxFromWindow(win) - - if idx == wx.NOT_FOUND: - raise Exception("invalid notebook page") - - if not self.GetEnabled(idx): - return - - # since a tab was clicked, let the parent know that we received - # the focus, even if we will assign that focus immediately - # to the child tab in the SetSelection call below - # (the child focus event will also let AuiManager, if any, - # know that the notebook control has been activated) - - parent = self.GetParent() - if parent: - eventFocus = wx.ChildFocusEvent(self) - parent.GetEventHandler().ProcessEvent(eventFocus) - - self.SetSelection(idx) - - - def SetSelectionToPage(self, page): - """ - Sets the selection based on the input page. - - :param `page`: an instance of L{AuiNotebookPage}. - """ - - self.SetSelectionToWindow(page.window) - - - def GetPageCount(self): - """ Returns the number of pages in the notebook. """ - - return self._tabs.GetPageCount() - - - def GetPage(self, page_idx): - """ - Returns the page specified by the given index. - - :param `page_idx`: the page index. - """ - - if page_idx >= self._tabs.GetPageCount(): - raise Exception("invalid notebook page") - - return self._tabs.GetWindowFromIdx(page_idx) - - - def GetPageInfo(self, page_idx): - """ - Returns the L{AuiNotebookPage} info structure specified by the given index. - - :param `page_idx`: the page index. - """ - - if page_idx >= self._tabs.GetPageCount(): - raise Exception("invalid notebook page") - - return self._tabs.GetPage(page_idx) - - - def GetEnabled(self, page_idx): - """ - Returns whether the page specified by the index `page_idx` is enabled. - - :param `page_idx`: the page index. - """ - - return self._tabs.GetEnabled(page_idx) - - - def EnableTab(self, page_idx, enable=True): - """ - Enables/disables a page in the notebook. - - :param `page_idx`: the page index; - :param `enable`: ``True`` to enable the page, ``False`` to disable it. - """ - - self._tabs.EnableTab(page_idx, enable) - self.Refresh() - - - def DoSizing(self): - """ Performs all sizing operations in each tab control. """ - - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabframe = pane.window - tabframe.DoSizing() - - - def GetAuiManager(self): - """ Returns the associated L{AuiManager}. """ - - return self._mgr - - - def GetActiveTabCtrl(self): - """ - Returns the active tab control. It is called to determine which control - gets new windows being added. - """ - - if self._curpage >= 0 and self._curpage < self._tabs.GetPageCount(): - - # find the tab ctrl with the current page - ctrl, idx = self.FindTab(self._tabs.GetPage(self._curpage).window) - if ctrl: - return ctrl - - # no current page, just find the first tab ctrl - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabframe = pane.window - return tabframe._tabs - - # If there is no tabframe at all, create one - tabframe = TabFrame(self) - tabframe.SetTabCtrlHeight(self._tab_ctrl_height) - self._tab_id_counter += 1 - tabframe._tabs = AuiTabCtrl(self, self._tab_id_counter) - - tabframe._tabs.SetAGWFlags(self._agwFlags) - tabframe._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) - self._mgr.AddPane(tabframe, framemanager.AuiPaneInfo().Center().CaptionVisible(False). - PaneBorder((self._agwFlags & AUI_NB_SUB_NOTEBOOK) == 0)) - - self._mgr.Update() - - return tabframe._tabs - - - def FindTab(self, page): - """ - Finds the tab control that currently contains the window as well - as the index of the window in the tab control. It returns ``True`` if the - window was found, otherwise ``False``. - - :param `page`: an instance of L{AuiNotebookPage}. - """ - - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabframe = pane.window - - page_idx = tabframe._tabs.GetIdxFromWindow(page) - - if page_idx != -1: - - ctrl = tabframe._tabs - idx = page_idx - return ctrl, idx - - return None, wx.NOT_FOUND - - - def Split(self, page, direction): - """ - Performs a split operation programmatically. - - :param `page`: indicates the page that will be split off. This page will also become - the active page after the split. - :param `direction`: specifies where the pane should go, it should be one of the - following: ``wx.TOP``, ``wx.BOTTOM``, ``wx.LEFT``, or ``wx.RIGHT``. - """ - - cli_size = self.GetClientSize() - - # get the page's window pointer - wnd = self.GetPage(page) - if not wnd: - return - - # notebooks with 1 or less pages can't be split - if self.GetPageCount() < 2: - return - - # find out which tab control the page currently belongs to - - src_tabs, src_idx = self.FindTab(wnd) - if not src_tabs: - return - - # choose a split size - if self.GetPageCount() > 2: - split_size = self.CalculateNewSplitSize() - else: - # because there are two panes, always split them - # equally - split_size = self.GetClientSize() - split_size.x /= 2 - split_size.y /= 2 - - # create a new tab frame - new_tabs = TabFrame(self) - new_tabs._rect = wx.RectPS(wx.Point(0, 0), split_size) - new_tabs.SetTabCtrlHeight(self._tab_ctrl_height) - self._tab_id_counter += 1 - new_tabs._tabs = AuiTabCtrl(self, self._tab_id_counter) - - new_tabs._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) - new_tabs._tabs.SetAGWFlags(self._agwFlags) - dest_tabs = new_tabs._tabs - - page_info = src_tabs.GetPage(src_idx) - if page_info.control: - self.ReparentControl(page_info.control, dest_tabs) - - # create a pane info structure with the information - # about where the pane should be added - pane_info = framemanager.AuiPaneInfo().Bottom().CaptionVisible(False) - - if direction == wx.LEFT: - - pane_info.Left() - mouse_pt = wx.Point(0, cli_size.y/2) - - elif direction == wx.RIGHT: - - pane_info.Right() - mouse_pt = wx.Point(cli_size.x, cli_size.y/2) - - elif direction == wx.TOP: - - pane_info.Top() - mouse_pt = wx.Point(cli_size.x/2, 0) - - elif direction == wx.BOTTOM: - - pane_info.Bottom() - mouse_pt = wx.Point(cli_size.x/2, cli_size.y) - - self._mgr.AddPane(new_tabs, pane_info, mouse_pt) - self._mgr.Update() - - # remove the page from the source tabs - page_info.active = False - - src_tabs.RemovePage(page_info.window) - - if src_tabs.GetPageCount() > 0: - src_tabs.SetActivePage(0) - src_tabs.DoShowHide() - src_tabs.Refresh() - - # add the page to the destination tabs - dest_tabs.InsertPage(page_info.window, page_info, 0) - - if src_tabs.GetPageCount() == 0: - self.RemoveEmptyTabFrames() - - self.DoSizing() - dest_tabs.DoShowHide() - dest_tabs.Refresh() - - # force the set selection function reset the selection - self._curpage = -1 - - # set the active page to the one we just split off - self.SetSelectionToPage(page_info) - - self.UpdateHintWindowSize() - - - def UnSplit(self): - """ Restores original view after a tab split. """ - - self.Freeze() - - # remember the tab now selected - nowSelected = self.GetSelection() - # select first tab as destination - self.SetSelection(0) - # iterate all other tabs - for idx in xrange(1, self.GetPageCount()): - # get win reference - win = self.GetPage(idx) - # get tab title - title = self.GetPageText(idx) - # get page bitmap - bmp = self.GetPageBitmap(idx) - # remove from notebook - self.RemovePage(idx) - # re-add in the same position so it will tab - self.InsertPage(idx, win, title, False, bmp) - # restore orignial selected tab - self.SetSelection(nowSelected) - - self.Thaw() - - - def ReparentControl(self, control, dest_tabs): - """ - Reparents a control added inside a tab. - - :param `control`: an instance of `wx.Window`; - :param `dest_tabs`: the destination L{AuiTabCtrl}. - """ - - control.Hide() - control.Reparent(dest_tabs) - - - def UnsplitDClick(self, part, sash_size, pos): - """ - Unsplit the L{AuiNotebook} on sash double-click. - - :param `part`: an UI part representing the sash; - :param `sash_size`: the sash size; - :param `pos`: the double-click mouse position. - - :warning: Due to a bug on MSW, for disabled pages `wx.FindWindowAtPoint` - returns the wrong window. See http://trac.wxwidgets.org/ticket/2942 - """ - - if not self._sash_dclick_unsplit: - # Unsplit not allowed - return - - pos1 = wx.Point(*pos) - pos2 = wx.Point(*pos) - if part.orientation == wx.HORIZONTAL: - pos1.y -= 2*sash_size - pos2.y += 2*sash_size + self.GetTabCtrlHeight() - elif part.orientation == wx.VERTICAL: - pos1.x -= 2*sash_size - pos2.x += 2*sash_size - else: - raise Exception("Invalid UI part orientation") - - pos1, pos2 = self.ClientToScreen(pos1), self.ClientToScreen(pos2) - win1, win2 = wx.FindWindowAtPoint(pos1), wx.FindWindowAtPoint(pos2) - - if isinstance(win1, wx.ScrollBar): - # Hopefully it will work - pos1 = wx.Point(*pos) - shift = wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X) + 2*(sash_size+1) - if part.orientation == wx.HORIZONTAL: - pos1.y -= shift - else: - pos1.x -= shift - - pos1 = self.ClientToScreen(pos1) - win1 = wx.FindWindowAtPoint(pos1) - - if isinstance(win2, wx.ScrollBar): - pos2 = wx.Point(*pos) - shift = wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X) + 2*(sash_size+1) - if part.orientation == wx.HORIZONTAL: - pos2.y += shift - else: - pos2.x += shift - - pos2 = self.ClientToScreen(pos2) - win2 = wx.FindWindowAtPoint(pos2) - - if not win1 or not win2: - # How did we get here? - return - - if isinstance(win1, AuiNotebook) or isinstance(win2, AuiNotebook): - # This is a bug on MSW, for disabled pages wx.FindWindowAtPoint - # returns the wrong window. - # See http://trac.wxwidgets.org/ticket/2942 - return - - tab_frame1, tab_frame2 = self.GetTabFrameFromWindow(win1), self.GetTabFrameFromWindow(win2) - - if not tab_frame1 or not tab_frame2: - return - - tab_ctrl_1, tab_ctrl_2 = tab_frame1._tabs, tab_frame2._tabs - - if tab_ctrl_1.GetPageCount() > tab_ctrl_2.GetPageCount(): - src_tabs = tab_ctrl_2 - dest_tabs = tab_ctrl_1 - else: - src_tabs = tab_ctrl_1 - dest_tabs = tab_ctrl_2 - - selection = -1 - page_count = dest_tabs.GetPageCount() - - for page in xrange(src_tabs.GetPageCount()-1, -1, -1): - # remove the page from the source tabs - page_info = src_tabs.GetPage(page) - if page_info.active: - selection = page_count + page - src_tabs.RemovePage(page_info.window) - - # add the page to the destination tabs - dest_tabs.AddPage(page_info.window, page_info) - if page_info.control: - self.ReparentControl(page_info.control, dest_tabs) - - self.RemoveEmptyTabFrames() - - dest_tabs.DoShowHide() - self.DoSizing() - dest_tabs.Refresh() - self._mgr.Update() - if selection > 0: - wx.CallAfter(dest_tabs.MakeTabVisible, selection, self) - - - def OnSize(self, event): - """ - Handles the ``wx.EVT_SIZE`` event for L{AuiNotebook}. - - :param `event`: a `wx.SizeEvent` event to be processed. - """ - - self.UpdateHintWindowSize() - event.Skip() - - - def OnTabClicked(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_PAGE_CHANGING`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - if self._textCtrl is not None: - self._textCtrl.StopEditing() - - ctrl = event.GetEventObject() - assert ctrl != None - - wnd = ctrl.GetWindowFromIdx(event.GetSelection()) - assert wnd != None - - self.SetSelectionToWindow(wnd) - - - def OnTabBgDClick(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_BG_DCLICK`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - if self._textCtrl is not None: - self._textCtrl.StopEditing() - - # notify owner that the tabbar background has been double-clicked - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, self.GetId()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnTabDClick(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_TAB_DCLICK`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - # notify owner that the tabbar background has been double-clicked - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK, self.GetId()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - if not self.IsRenamable(event.GetSelection()): - return - - self.EditTab(event.GetSelection()) - - - def OnTabBeginDrag(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_BEGIN_DRAG`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - self._last_drag_x = 0 - - - def OnTabDragMotion(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_DRAG_MOTION`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - if self._textCtrl is not None: - self._textCtrl.StopEditing() - - screen_pt = wx.GetMousePosition() - client_pt = self.ScreenToClient(screen_pt) - zero = wx.Point(0, 0) - - src_tabs = event.GetEventObject() - dest_tabs = self.GetTabCtrlFromPoint(client_pt) - - if dest_tabs == src_tabs: - - # always hide the hint for inner-tabctrl drag - self._mgr.HideHint() - - # if tab moving is not allowed, leave - if not self._agwFlags & AUI_NB_TAB_MOVE: - return - - pt = dest_tabs.ScreenToClient(screen_pt) - - # this is an inner-tab drag/reposition - dest_location_tab = dest_tabs.TabHitTest(pt.x, pt.y) - - if dest_location_tab: - - src_idx = event.GetSelection() - dest_idx = dest_tabs.GetIdxFromWindow(dest_location_tab) - - # prevent jumpy drag - if (src_idx == dest_idx) or dest_idx == -1 or \ - (src_idx > dest_idx and self._last_drag_x <= pt.x) or \ - (src_idx < dest_idx and self._last_drag_x >= pt.x): - - self._last_drag_x = pt.x - return - - src_tab = dest_tabs.GetWindowFromIdx(src_idx) - dest_tabs.MovePage(src_tab, dest_idx) - self._tabs.MovePage(self._tabs.GetPage(src_idx).window, dest_idx) - dest_tabs.SetActivePage(dest_idx) - dest_tabs.DoShowHide() - dest_tabs.Refresh() - self._last_drag_x = pt.x - - return - - # if external drag is allowed, check if the tab is being dragged - # over a different AuiNotebook control - if self._agwFlags & AUI_NB_TAB_EXTERNAL_MOVE: - - tab_ctrl = wx.FindWindowAtPoint(screen_pt) - - # if we aren't over any window, stop here - if not tab_ctrl: - if self._agwFlags & AUI_NB_TAB_FLOAT: - if self.IsMouseWellOutsideWindow(): - hintRect = wx.RectPS(screen_pt, (400, 300)) - # Use CallAfter so we overwrite the hint that might be - # shown by our superclass: - wx.CallAfter(self._mgr.ShowHint, hintRect) - return - - # make sure we are not over the hint window - if not isinstance(tab_ctrl, wx.Frame): - while tab_ctrl: - if isinstance(tab_ctrl, AuiTabCtrl): - break - - tab_ctrl = tab_ctrl.GetParent() - - if tab_ctrl: - nb = tab_ctrl.GetParent() - - if nb != self: - - hint_rect = tab_ctrl.GetClientRect() - hint_rect.x, hint_rect.y = tab_ctrl.ClientToScreenXY(hint_rect.x, hint_rect.y) - self._mgr.ShowHint(hint_rect) - return - - else: - - if not dest_tabs: - # we are either over a hint window, or not over a tab - # window, and there is no where to drag to, so exit - return - - if self._agwFlags & AUI_NB_TAB_FLOAT: - if self.IsMouseWellOutsideWindow(): - hintRect = wx.RectPS(screen_pt, (400, 300)) - # Use CallAfter so we overwrite the hint that might be - # shown by our superclass: - wx.CallAfter(self._mgr.ShowHint, hintRect) - return - - # if there are less than two panes, split can't happen, so leave - if self._tabs.GetPageCount() < 2: - return - - # if tab moving is not allowed, leave - if not self._agwFlags & AUI_NB_TAB_SPLIT: - return - - if dest_tabs: - - hint_rect = dest_tabs.GetRect() - hint_rect.x, hint_rect.y = self.ClientToScreenXY(hint_rect.x, hint_rect.y) - self._mgr.ShowHint(hint_rect) - - else: - rect = self._mgr.CalculateHintRect(self._dummy_wnd, client_pt, zero) - if rect.IsEmpty(): - self._mgr.HideHint() - return - - hit_wnd = wx.FindWindowAtPoint(screen_pt) - if hit_wnd and not isinstance(hit_wnd, AuiNotebook): - tab_frame = self.GetTabFrameFromWindow(hit_wnd) - if tab_frame: - hint_rect = wx.Rect(*tab_frame._rect) - hint_rect.x, hint_rect.y = self.ClientToScreenXY(hint_rect.x, hint_rect.y) - rect.Intersect(hint_rect) - self._mgr.ShowHint(rect) - else: - self._mgr.DrawHintRect(self._dummy_wnd, client_pt, zero) - else: - self._mgr.DrawHintRect(self._dummy_wnd, client_pt, zero) - - - def OnTabEndDrag(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_END_DRAG`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - self._mgr.HideHint() - - src_tabs = event.GetEventObject() - if not src_tabs: - raise Exception("no source object?") - - # get the mouse position, which will be used to determine the drop point - mouse_screen_pt = wx.GetMousePosition() - mouse_client_pt = self.ScreenToClient(mouse_screen_pt) - - # check for an external move - if self._agwFlags & AUI_NB_TAB_EXTERNAL_MOVE: - tab_ctrl = wx.FindWindowAtPoint(mouse_screen_pt) - - while tab_ctrl: - - if isinstance(tab_ctrl, AuiTabCtrl): - break - - tab_ctrl = tab_ctrl.GetParent() - - if tab_ctrl: - - nb = tab_ctrl.GetParent() - - if nb != self: - - # find out from the destination control - # if it's ok to drop this tab here - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, self.GetId()) - e.SetSelection(event.GetSelection()) - e.SetOldSelection(event.GetSelection()) - e.SetEventObject(self) - e.SetDragSource(self) - e.Veto() # dropping must be explicitly approved by control owner - - nb.GetEventHandler().ProcessEvent(e) - - if not e.IsAllowed(): - - # no answer or negative answer - self._mgr.HideHint() - return - - # drop was allowed - src_idx = event.GetSelection() - src_page = src_tabs.GetWindowFromIdx(src_idx) - - # Check that it's not an impossible parent relationship - p = nb - while p and not p.IsTopLevel(): - if p == src_page: - return - - p = p.GetParent() - - # get main index of the page - main_idx = self._tabs.GetIdxFromWindow(src_page) - if main_idx == wx.NOT_FOUND: - raise Exception("no source page?") - - # make a copy of the page info - page_info = self._tabs.GetPage(main_idx) - - # remove the page from the source notebook - self.RemovePage(main_idx) - - # reparent the page - src_page.Reparent(nb) - - # Reparent the control in a tab (if any) - if page_info.control: - self.ReparentControl(page_info.control, tab_ctrl) - - # find out the insert idx - dest_tabs = tab_ctrl - pt = dest_tabs.ScreenToClient(mouse_screen_pt) - - target = dest_tabs.TabHitTest(pt.x, pt.y) - insert_idx = -1 - if target: - insert_idx = dest_tabs.GetIdxFromWindow(target) - - # add the page to the new notebook - if insert_idx == -1: - insert_idx = dest_tabs.GetPageCount() - - dest_tabs.InsertPage(page_info.window, page_info, insert_idx) - nb._tabs.AddPage(page_info.window, page_info) - - nb.DoSizing() - dest_tabs.DoShowHide() - dest_tabs.Refresh() - - # set the selection in the destination tab control - nb.SetSelectionToPage(page_info) - - # notify owner that the tab has been dragged - e2 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, self.GetId()) - e2.SetSelection(event.GetSelection()) - e2.SetOldSelection(event.GetSelection()) - e2.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e2) - - # notify the target notebook that the tab has been dragged - e3 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, nb.GetId()) - e3.SetSelection(insert_idx) - e3.SetOldSelection(insert_idx) - e3.SetEventObject(nb) - nb.GetEventHandler().ProcessEvent(e3) - - return - - if self._agwFlags & AUI_NB_TAB_FLOAT: - self._mgr.HideHint() - if self.IsMouseWellOutsideWindow(): - # Use CallAfter so we our superclass can deal with the event first - wx.CallAfter(self.FloatPage, self.GetSelection()) - event.Skip() - return - - # only perform a tab split if it's allowed - dest_tabs = None - - if self._agwFlags & AUI_NB_TAB_SPLIT and self._tabs.GetPageCount() >= 2: - - # If the pointer is in an existing tab frame, do a tab insert - hit_wnd = wx.FindWindowAtPoint(mouse_screen_pt) - tab_frame = self.GetTabFrameFromTabCtrl(hit_wnd) - insert_idx = -1 - - if tab_frame: - - dest_tabs = tab_frame._tabs - - if dest_tabs == src_tabs: - return - - pt = dest_tabs.ScreenToClient(mouse_screen_pt) - target = dest_tabs.TabHitTest(pt.x, pt.y) - - if target: - insert_idx = dest_tabs.GetIdxFromWindow(target) - - else: - - zero = wx.Point(0, 0) - rect = self._mgr.CalculateHintRect(self._dummy_wnd, mouse_client_pt, zero) - - if rect.IsEmpty(): - # there is no suitable drop location here, exit out - return - - # If there is no tabframe at all, create one - new_tabs = TabFrame(self) - new_tabs._rect = wx.RectPS(wx.Point(0, 0), self.CalculateNewSplitSize()) - new_tabs.SetTabCtrlHeight(self._tab_ctrl_height) - self._tab_id_counter += 1 - new_tabs._tabs = AuiTabCtrl(self, self._tab_id_counter) - new_tabs._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) - new_tabs._tabs.SetAGWFlags(self._agwFlags) - - self._mgr.AddPane(new_tabs, framemanager.AuiPaneInfo().Bottom().CaptionVisible(False), mouse_client_pt) - self._mgr.Update() - dest_tabs = new_tabs._tabs - - # remove the page from the source tabs - page_info = src_tabs.GetPage(event.GetSelection()) - - if page_info.control: - self.ReparentControl(page_info.control, dest_tabs) - - page_info.active = False - src_tabs.RemovePage(page_info.window) - - if src_tabs.GetPageCount() > 0: - src_tabs.SetActivePage(0) - src_tabs.DoShowHide() - src_tabs.Refresh() - - # add the page to the destination tabs - if insert_idx == -1: - insert_idx = dest_tabs.GetPageCount() - - dest_tabs.InsertPage(page_info.window, page_info, insert_idx) - - if src_tabs.GetPageCount() == 0: - self.RemoveEmptyTabFrames() - - self.DoSizing() - dest_tabs.DoShowHide() - dest_tabs.Refresh() - - # force the set selection function reset the selection - self._curpage = -1 - - # set the active page to the one we just split off - self.SetSelectionToPage(page_info) - - self.UpdateHintWindowSize() - - # notify owner that the tab has been dragged - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, self.GetId()) - e.SetSelection(event.GetSelection()) - e.SetOldSelection(event.GetSelection()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnTabCancelDrag(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_CANCEL_DRAG`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - self._mgr.HideHint() - - src_tabs = event.GetEventObject() - if not src_tabs: - raise Exception("no source object?") - - - def IsMouseWellOutsideWindow(self): - """ Returns whether the mouse is well outside the L{AuiNotebook} screen rectangle. """ - - screen_rect = self.GetScreenRect() - screen_rect.Inflate(50, 50) - - return not screen_rect.Contains(wx.GetMousePosition()) - - - def FloatPage(self, page_index): - """ - Float the page in `page_index` by reparenting it to a floating frame. - - :param `page_index`: the index of the page to be floated. - - :warning: When the notebook is more or less full screen, tabs cannot be dragged far - enough outside of the notebook to become floating pages. - """ - - root_manager = framemanager.GetManager(self) - page_title = self.GetPageText(page_index) - page_contents = self.GetPage(page_index) - page_bitmap = self.GetPageBitmap(page_index) - text_colour = self.GetPageTextColour(page_index) - info = self.GetPageInfo(page_index) - - if root_manager and root_manager != self._mgr: - root_manager = framemanager.GetManager(self) - - if hasattr(page_contents, "__floating_size__"): - floating_size = wx.Size(*page_contents.__floating_size__) - else: - floating_size = page_contents.GetBestSize() - if floating_size == wx.DefaultSize: - floating_size = wx.Size(300, 200) - - page_contents.__page_index__ = page_index - page_contents.__aui_notebook__ = self - page_contents.__text_colour__ = text_colour - page_contents.__control__ = info.control - - if info.control: - info.control.Reparent(page_contents) - info.control.Hide() - info.control = None - - self.RemovePage(page_index) - self.RemoveEmptyTabFrames() - - pane_info = framemanager.AuiPaneInfo().Float().FloatingPosition(wx.GetMousePosition()). \ - FloatingSize(floating_size).BestSize(floating_size).Name("__floating__%s"%page_title). \ - Caption(page_title).Icon(page_bitmap) - root_manager.AddPane(page_contents, pane_info) - root_manager.Bind(framemanager.EVT_AUI_PANE_CLOSE, self.OnCloseFloatingPage) - self.GetActiveTabCtrl().DoShowHide() - self.DoSizing() - root_manager.Update() - - else: - frame = wx.Frame(self, title=page_title, - style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_TOOL_WINDOW| - wx.FRAME_FLOAT_ON_PARENT | wx.FRAME_NO_TASKBAR) - - if info.control: - info.control.Reparent(frame) - info.control.Hide() - - frame.bitmap = page_bitmap - frame.page_index = page_index - frame.text_colour = text_colour - frame.control = info.control - page_contents.Reparent(frame) - frame.Bind(wx.EVT_CLOSE, self.OnCloseFloatingPage) - frame.Move(wx.GetMousePosition()) - frame.Show() - self.RemovePage(page_index) - - self.RemoveEmptyTabFrames() - - wx.CallAfter(self.RemoveEmptyTabFrames) - - - def OnCloseFloatingPage(self, event): - """ - Handles the ``wx.EVT_CLOSE`` event for a floating page in L{AuiNotebook}. - - :param `event`: a `wx.CloseEvent` event to be processed. - """ - - root_manager = framemanager.GetManager(self) - if root_manager and root_manager != self._mgr: - pane = event.pane - if pane.name.startswith("__floating__"): - self.ReDockPage(pane) - return - - event.Skip() - else: - event.Skip() - frame = event.GetEventObject() - page_title = frame.GetTitle() - page_contents = list(frame.GetChildren())[-1] - page_contents.Reparent(self) - self.InsertPage(frame.page_index, page_contents, page_title, select=True, bitmap=frame.bitmap, control=frame.control) - - if frame.control: - src_tabs, idx = self.FindTab(page_contents) - frame.control.Reparent(src_tabs) - frame.control.Hide() - frame.control = None - - self.SetPageTextColour(frame.page_index, frame.text_colour) - - - def ReDockPage(self, pane): - """ - Re-docks a floating L{AuiNotebook} tab in the original position, when possible. - - :param `pane`: an instance of L{framemanager.AuiPaneInfo}. - """ - - root_manager = framemanager.GetManager(self) - - pane.window.__floating_size__ = wx.Size(*pane.floating_size) - page_index = pane.window.__page_index__ - text_colour = pane.window.__text_colour__ - control = pane.window.__control__ - - root_manager.DetachPane(pane.window) - self.InsertPage(page_index, pane.window, pane.caption, True, pane.icon, control=control) - - self.SetPageTextColour(page_index, text_colour) - self.GetActiveTabCtrl().DoShowHide() - self.DoSizing() - if control: - self.UpdateTabCtrlHeight(force=True) - - self._mgr.Update() - root_manager.Update() - - - def GetTabCtrlFromPoint(self, pt): - """ - Returns the tab control at the specified point. - - :param `pt`: a `wx.Point` object. - """ - - # if we've just removed the last tab from the source - # tab set, the remove the tab control completely - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabframe = pane.window - if tabframe._tab_rect.Contains(pt): - return tabframe._tabs - - return None - - - def GetTabFrameFromTabCtrl(self, tab_ctrl): - """ - Returns the tab frame associated with a tab control. - - :param `tab_ctrl`: an instance of L{AuiTabCtrl}. - """ - - # if we've just removed the last tab from the source - # tab set, the remove the tab control completely - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabframe = pane.window - if tabframe._tabs == tab_ctrl: - return tabframe - - return None - - - def GetTabFrameFromWindow(self, wnd): - """ - Returns the tab frame associated with a window. - - :param `wnd`: an instance of `wx.Window`. - """ - - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - tabframe = pane.window - for page in tabframe._tabs.GetPages(): - if wnd == page.window: - return tabframe - - return None - - - def RemoveEmptyTabFrames(self): - """ Removes all the empty tab frames. """ - - # if we've just removed the last tab from the source - # tab set, the remove the tab control completely - all_panes = self._mgr.GetAllPanes() - - for indx in xrange(len(all_panes)-1, -1, -1): - pane = all_panes[indx] - if pane.name == "dummy": - continue - - tab_frame = pane.window - if tab_frame._tabs.GetPageCount() == 0: - self._mgr.DetachPane(tab_frame) - tab_frame._tabs.Destroy() - tab_frame._tabs = None - del tab_frame - - # check to see if there is still a center pane - # if there isn't, make a frame the center pane - first_good = None - center_found = False - - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - - if pane.dock_direction == AUI_DOCK_CENTRE: - center_found = True - if not first_good: - first_good = pane.window - - if not center_found and first_good: - self._mgr.GetPane(first_good).Centre() - - if not self.IsBeingDeleted(): - self._mgr.Update() - - - def OnChildFocusNotebook(self, event): - """ - Handles the ``wx.EVT_CHILD_FOCUS`` event for L{AuiNotebook}. - - :param `event`: a `wx.ChildFocusEvent` event to be processed. - """ - - # if we're dragging a tab, don't change the current selection. - # This code prevents a bug that used to happen when the hint window - # was hidden. In the bug, the focus would return to the notebook - # child, which would then enter this handler and call - # SetSelection, which is not desired turn tab dragging. - - event.Skip() - - all_panes = self._mgr.GetAllPanes() - for pane in all_panes: - if pane.name == "dummy": - continue - tabframe = pane.window - if tabframe._tabs.IsDragging(): - return - -## # change the tab selection to the child -## # which was focused -## idx = self._tabs.GetIdxFromWindow(event.GetWindow()) -## if idx != -1 and idx != self._curpage: -## self.SetSelection(idx) - - - def SetNavigatorIcon(self, bmp): - """ - Sets the icon used by the L{TabNavigatorWindow}. - - :param `bmp`: an instance of `wx.Bitmap`. - """ - - if isinstance(bmp, wx.Bitmap) and bmp.IsOk(): - # Make sure image is proper size - if bmp.GetSize() != (16, 16): - img = bmp.ConvertToImage() - img.Rescale(16, 16, wx.IMAGE_QUALITY_HIGH) - bmp = wx.BitmapFromImage(img) - self._naviIcon = bmp - else: - raise TypeError, "SetNavigatorIcon requires a valid bitmap" - - - def OnNavigationKeyNotebook(self, event): - """ - Handles the ``wx.EVT_NAVIGATION_KEY`` event for L{AuiNotebook}. - - :param `event`: a `wx.NavigationKeyEvent` event to be processed. - """ - - if event.IsWindowChange(): - if self._agwFlags & AUI_NB_SMART_TABS: - if not self._popupWin: - self._popupWin = TabNavigatorWindow(self, self._naviIcon) - self._popupWin.SetReturnCode(wx.ID_OK) - self._popupWin.ShowModal() - idx = self._popupWin.GetSelectedPage() - self._popupWin.Destroy() - self._popupWin = None - # Need to do CallAfter so that the selection and its - # associated events get processed outside the context of - # this key event. Not doing so causes odd issues with the - # window focus under certain use cases on Windows. - wx.CallAfter(self.SetSelection, idx, True) - else: - # a dialog is already opened - self._popupWin.OnNavigationKey(event) - return - else: - # change pages - # FIXME: the problem with this is that if we have a split notebook, - # we selection may go all over the place. - self.AdvanceSelection(event.GetDirection()) - - else: - # we get this event in 3 cases - # - # a) one of our pages might have generated it because the user TABbed - # out from it in which case we should propagate the event upwards and - # our parent will take care of setting the focus to prev/next sibling - # - # or - # - # b) the parent panel wants to give the focus to us so that we - # forward it to our selected page. We can't deal with this in - # OnSetFocus() because we don't know which direction the focus came - # from in this case and so can't choose between setting the focus to - # first or last panel child - # - # or - # - # c) we ourselves (see MSWTranslateMessage) generated the event - # - parent = self.GetParent() - - # the wxObject* casts are required to avoid MinGW GCC 2.95.3 ICE - isFromParent = event.GetEventObject() == parent - isFromSelf = event.GetEventObject() == self - - if isFromParent or isFromSelf: - - # no, it doesn't come from child, case (b) or (c): forward to a - # page but only if direction is backwards (TAB) or from ourselves, - if self.GetSelection() != wx.NOT_FOUND and (not event.GetDirection() or isFromSelf): - - # so that the page knows that the event comes from it's parent - # and is being propagated downwards - event.SetEventObject(self) - - page = self.GetPage(self.GetSelection()) - if not page.GetEventHandler().ProcessEvent(event): - page.SetFocus() - - #else: page manages focus inside it itself - - else: # otherwise set the focus to the notebook itself - - self.SetFocus() - - else: - - # send this event back for the 'wraparound' focus. - winFocus = event.GetCurrentFocus() - - if winFocus: - event.SetEventObject(self) - winFocus.GetEventHandler().ProcessEvent(event) - - - def OnTabButton(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_BUTTON`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - button_id = event.GetInt() - - if button_id == AUI_BUTTON_CLOSE: - - selection = event.GetSelection() - - if selection == -1: - - # if the close button is to the right, use the active - # page selection to determine which page to close - selection = tabs.GetActivePage() - - if selection == -1 or not tabs.GetEnabled(selection): - return - - if selection != -1: - - close_wnd = tabs.GetWindowFromIdx(selection) - - if close_wnd.GetName() == "__fake__page__": - # This is a notebook preview - previous_active, page_status = close_wnd.__previousStatus - for page, status in zip(tabs.GetPages(), page_status): - page.enabled = status - - main_idx = self._tabs.GetIdxFromWindow(close_wnd) - self.DeletePage(main_idx) - - if previous_active >= 0: - tabs.SetActivePage(previous_active) - page_count = tabs.GetPageCount() - selection = -1 - - for page in xrange(page_count): - # remove the page from the source tabs - page_info = tabs.GetPage(page) - if page_info.active: - selection = page - break - - tabs.DoShowHide() - self.DoSizing() - tabs.Refresh() - - if selection >= 0: - wx.CallAfter(tabs.MakeTabVisible, selection, self) - - # Don't fire the event - return - - # ask owner if it's ok to close the tab - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, self.GetId()) - idx = self._tabs.GetIdxFromWindow(close_wnd) - e.SetSelection(idx) - e.SetOldSelection(event.GetSelection()) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - if not e.IsAllowed(): - return - - if repr(close_wnd.__class__).find("AuiMDIChildFrame") >= 0: - close_wnd.Close() - - else: - main_idx = self._tabs.GetIdxFromWindow(close_wnd) - self.DeletePage(main_idx) - - # notify owner that the tab has been closed - e2 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, self.GetId()) - e2.SetSelection(idx) - e2.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e2) - - if self.GetPageCount() == 0: - mgr = self.GetAuiManager() - win = mgr.GetManagedWindow() - win.SendSizeEvent() - - - def OnTabMiddleDown(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - # patch event through to owner - wnd = tabs.GetWindowFromIdx(event.GetSelection()) - - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, self.GetId()) - e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnTabMiddleUp(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_TAB_MIDDLE_UP`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - # if the AUI_NB_MIDDLE_CLICK_CLOSE is specified, middle - # click should act like a tab close action. However, first - # give the owner an opportunity to handle the middle up event - # for custom action - - wnd = tabs.GetWindowFromIdx(event.GetSelection()) - - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, self.GetId()) - e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) - e.SetEventObject(self) - if self.GetEventHandler().ProcessEvent(e): - return - if not e.IsAllowed(): - return - - # check if we are supposed to close on middle-up - if self._agwFlags & AUI_NB_MIDDLE_CLICK_CLOSE == 0: - return - - # simulate the user pressing the close button on the tab - event.SetInt(AUI_BUTTON_CLOSE) - self.OnTabButton(event) - - - def OnTabRightDown(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_TAB_RIGHT_DOWN`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - # patch event through to owner - wnd = tabs.GetWindowFromIdx(event.GetSelection()) - - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, self.GetId()) - e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def OnTabRightUp(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_TAB_RIGHT_UP`` event for L{AuiNotebook}. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - tabs = event.GetEventObject() - if not tabs.GetEnabled(event.GetSelection()): - return - - # patch event through to owner - wnd = tabs.GetWindowFromIdx(event.GetSelection()) - - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, self.GetId()) - e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) - e.SetEventObject(self) - self.GetEventHandler().ProcessEvent(e) - - - def SetNormalFont(self, font): - """ - Sets the normal font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._normal_font = font - self.GetArtProvider().SetNormalFont(font) - - - def SetSelectedFont(self, font): - """ - Sets the selected tab font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._selected_font = font - self.GetArtProvider().SetSelectedFont(font) - - - def SetMeasuringFont(self, font): - """ - Sets the font for calculating text measurements. - - :param `font`: a `wx.Font` object. - """ - - self.GetArtProvider().SetMeasuringFont(font) - - - def SetFont(self, font): - """ - Sets the tab font. - - :param `font`: a `wx.Font` object. - - :note: Overridden from `wx.PyPanel`. - """ - - wx.PyPanel.SetFont(self, font) - - selectedFont = wx.Font(font.GetPointSize(), font.GetFamily(), - font.GetStyle(), wx.BOLD, font.GetUnderlined(), - font.GetFaceName(), font.GetEncoding()) - - self.SetNormalFont(font) - self.SetSelectedFont(selectedFont) - self.SetMeasuringFont(selectedFont) - - # Recalculate tab container size based on new font - self.UpdateTabCtrlHeight(force=False) - self.DoSizing() - - return True - - - def GetTabCtrlHeight(self): - """ Returns the tab control height. """ - - return self._tab_ctrl_height - - - def GetHeightForPageHeight(self, pageHeight): - """ - Gets the height of the notebook for a given page height. - - :param `pageHeight`: the given page height. - """ - - self.UpdateTabCtrlHeight() - - tabCtrlHeight = self.GetTabCtrlHeight() - decorHeight = 2 - return tabCtrlHeight + pageHeight + decorHeight - - - def AdvanceSelection(self, forward=True, wrap=True): - """ - Cycles through the tabs. - - :param `forward`: whether to advance forward or backward; - :param `wrap`: ``True`` to return to the first tab if we reach the last tab. - - :note: The call to this function generates the page changing events. - """ - - tabCtrl = self.GetActiveTabCtrl() - newPage = -1 - - focusWin = tabCtrl.FindFocus() - activePage = tabCtrl.GetActivePage() - lenPages = len(tabCtrl.GetPages()) - - if lenPages == 1: - return False - - if forward: - if lenPages > 1: - - if activePage == -1 or activePage == lenPages - 1: - if not wrap: - return False - - newPage = 0 - - elif activePage < lenPages - 1: - newPage = activePage + 1 - - else: - - if lenPages > 1: - if activePage == -1 or activePage == 0: - if not wrap: - return False - - newPage = lenPages - 1 - - elif activePage > 0: - newPage = activePage - 1 - - - if newPage != -1: - if not self.GetEnabled(newPage): - return False - - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, tabCtrl.GetId()) - e.SetSelection(newPage) - e.SetOldSelection(activePage) - e.SetEventObject(tabCtrl) - self.GetEventHandler().ProcessEvent(e) - -## if focusWin: -## focusWin.SetFocus() - - return True - - - def ShowWindowMenu(self): - """ - Shows the window menu for the active tab control associated with this - notebook, and returns ``True`` if a selection was made. - """ - - tabCtrl = self.GetActiveTabCtrl() - idx = tabCtrl.GetArtProvider().ShowDropDown(tabCtrl, tabCtrl.GetPages(), tabCtrl.GetActivePage()) - - if not self.GetEnabled(idx): - return False - - if idx != -1: - e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, tabCtrl.GetId()) - e.SetSelection(idx) - e.SetOldSelection(tabCtrl.GetActivePage()) - e.SetEventObject(tabCtrl) - self.GetEventHandler().ProcessEvent(e) - - return True - - else: - - return False - - - def AddTabAreaButton(self, id, location, normal_bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap): - """ - Adds a button in the tab area. - - :param `id`: the button identifier. This can be one of the following: - - ============================== ================================= - Button Identifier Description - ============================== ================================= - ``AUI_BUTTON_CLOSE`` Shows a close button on the tab area - ``AUI_BUTTON_WINDOWLIST`` Shows a window list button on the tab area - ``AUI_BUTTON_LEFT`` Shows a left button on the tab area - ``AUI_BUTTON_RIGHT`` Shows a right button on the tab area - ============================== ================================= - - :param `location`: the button location. Can be ``wx.LEFT`` or ``wx.RIGHT``; - :param `normal_bitmap`: the bitmap for an enabled tab; - :param `disabled_bitmap`: the bitmap for a disabled tab. - """ - - active_tabctrl = self.GetActiveTabCtrl() - active_tabctrl.AddButton(id, location, normal_bitmap, disabled_bitmap) - - - def RemoveTabAreaButton(self, id): - """ - Removes a button from the tab area. - - :param `id`: the button identifier. See L{AddTabAreaButton} for a list of button identifiers. - - :see: L{AddTabAreaButton} - """ - - active_tabctrl = self.GetActiveTabCtrl() - active_tabctrl.RemoveButton(id) - - - def HasMultiplePages(self): - """ - This method should be overridden to return ``True`` if this window has multiple pages. All - standard class with multiple pages such as `wx.Notebook`, `wx.Listbook` and `wx.Treebook` - already override it to return ``True`` and user-defined classes with similar behaviour - should do it as well to allow the library to handle such windows appropriately. - - :note: Overridden from `wx.PyPanel`. - """ - - return True - - - def GetDefaultBorder(self): - """ Returns the default border style for L{AuiNotebook}. """ - - return wx.BORDER_NONE - - - def NotebookPreview(self, thumbnail_size=200): - """ - Generates a preview of all the pages in the notebook (MSW and GTK only). - - :param `thumbnail_size`: the maximum size of every page thumbnail. - - :note: this functionality is currently unavailable on wxMac. - """ - - if wx.Platform == "__WXMAC__": - return False - - tabCtrl = self.GetActiveTabCtrl() - activePage = tabCtrl.GetActivePage() - pages = tabCtrl.GetPages() - - pageStatus, pageText = [], [] - - for indx, page in enumerate(pages): - - pageStatus.append(page.enabled) - - if not page.enabled: - continue - - self.SetSelectionToPage(page) - pageText.append(page.caption) - - rect = page.window.GetScreenRect() - bmp = RescaleScreenShot(TakeScreenShot(rect), thumbnail_size) - - page.enabled = False - if indx == 0: - il = wx.ImageList(bmp.GetWidth(), bmp.GetHeight(), True) - - il.Add(bmp) - - # create the list control - listCtrl = wx.ListCtrl(self, style=wx.LC_ICON|wx.LC_AUTOARRANGE|wx.LC_HRULES|wx.LC_VRULES, - name="__fake__page__") - - # assign the image list to it - listCtrl.AssignImageList(il, wx.IMAGE_LIST_NORMAL) - listCtrl.__previousStatus = [activePage, pageStatus] - - # create some items for the list - for indx, text in enumerate(pageText): - listCtrl.InsertImageStringItem(10000, text, indx) - - self.AddPage(listCtrl, "AuiNotebook Preview", True, bitmap=auinotebook_preview.GetBitmap(), disabled_bitmap=wx.NullBitmap) - return True - - - def SetRenamable(self, page_idx, renamable): - """ - Sets whether a tab can be renamed via a left double-click or not. - - :param `page_idx`: the page index; - :param `renamable`: ``True`` if the page can be renamed. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - # update our own tab catalog - page_info = self._tabs.GetPage(page_idx) - page_info.renamable = renamable - - # update what's on screen - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - info = ctrl.GetPage(ctrl_idx) - info.renamable = page_info.renamable - - return True - - - def IsRenamable(self, page_idx): - """ - Returns whether a tab can be renamed or not. - - :param `page_idx`: the page index. - - :returns: ``True`` is a page can be renamed, ``False`` otherwise. - """ - - if page_idx >= self._tabs.GetPageCount(): - return False - - page_info = self._tabs.GetPage(page_idx) - return page_info.renamable - - - def OnRenameCancelled(self, page_index): - """ - Called by L{TabTextCtrl}, to cancel the changes and to send the - `EVT_AUINOTEBOOK_END_LABEL_EDIT` event. - - :param `page_index`: the page index in the notebook. - """ - - # let owner know that the edit was cancelled - evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT, self.GetId()) - - evt.SetSelection(page_index) - evt.SetEventObject(self) - evt.SetLabel("") - evt.SetEditCanceled(True) - self.GetEventHandler().ProcessEvent(evt) - - - def OnRenameAccept(self, page_index, value): - """ - Called by L{TabTextCtrl}, to accept the changes and to send the - `EVT_AUINOTEBOOK_END_LABEL_EDIT` event. - - :param `page_index`: the page index in the notebook; - :param `value`: the new label for the tab. - """ - - evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT, self.GetId()) - evt.SetSelection(page_index) - evt.SetEventObject(self) - evt.SetLabel(value) - evt.SetEditCanceled(False) - - return not self.GetEventHandler().ProcessEvent(evt) or evt.IsAllowed() - - - def ResetTextControl(self): - """ Called by L{TabTextCtrl} when it marks itself for deletion. """ - - if not self._textCtrl: - return - - self._textCtrl.Destroy() - self._textCtrl = None - - # tab height might have changed - self.UpdateTabCtrlHeight(force=True) - - - def EditTab(self, page_index): - """ - Starts the editing of an item label, sending a `EVT_AUINOTEBOOK_BEGIN_LABEL_EDIT` event. - - :param `page_index`: the page index we want to edit. - """ - - if page_index >= self._tabs.GetPageCount(): - return False - - if not self.IsRenamable(page_index): - return False - - page_info = self._tabs.GetPage(page_index) - ctrl, ctrl_idx = self.FindTab(page_info.window) - if not ctrl: - return False - - evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_LABEL_EDIT, self.GetId()) - evt.SetSelection(page_index) - evt.SetEventObject(self) - if self.GetEventHandler().ProcessEvent(evt) and not evt.IsAllowed(): - # vetoed by user - return False - - if self._textCtrl is not None and page_info != self._textCtrl.item(): - self._textCtrl.StopEditing() - - self._textCtrl = TabTextCtrl(ctrl, page_info, page_index) - self._textCtrl.SetFocus() - - return True diff --git a/aui/dockart.py b/aui/dockart.py deleted file mode 100644 index 17da477..0000000 --- a/aui/dockart.py +++ /dev/null @@ -1,1162 +0,0 @@ -""" -Dock art provider code - a dock provider provides all drawing functionality to -the AUI dock manager. This allows the dock manager to have a plugable look-and-feel. - -By default, a L{AuiManager} uses an instance of this class called L{AuiDefaultDockArt} -which provides bitmap art and a colour scheme that is adapted to the major platforms' -look. You can either derive from that class to alter its behaviour or write a -completely new dock art class. Call L{AuiManager.SetArtProvider} to make use this -new dock art. -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx -import types - -from aui_utilities import BitmapFromBits, StepColour, ChopText, GetBaseColour -from aui_utilities import DrawGradientRectangle, DrawMACCloseButton -from aui_utilities import DarkenBitmap, LightContrastColour -from aui_constants import * - -optionActive = 2**14 - -_ctypes = False - -# Try to import winxptheme for ModernDockArt -if wx.Platform == "__WXMSW__": - try: - import ctypes - import winxptheme - _ctypes = True - except ImportError: - pass - -# -- AuiDefaultDockArt class implementation -- - -class AuiDefaultDockArt(object): - """ - Dock art provider code - a dock provider provides all drawing functionality - to the AUI dock manager. This allows the dock manager to have a plugable - look-and-feel. - - By default, a L{AuiManager} uses an instance of this class called L{AuiDefaultDockArt} - which provides bitmap art and a colour scheme that is adapted to the major - platforms' look. You can either derive from that class to alter its behaviour or - write a completely new dock art class. - - Call L{AuiManager.SetArtProvider} to make use this new dock art. - - - **Metric Ordinals** - - These are the possible pane dock art settings for L{AuiManager}: - - ================================================ ====================================== - Metric Ordinal Constant Description - ================================================ ====================================== - ``AUI_DOCKART_SASH_SIZE`` Customizes the sash size - ``AUI_DOCKART_CAPTION_SIZE`` Customizes the caption size - ``AUI_DOCKART_GRIPPER_SIZE`` Customizes the gripper size - ``AUI_DOCKART_PANE_BORDER_SIZE`` Customizes the pane border size - ``AUI_DOCKART_PANE_BUTTON_SIZE`` Customizes the pane button size - ``AUI_DOCKART_BACKGROUND_COLOUR`` Customizes the background colour - ``AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR`` Customizes the background gradient colour - ``AUI_DOCKART_SASH_COLOUR`` Customizes the sash colour - ``AUI_DOCKART_ACTIVE_CAPTION_COLOUR`` Customizes the active caption colour - ``AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR`` Customizes the active caption gradient colour - ``AUI_DOCKART_INACTIVE_CAPTION_COLOUR`` Customizes the inactive caption colour - ``AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR`` Customizes the inactive gradient caption colour - ``AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR`` Customizes the active caption text colour - ``AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR`` Customizes the inactive caption text colour - ``AUI_DOCKART_BORDER_COLOUR`` Customizes the border colour - ``AUI_DOCKART_GRIPPER_COLOUR`` Customizes the gripper colour - ``AUI_DOCKART_CAPTION_FONT`` Customizes the caption font - ``AUI_DOCKART_GRADIENT_TYPE`` Customizes the gradient type (no gradient, vertical or horizontal) - ``AUI_DOCKART_DRAW_SASH_GRIP`` Draw a sash grip on the sash - ================================================ ====================================== - - - **Gradient Types** - - These are the possible gradient dock art settings for L{AuiManager}: - - ============================================ ====================================== - Gradient Constant Description - ============================================ ====================================== - ``AUI_GRADIENT_NONE`` No gradient on the captions - ``AUI_GRADIENT_VERTICAL`` Vertical gradient on the captions - ``AUI_GRADIENT_HORIZONTAL`` Horizontal gradient on the captions - ============================================ ====================================== - - - **Button States** - - These are the possible pane button / L{AuiNotebook} button / L{AuiToolBar} button states: - - ============================================ ====================================== - Button State Constant Description - ============================================ ====================================== - ``AUI_BUTTON_STATE_NORMAL`` Normal button state - ``AUI_BUTTON_STATE_HOVER`` Hovered button state - ``AUI_BUTTON_STATE_PRESSED`` Pressed button state - ``AUI_BUTTON_STATE_DISABLED`` Disabled button state - ``AUI_BUTTON_STATE_HIDDEN`` Hidden button state - ``AUI_BUTTON_STATE_CHECKED`` Checked button state - ============================================ ====================================== - - - **Button Identifiers** - - These are the possible pane button / L{AuiNotebook} button / L{AuiToolBar} button identifiers: - - ============================================ ====================================== - Button Identifier Description - ============================================ ====================================== - ``AUI_BUTTON_CLOSE`` Shows a close button on the pane - ``AUI_BUTTON_MAXIMIZE_RESTORE`` Shows a maximize/restore button on the pane - ``AUI_BUTTON_MINIMIZE`` Shows a minimize button on the pane - ``AUI_BUTTON_PIN`` Shows a pin button on the pane - ``AUI_BUTTON_OPTIONS`` Shows an option button on the pane (not implemented) - ``AUI_BUTTON_WINDOWLIST`` Shows a window list button on the pane (for L{AuiNotebook}) - ``AUI_BUTTON_LEFT`` Shows a left button on the pane (for L{AuiNotebook}) - ``AUI_BUTTON_RIGHT`` Shows a right button on the pane (for L{AuiNotebook}) - ``AUI_BUTTON_UP`` Shows an up button on the pane (not implemented) - ``AUI_BUTTON_DOWN`` Shows a down button on the pane (not implemented) - ``AUI_BUTTON_CUSTOM1`` Shows a custom button on the pane (not implemented) - ``AUI_BUTTON_CUSTOM2`` Shows a custom button on the pane (not implemented) - ``AUI_BUTTON_CUSTOM3`` Shows a custom button on the pane (not implemented) - ============================================ ====================================== - - """ - - def __init__(self): - """ Default class constructor. """ - - self.Init() - - isMac = wx.Platform == "__WXMAC__" - - if isMac: - self._caption_font = wx.SMALL_FONT - else: - self._caption_font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False) - - self.SetDefaultPaneBitmaps(isMac) - self._restore_bitmap = wx.BitmapFromXPMData(restore_xpm) - - # default metric values - self._sash_size = 4 - - if isMac: - # This really should be implemented in wx.SystemSettings - # There is no way to do this that I am aware outside of using - # the cocoa python bindings. 8 pixels looks correct on my system - # so hard coding it for now. - - # How do I translate this?!? Not sure of the below implementation... - # SInt32 height; - # GetThemeMetric( kThemeMetricSmallPaneSplitterHeight , &height ); - # self._sash_size = height; - - self._sash_size = 8 # Carbon.Appearance.kThemeMetricPaneSplitterHeight - - elif wx.Platform == "__WXGTK__": - self._sash_size = wx.RendererNative.Get().GetSplitterParams(wx.GetTopLevelWindows()[0]).widthSash - - else: - self._sash_size = 4 - - self._caption_size = 19 - self._border_size = 1 - self._button_size = 14 - self._gripper_size = 9 - self._gradient_type = AUI_GRADIENT_VERTICAL - self._draw_sash = False - - - def Init(self): - """ Initializes the dock art. """ - - base_colour = GetBaseColour() - darker1_colour = StepColour(base_colour, 85) - darker2_colour = StepColour(base_colour, 75) - darker3_colour = StepColour(base_colour, 60) - darker4_colour = StepColour(base_colour, 40) - - self._background_colour = base_colour - self._background_gradient_colour = StepColour(base_colour, 180) - - isMac = wx.Platform == "__WXMAC__" - - if isMac: - self._active_caption_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) - else: - self._active_caption_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION) - - self._active_caption_gradient_colour = LightContrastColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)) - self._active_caption_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT) - self._inactive_caption_colour = darker1_colour - self._inactive_caption_gradient_colour = StepColour(base_colour, 97) - self._inactive_caption_text_colour = wx.BLACK - - self._sash_brush = wx.Brush(base_colour) - self._background_brush = wx.Brush(base_colour) - self._border_pen = wx.Pen(darker2_colour) - self._gripper_brush = wx.Brush(base_colour) - self._gripper_pen1 = wx.Pen(darker4_colour) - self._gripper_pen2 = wx.Pen(darker3_colour) - self._gripper_pen3 = wx.WHITE_PEN - - - def GetMetric(self, id): - """ - Gets the value of a certain setting. - - :param `id`: can be one of the size values in `Metric Ordinals`. - """ - - - if id == AUI_DOCKART_SASH_SIZE: - return self._sash_size - elif id == AUI_DOCKART_CAPTION_SIZE: - return self._caption_size - elif id == AUI_DOCKART_GRIPPER_SIZE: - return self._gripper_size - elif id == AUI_DOCKART_PANE_BORDER_SIZE: - return self._border_size - elif id == AUI_DOCKART_PANE_BUTTON_SIZE: - return self._button_size - elif id == AUI_DOCKART_GRADIENT_TYPE: - return self._gradient_type - elif id == AUI_DOCKART_DRAW_SASH_GRIP: - return self._draw_sash - else: - raise Exception("Invalid Metric Ordinal.") - - - def SetMetric(self, id, new_val): - """ - Sets the value of a certain setting using `new_val` - - :param `id`: can be one of the size values in `Metric Ordinals`; - :param `new_val`: the new value of the setting. - """ - - if id == AUI_DOCKART_SASH_SIZE: - self._sash_size = new_val - elif id == AUI_DOCKART_CAPTION_SIZE: - self._caption_size = new_val - elif id == AUI_DOCKART_GRIPPER_SIZE: - self._gripper_size = new_val - elif id == AUI_DOCKART_PANE_BORDER_SIZE: - self._border_size = new_val - elif id == AUI_DOCKART_PANE_BUTTON_SIZE: - self._button_size = new_val - elif id == AUI_DOCKART_GRADIENT_TYPE: - self._gradient_type = new_val - elif id == AUI_DOCKART_DRAW_SASH_GRIP: - self._draw_sash = new_val - else: - raise Exception("Invalid Metric Ordinal.") - - - def GetColor(self, id): - """ - Gets the colour of a certain setting. - - :param `id`: can be one of the colour values in `Metric Ordinals`. - """ - - if id == AUI_DOCKART_BACKGROUND_COLOUR: - return self._background_brush.GetColour() - elif id == AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR: - return self._background_gradient_colour - elif id == AUI_DOCKART_SASH_COLOUR: - return self._sash_brush.GetColour() - elif id == AUI_DOCKART_INACTIVE_CAPTION_COLOUR: - return self._inactive_caption_colour - elif id == AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR: - return self._inactive_caption_gradient_colour - elif id == AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR: - return self._inactive_caption_text_colour - elif id == AUI_DOCKART_ACTIVE_CAPTION_COLOUR: - return self._active_caption_colour - elif id == AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR: - return self._active_caption_gradient_colour - elif id == AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR: - return self._active_caption_text_colour - elif id == AUI_DOCKART_BORDER_COLOUR: - return self._border_pen.GetColour() - elif id == AUI_DOCKART_GRIPPER_COLOUR: - return self._gripper_brush.GetColour() - else: - raise Exception("Invalid Colour Ordinal.") - - - def SetColor(self, id, colour): - """ - Sets the colour of a certain setting. - - :param `id`: can be one of the colour values in `Metric Ordinals`; - :param `colour`: the new value of the setting. - """ - - if isinstance(colour, basestring): - colour = wx.NamedColour(colour) - elif isinstance(colour, types.TupleType): - colour = wx.Colour(*colour) - elif isinstance(colour, types.IntType): - colour = wx.ColourRGB(colour) - - if id == AUI_DOCKART_BACKGROUND_COLOUR: - self._background_brush.SetColour(colour) - elif id == AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR: - self._background_gradient_colour = colour - elif id == AUI_DOCKART_SASH_COLOUR: - self._sash_brush.SetColour(colour) - elif id == AUI_DOCKART_INACTIVE_CAPTION_COLOUR: - self._inactive_caption_colour = colour - if not self._custom_pane_bitmaps and wx.Platform == "__WXMAC__": - # No custom bitmaps for the pane close button - # Change the MAC close bitmap colour - self._inactive_close_bitmap = DrawMACCloseButton(wx.WHITE, colour) - - elif id == AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR: - self._inactive_caption_gradient_colour = colour - elif id == AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR: - self._inactive_caption_text_colour = colour - elif id == AUI_DOCKART_ACTIVE_CAPTION_COLOUR: - self._active_caption_colour = colour - if not self._custom_pane_bitmaps and wx.Platform == "__WXMAC__": - # No custom bitmaps for the pane close button - # Change the MAC close bitmap colour - self._active_close_bitmap = DrawMACCloseButton(wx.WHITE, colour) - - elif id == AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR: - self._active_caption_gradient_colour = colour - elif id == AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR: - self._active_caption_text_colour = colour - elif id == AUI_DOCKART_BORDER_COLOUR: - self._border_pen.SetColour(colour) - elif id == AUI_DOCKART_GRIPPER_COLOUR: - self._gripper_brush.SetColour(colour) - self._gripper_pen1.SetColour(StepColour(colour, 40)) - self._gripper_pen2.SetColour(StepColour(colour, 60)) - else: - raise Exception("Invalid Colour Ordinal.") - - - GetColour = GetColor - SetColour = SetColor - - def SetFont(self, id, font): - """ - Sets a font setting. - - :param `id`: must be ``AUI_DOCKART_CAPTION_FONT``; - :param `font`: an instance of `wx.Font`. - """ - - if id == AUI_DOCKART_CAPTION_FONT: - self._caption_font = font - - - def GetFont(self, id): - """ - Gets a font setting. - - :param `id`: must be ``AUI_DOCKART_CAPTION_FONT``, otherwise `wx.NullFont` is returned. - """ - - if id == AUI_DOCKART_CAPTION_FONT: - return self._caption_font - - return wx.NullFont - - - def DrawSash(self, dc, window, orient, rect): - """ - Draws a sash between two windows. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `orient`: the sash orientation; - :param `rect`: the sash rectangle. - """ - - # AG: How do we make this work?!? - # RendererNative does not use the sash_brush chosen by the user - # and the rect.GetSize() is ignored as the sash is always drawn - # 3 pixel wide - # wx.RendererNative.Get().DrawSplitterSash(window, dc, rect.GetSize(), pos, orient) - - dc.SetPen(wx.TRANSPARENT_PEN) - dc.SetBrush(self._sash_brush) - dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) - - draw_sash = self.GetMetric(AUI_DOCKART_DRAW_SASH_GRIP) - if draw_sash: - self.DrawSashGripper(dc, orient, rect) - - - def DrawBackground(self, dc, window, orient, rect): - """ - Draws a background. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `orient`: the gradient (if any) orientation; - :param `rect`: the background rectangle. - """ - - dc.SetPen(wx.TRANSPARENT_PEN) - if wx.Platform == "__WXMAC__": - # we have to clear first, otherwise we are drawing a light striped pattern - # over an already darker striped background - dc.SetBrush(wx.WHITE_BRUSH) - dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) - - DrawGradientRectangle(dc, rect, self._background_brush.GetColour(), - self._background_gradient_colour, - AUI_GRADIENT_HORIZONTAL, rect.x, 700) - - - def DrawBorder(self, dc, window, rect, pane): - """ - Draws the pane border. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `rect`: the border rectangle; - :param `pane`: the pane for which the border is drawn. - """ - - drect = wx.Rect(*rect) - - dc.SetPen(self._border_pen) - dc.SetBrush(wx.TRANSPARENT_BRUSH) - - border_width = self.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) - - if pane.IsToolbar(): - - for ii in xrange(0, border_width): - - dc.SetPen(wx.WHITE_PEN) - dc.DrawLine(drect.x, drect.y, drect.x+drect.width, drect.y) - dc.DrawLine(drect.x, drect.y, drect.x, drect.y+drect.height) - dc.SetPen(self._border_pen) - dc.DrawLine(drect.x, drect.y+drect.height-1, - drect.x+drect.width, drect.y+drect.height-1) - dc.DrawLine(drect.x+drect.width-1, drect.y, - drect.x+drect.width-1, drect.y+drect.height) - drect.Deflate(1, 1) - - else: - - for ii in xrange(0, border_width): - - dc.DrawRectangle(drect.x, drect.y, drect.width, drect.height) - drect.Deflate(1, 1) - - - def DrawCaptionBackground(self, dc, rect, pane): - """ - Draws the text caption background in the pane. - - :param `dc`: a `wx.DC` device context; - :param `rect`: the text caption rectangle; - :param `pane`: the pane for which the text background is drawn. - """ - - active = pane.state & optionActive - - if self._gradient_type == AUI_GRADIENT_NONE: - if active: - dc.SetBrush(wx.Brush(self._active_caption_colour)) - else: - dc.SetBrush(wx.Brush(self._inactive_caption_colour)) - - dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) - - else: - - switch_gradient = pane.HasCaptionLeft() - gradient_type = self._gradient_type - if switch_gradient: - gradient_type = (self._gradient_type == AUI_GRADIENT_HORIZONTAL and [AUI_GRADIENT_VERTICAL] or \ - [AUI_GRADIENT_HORIZONTAL])[0] - - if active: - if wx.Platform == "__WXMAC__": - DrawGradientRectangle(dc, rect, self._active_caption_colour, - self._active_caption_gradient_colour, - gradient_type) - else: - DrawGradientRectangle(dc, rect, self._active_caption_gradient_colour, - self._active_caption_colour, - gradient_type) - else: - if wx.Platform == "__WXMAC__": - DrawGradientRectangle(dc, rect, self._inactive_caption_gradient_colour, - self._inactive_caption_colour, - gradient_type) - else: - DrawGradientRectangle(dc, rect, self._inactive_caption_colour, - self._inactive_caption_gradient_colour, - gradient_type) - - - def DrawIcon(self, dc, rect, pane): - """ - Draws the icon in the pane caption area. - - :param `dc`: a `wx.DC` device context; - :param `rect`: the pane caption rectangle; - :param `pane`: the pane for which the icon is drawn. - """ - - # Draw the icon centered vertically - if pane.icon.Ok(): - if pane.HasCaptionLeft(): - bmp = wx.ImageFromBitmap(pane.icon).Rotate90(clockwise=False) - dc.DrawBitmap(bmp.ConvertToBitmap(), rect.x+(rect.width-pane.icon.GetWidth())/2, rect.y+rect.height-2-pane.icon.GetHeight(), True) - else: - dc.DrawBitmap(pane.icon, rect.x+2, rect.y+(rect.height-pane.icon.GetHeight())/2, True) - - - def DrawCaption(self, dc, window, text, rect, pane): - """ - Draws the text in the pane caption. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `text`: the text to be displayed; - :param `rect`: the pane caption rectangle; - :param `pane`: the pane for which the text is drawn. - """ - - dc.SetPen(wx.TRANSPARENT_PEN) - dc.SetFont(self._caption_font) - - self.DrawCaptionBackground(dc, rect, pane) - - if pane.state & optionActive: - dc.SetTextForeground(self._active_caption_text_colour) - else: - dc.SetTextForeground(self._inactive_caption_text_colour) - - w, h = dc.GetTextExtent("ABCDEFHXfgkj") - - clip_rect = wx.Rect(*rect) - btns = pane.CountButtons() - - captionLeft = pane.HasCaptionLeft() - variable = (captionLeft and [rect.height] or [rect.width])[0] - - variable -= 3 # text offset - variable -= 2 # button padding - - caption_offset = 0 - if pane.icon: - if captionLeft: - caption_offset += pane.icon.GetHeight() + 3 - else: - caption_offset += pane.icon.GetWidth() + 3 - - self.DrawIcon(dc, rect, pane) - - variable -= caption_offset - variable -= btns*(self._button_size + self._border_size) - draw_text = ChopText(dc, text, variable) - - if captionLeft: - dc.DrawRotatedText(draw_text, rect.x+(rect.width/2)-(h/2)-1, rect.y+rect.height-3-caption_offset, 90) - else: - dc.DrawText(draw_text, rect.x+3+caption_offset, rect.y+(rect.height/2)-(h/2)-1) - - - def RequestUserAttention(self, dc, window, text, rect, pane): - """ - Requests the user attention by intermittently highlighting the pane caption. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `text`: the text to be displayed; - :param `rect`: the pane caption rectangle; - :param `pane`: the pane for which the text is drawn. - """ - - state = pane.state - pane.state &= ~optionActive - - for indx in xrange(6): - active = (indx%2 == 0 and [True] or [False])[0] - if active: - pane.state |= optionActive - else: - pane.state &= ~optionActive - - self.DrawCaptionBackground(dc, rect, pane) - self.DrawCaption(dc, window, text, rect, pane) - wx.SafeYield() - wx.MilliSleep(350) - - pane.state = state - - - def DrawGripper(self, dc, window, rect, pane): - """ - Draws a gripper on the pane. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `rect`: the pane caption rectangle; - :param `pane`: the pane for which the gripper is drawn. - """ - - dc.SetPen(wx.TRANSPARENT_PEN) - dc.SetBrush(self._gripper_brush) - - dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) - - if not pane.HasGripperTop(): - y = 4 - while 1: - dc.SetPen(self._gripper_pen1) - dc.DrawPoint(rect.x+3, rect.y+y) - dc.SetPen(self._gripper_pen2) - dc.DrawPoint(rect.x+3, rect.y+y+1) - dc.DrawPoint(rect.x+4, rect.y+y) - dc.SetPen(self._gripper_pen3) - dc.DrawPoint(rect.x+5, rect.y+y+1) - dc.DrawPoint(rect.x+5, rect.y+y+2) - dc.DrawPoint(rect.x+4, rect.y+y+2) - y = y + 4 - if y > rect.GetHeight() - 4: - break - else: - x = 4 - while 1: - dc.SetPen(self._gripper_pen1) - dc.DrawPoint(rect.x+x, rect.y+3) - dc.SetPen(self._gripper_pen2) - dc.DrawPoint(rect.x+x+1, rect.y+3) - dc.DrawPoint(rect.x+x, rect.y+4) - dc.SetPen(self._gripper_pen3) - dc.DrawPoint(rect.x+x+1, rect.y+5) - dc.DrawPoint(rect.x+x+2, rect.y+5) - dc.DrawPoint(rect.x+x+2, rect.y+4) - x = x + 4 - if x > rect.GetWidth() - 4: - break - - - def DrawPaneButton(self, dc, window, button, button_state, _rect, pane): - """ - Draws a pane button in the pane caption area. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `button`: the button to be drawn; - :param `button_state`: the pane button state; - :param `_rect`: the pane caption rectangle; - :param `pane`: the pane for which the button is drawn. - """ - - if not pane: - return - - if button == AUI_BUTTON_CLOSE: - if pane.state & optionActive: - bmp = self._active_close_bitmap - else: - bmp = self._inactive_close_bitmap - - elif button == AUI_BUTTON_PIN: - if pane.state & optionActive: - bmp = self._active_pin_bitmap - else: - bmp = self._inactive_pin_bitmap - - elif button == AUI_BUTTON_MAXIMIZE_RESTORE: - if pane.IsMaximized(): - if pane.state & optionActive: - bmp = self._active_restore_bitmap - else: - bmp = self._inactive_restore_bitmap - else: - if pane.state & optionActive: - bmp = self._active_maximize_bitmap - else: - bmp = self._inactive_maximize_bitmap - - elif button == AUI_BUTTON_MINIMIZE: - if pane.state & optionActive: - bmp = self._active_minimize_bitmap - else: - bmp = self._inactive_minimize_bitmap - - isVertical = pane.HasCaptionLeft() - - rect = wx.Rect(*_rect) - - if isVertical: - old_x = rect.x - rect.x = rect.x + (rect.width/2) - (bmp.GetWidth()/2) - rect.width = old_x + rect.width - rect.x - 1 - else: - old_y = rect.y - rect.y = rect.y + (rect.height/2) - (bmp.GetHeight()/2) - rect.height = old_y + rect.height - rect.y - 1 - - if button_state == AUI_BUTTON_STATE_PRESSED: - rect.x += 1 - rect.y += 1 - - if button_state in [AUI_BUTTON_STATE_HOVER, AUI_BUTTON_STATE_PRESSED]: - - if pane.state & optionActive: - - dc.SetBrush(wx.Brush(StepColour(self._active_caption_colour, 120))) - dc.SetPen(wx.Pen(StepColour(self._active_caption_colour, 70))) - - else: - - dc.SetBrush(wx.Brush(StepColour(self._inactive_caption_colour, 120))) - dc.SetPen(wx.Pen(StepColour(self._inactive_caption_colour, 70))) - - if wx.Platform != "__WXMAC__": - # draw the background behind the button - dc.DrawRectangle(rect.x, rect.y, 15, 15) - else: - # Darker the bitmap a bit - bmp = DarkenBitmap(bmp, self._active_caption_colour, StepColour(self._active_caption_colour, 110)) - - if isVertical: - bmp = wx.ImageFromBitmap(bmp).Rotate90(clockwise=False).ConvertToBitmap() - - # draw the button itself - dc.DrawBitmap(bmp, rect.x, rect.y, True) - - - def DrawSashGripper(self, dc, orient, rect): - """ - Draws a sash gripper on a sash between two windows. - - :param `dc`: a `wx.DC` device context; - :param `orient`: the sash orientation; - :param `rect`: the sash rectangle. - """ - - dc.SetBrush(self._gripper_brush) - - if orient == wx.HORIZONTAL: # horizontal sash - - x = rect.x + int((1.0/4.0)*rect.width) - xend = rect.x + int((3.0/4.0)*rect.width) - y = rect.y + (rect.height/2) - 1 - - while 1: - dc.SetPen(self._gripper_pen3) - dc.DrawRectangle(x, y, 2, 2) - dc.SetPen(self._gripper_pen2) - dc.DrawPoint(x+1, y+1) - x = x + 5 - - if x >= xend: - break - - else: - - y = rect.y + int((1.0/4.0)*rect.height) - yend = rect.y + int((3.0/4.0)*rect.height) - x = rect.x + (rect.width/2) - 1 - - while 1: - dc.SetPen(self._gripper_pen3) - dc.DrawRectangle(x, y, 2, 2) - dc.SetPen(self._gripper_pen2) - dc.DrawPoint(x+1, y+1) - y = y + 5 - - if y >= yend: - break - - - def SetDefaultPaneBitmaps(self, isMac): - """ - Assigns the default pane bitmaps. - - :param `isMac`: whether we are on wxMAC or not. - """ - - if isMac: - self._inactive_close_bitmap = DrawMACCloseButton(wx.WHITE, self._inactive_caption_colour) - self._active_close_bitmap = DrawMACCloseButton(wx.WHITE, self._active_caption_colour) - else: - self._inactive_close_bitmap = BitmapFromBits(close_bits, 16, 16, self._inactive_caption_text_colour) - self._active_close_bitmap = BitmapFromBits(close_bits, 16, 16, self._active_caption_text_colour) - - if isMac: - self._inactive_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, wx.WHITE) - self._active_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, wx.WHITE) - else: - self._inactive_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, self._inactive_caption_text_colour) - self._active_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, self._active_caption_text_colour) - - if isMac: - self._inactive_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, wx.WHITE) - self._active_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, wx.WHITE) - else: - self._inactive_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, self._inactive_caption_text_colour) - self._active_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, self._active_caption_text_colour) - - if isMac: - self._inactive_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, wx.WHITE) - self._active_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, wx.WHITE) - else: - self._inactive_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, self._inactive_caption_text_colour) - self._active_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, self._active_caption_text_colour) - - self._inactive_pin_bitmap = BitmapFromBits(pin_bits, 16, 16, self._inactive_caption_text_colour) - self._active_pin_bitmap = BitmapFromBits(pin_bits, 16, 16, self._active_caption_text_colour) - - self._custom_pane_bitmaps = False - - - def SetCustomPaneBitmap(self, bmp, button, active, maximize=False): - """ - Sets a custom button bitmap for the pane button. - - :param `bmp`: the actual bitmap to set; - :param `button`: the button identifier; - :param `active`: whether it is the bitmap for the active button or not; - :param `maximize`: used to distinguish between the maximize and restore bitmaps. - """ - - if bmp.GetWidth() > 16 or bmp.GetHeight() > 16: - raise Exception("The input bitmap is too big") - - if button == AUI_BUTTON_CLOSE: - if active: - self._active_close_bitmap = bmp - else: - self._inactive_close_bitmap = bmp - - if wx.Platform == "__WXMAC__": - self._custom_pane_bitmaps = True - - elif button == AUI_BUTTON_PIN: - if active: - self._active_pin_bitmap = bmp - else: - self._inactive_pin_bitmap = bmp - - elif button == AUI_BUTTON_MAXIMIZE_RESTORE: - if maximize: - if active: - self._active_maximize_bitmap = bmp - else: - self._inactive_maximize_bitmap = bmp - else: - if active: - self._active_restore_bitmap = bmp - else: - self._inactive_restore_bitmap = bmp - - elif button == AUI_BUTTON_MINIMIZE: - if active: - self._active_minimize_bitmap = bmp - else: - self._inactive_minimize_bitmap = bmp - - -if _ctypes: - class RECT(ctypes.Structure): - """ Used to handle L{ModernDockArt} on Windows XP/Vista/7. """ - _fields_ = [('left', ctypes.c_ulong),('top', ctypes.c_ulong),('right', ctypes.c_ulong),('bottom', ctypes.c_ulong)] - - def dump(self): - """ Dumps `self` as a `wx.Rect`. """ - return map(int, (self.left, self.top, self.right, self.bottom)) - - - class SIZE(ctypes.Structure): - """ Used to handle L{ModernDockArt} on Windows XP/Vista/7. """ - _fields_ = [('x', ctypes.c_long),('y', ctypes.c_long)] - - -class ModernDockArt(AuiDefaultDockArt): - """ - ModernDockArt is a custom `AuiDockArt` class, that implements a look similar to - Firefox and other recents applications. - - Is uses the `winxptheme` module and XP themes whenever possible, so it should - look good even if the user has a custom theme. - - :note: This dock art is Windows only and will only work if you have installed - Mark Hammond's `pywin32` module (http://sourceforge.net/projects/pywin32/). - """ - - def __init__(self, win): - """ - Default class constructor. - - :param `win`: the window managed by L{AuiManager}. - """ - - AuiDefaultDockArt.__init__(self) - - self.win = win - - # Get the size of a small close button (themed) - hwnd = self.win.GetHandle() - - self.hTheme1 = winxptheme.OpenThemeData(hwnd, "Window") - - self.usingTheme = True - - if not self.hTheme1: - self.usingTheme = False - - self._button_size = 13 - - self._button_border_size = 3 - self._caption_text_indent = 6 - self._caption_size = 22 - - # We only highlight the active pane with the caption text being in bold. - # So we do not want a special colour for active elements. - self._active_close_bitmap = self._inactive_close_bitmap - - self.Init() - - - def Init(self): - """ Initializes the dock art. """ - - AuiDefaultDockArt.Init(self) - - self._active_caption_colour = self._inactive_caption_colour - self._active_caption_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_CAPTIONTEXT) - self._inactive_caption_text_colour = self._active_caption_text_colour - - - def DrawCaption(self, dc, window, text, rect, pane): - """ - Draws the text in the pane caption. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `text`: the text to be displayed; - :param `rect`: the pane caption rectangle; - :param `pane`: the pane for which the text is drawn. - """ - - dc.SetPen(wx.TRANSPARENT_PEN) - self.DrawCaptionBackground(dc, rect, pane) - - active = ((pane.state & optionActive) and [True] or [False])[0] - - self._caption_font.SetWeight(wx.FONTWEIGHT_BOLD) - dc.SetFont(self._caption_font) - - if active: - dc.SetTextForeground(self._active_caption_text_colour) - else: - dc.SetTextForeground(self._inactive_caption_text_colour) - - w, h = dc.GetTextExtent("ABCDEFHXfgkj") - - clip_rect = wx.Rect(*rect) - btns = pane.CountButtons() - - captionLeft = pane.HasCaptionLeft() - variable = (captionLeft and [rect.height] or [rect.width])[0] - - variable -= 3 # text offset - variable -= 2 # button padding - - caption_offset = 0 - if pane.icon: - if captionLeft: - caption_offset += pane.icon.GetHeight() + 3 - else: - caption_offset += pane.icon.GetWidth() + 3 - - self.DrawIcon(dc, rect, pane) - - diff = -2 - if self.usingTheme: - diff = -1 - - variable -= caption_offset - variable -= btns*(self._button_size + self._button_border_size) - draw_text = ChopText(dc, text, variable) - - if captionLeft: - dc.DrawRotatedText(draw_text, rect.x+(rect.width/2)-(h/2)-diff, rect.y+rect.height-3-caption_offset, 90) - else: - dc.DrawText(draw_text, rect.x+3+caption_offset, rect.y+(rect.height/2)-(h/2)-diff) - - - def DrawCaptionBackground(self, dc, rect, pane): - """ - Draws the text caption background in the pane. - - :param `dc`: a `wx.DC` device context; - :param `rect`: the text caption rectangle; - :param `pane`: the pane for which we are drawing the caption background. - """ - - dc.SetBrush(self._background_brush) - dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) - - active = ((pane.state & optionActive) and [True] or [False])[0] - - if self.usingTheme: - - rectangle = wx.Rect() - - rc = RECT(rectangle.x, rectangle.y, rectangle.width, rectangle.height) - - # If rect x/y values are negative rc.right/bottom values will overflow and winxptheme.DrawThemeBackground - # will raise a TypeError. Ensure they are never negative. - rect.x = max(0, rect.x) - rect.y = max(0, rect.y) - - rc.top = rect.x - rc.left = rect.y - rc.right = rect.x + rect.width - rc.bottom = rect.y + rect.height - - if active: - winxptheme.DrawThemeBackground(self.hTheme1, dc.GetHDC(), 5, 1, (rc.top, rc.left, rc.right, rc.bottom), None) - else: - winxptheme.DrawThemeBackground(self.hTheme1, dc.GetHDC(), 5, 2, (rc.top, rc.left, rc.right, rc.bottom), None) - - else: - - AuiDefaultDockArt.DrawCaptionBackground(self, dc, rect, pane) - - - def RequestUserAttention(self, dc, window, text, rect, pane): - """ - Requests the user attention by intermittently highlighting the pane caption. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `text`: the text to be displayed; - :param `rect`: the pane caption rectangle; - :param `pane`: the pane for which the text is drawn. - """ - - state = pane.state - pane.state &= ~optionActive - - for indx in xrange(6): - active = (indx%2 == 0 and [True] or [False])[0] - if active: - pane.state |= optionActive - else: - pane.state &= ~optionActive - - self.DrawCaptionBackground(dc, rect, pane) - self.DrawCaption(dc, window, text, rect, pane) - wx.SafeYield() - wx.MilliSleep(350) - - pane.state = state - - - def DrawPaneButton(self, dc, window, button, button_state, rect, pane): - """ - Draws a pane button in the pane caption area. - - :param `dc`: a `wx.DC` device context; - :param `window`: an instance of `wx.Window`; - :param `button`: the button to be drawn; - :param `button_state`: the pane button state; - :param `rect`: the pane caption rectangle; - :param `pane`: the pane for which the button is drawn. - """ - - if self.usingTheme: - - hTheme = self.hTheme1 - - # Get the real button position (compensating for borders) - drect = wx.Rect(rect.x, rect.y, self._button_size, self._button_size) - - # Draw the themed close button - rc = RECT(0, 0, 0, 0) - if pane.HasCaptionLeft(): - rc.top = rect.x + self._button_border_size - rc.left = int(rect.y + 1.5*self._button_border_size) - rc.right = rect.x + self._button_size + self._button_border_size - rc.bottom = int(rect.y + self._button_size + 1.5*self._button_border_size) - else: - rc.top = rect.x - self._button_border_size - rc.left = int(rect.y + 1.5*self._button_border_size) - rc.right = rect.x + self._button_size- self._button_border_size - rc.bottom = int(rect.y + self._button_size + 1.5*self._button_border_size) - - if button == AUI_BUTTON_CLOSE: - btntype = 19 - - elif button == AUI_BUTTON_PIN: - btntype = 23 - - elif button == AUI_BUTTON_MAXIMIZE_RESTORE: - if not pane.IsMaximized(): - btntype = 17 - else: - btntype = 21 - else: - btntype = 15 - - state = 4 # CBS_DISABLED - - if pane.state & optionActive: - - if button_state == AUI_BUTTON_STATE_NORMAL: - state = 1 # CBS_NORMAL - - elif button_state == AUI_BUTTON_STATE_HOVER: - state = 2 # CBS_HOT - - elif button_state == AUI_BUTTON_STATE_PRESSED: - state = 3 # CBS_PUSHED - - else: - raise Exception("ERROR: Unknown State.") - - else: # inactive pane - - if button_state == AUI_BUTTON_STATE_NORMAL: - state = 5 # CBS_NORMAL - - elif button_state == AUI_BUTTON_STATE_HOVER: - state = 6 # CBS_HOT - - elif button_state == AUI_BUTTON_STATE_PRESSED: - state = 7 # CBS_PUSHED - - else: - raise Exception("ERROR: Unknown State.") - - try: - winxptheme.DrawThemeBackground(hTheme, dc.GetHDC(), btntype, state, (rc.top, rc.left, rc.right, rc.bottom), None) - except TypeError: - return - - else: - - # Fallback to default closebutton if themes are not enabled - rect2 = wx.Rect(rect.x-4, rect.y+2, rect.width, rect.height) - AuiDefaultDockArt.DrawPaneButton(self, dc, window, button, button_state, rect2, pane) - diff --git a/aui/framemanager.py b/aui/framemanager.py deleted file mode 100644 index 9b277bf..0000000 --- a/aui/framemanager.py +++ /dev/null @@ -1,10385 +0,0 @@ -# --------------------------------------------------------------------------- # -# AUI Library wxPython IMPLEMENTATION -# -# Original C++ Code From Kirix (wxAUI). You Can Find It At: -# -# License: wxWidgets license -# -# http:#www.kirix.com/en/community/opensource/wxaui/about_wxaui.html -# -# Current wxAUI Version Tracked: wxWidgets 2.9.0 SVN HEAD -# -# -# Python Code By: -# -# Andrea Gavana, @ 23 Dec 2005 -# Latest Revision: 10 Mar 2011, 15.00 GMT -# -# For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please -# Write To Me At: -# -# andrea.gavana@gmail.com -# gavana@kpo.kz -# -# Or, Obviously, To The wxPython Mailing List!!! -# -# End Of Comments -# --------------------------------------------------------------------------- # - -""" -Description -=========== - -framemanager is the central module of the AUI class framework. - -L{AuiManager} manages the panes associated with it for a particular `wx.Frame`, using -a pane's L{AuiPaneInfo} information to determine each pane's docking and floating -behavior. AuiManager uses wxPython' sizer mechanism to plan the layout of each frame. -It uses a replaceable dock art class to do all drawing, so all drawing is localized -in one area, and may be customized depending on an application's specific needs. - -AuiManager works as follows: the programmer adds panes to the class, or makes -changes to existing pane properties (dock position, floating state, show state, etc...). -To apply these changes, AuiManager's L{AuiManager.Update} function is called. This batch -processing can be used to avoid flicker, by modifying more than one pane at a time, -and then "committing" all of the changes at once by calling `Update()`. - -Panes can be added quite easily:: - - text1 = wx.TextCtrl(self, -1) - text2 = wx.TextCtrl(self, -1) - self._mgr.AddPane(text1, AuiPaneInfo().Left().Caption("Pane Number One")) - self._mgr.AddPane(text2, AuiPaneInfo().Bottom().Caption("Pane Number Two")) - - self._mgr.Update() - - -Later on, the positions can be modified easily. The following will float an -existing pane in a tool window:: - - self._mgr.GetPane(text1).Float() - - -Layers, Rows and Directions, Positions -====================================== - -Inside AUI, the docking layout is figured out by checking several pane parameters. -Four of these are important for determining where a pane will end up. - -**Direction** - Each docked pane has a direction, `Top`, `Bottom`, `Left`, `Right`, or `Center`. -This is fairly self-explanatory. The pane will be placed in the location specified -by this variable. - -**Position** - More than one pane can be placed inside of a "dock". Imagine two panes -being docked on the left side of a window. One pane can be placed over another. -In proportionally managed docks, the pane position indicates it's sequential position, -starting with zero. So, in our scenario with two panes docked on the left side, the -top pane in the dock would have position 0, and the second one would occupy position 1. - -**Row** - A row can allow for two docks to be placed next to each other. One of the most -common places for this to happen is in the toolbar. Multiple toolbar rows are allowed, -the first row being in row 0, and the second in row 1. Rows can also be used on -vertically docked panes. - -**Layer** - A layer is akin to an onion. Layer 0 is the very center of the managed pane. -Thus, if a pane is in layer 0, it will be closest to the center window (also sometimes -known as the "content window"). Increasing layers "swallow up" all layers of a lower -value. This can look very similar to multiple rows, but is different because all panes -in a lower level yield to panes in higher levels. The best way to understand layers -is by running the AUI sample (`AUI.py`). -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx -import time -import types -import warnings - -import auibar -import auibook -import tabmdi -import dockart -import tabart - -from aui_utilities import Clip, PaneCreateStippleBitmap, GetDockingImage, GetSlidingPoints - -from aui_constants import * - -# Define this as a translation function -_ = wx.GetTranslation - -_winxptheme = False -if wx.Platform == "__WXMSW__": - try: - import winxptheme - _winxptheme = True - except ImportError: - pass - -# wxPython version string -_VERSION_STRING = wx.VERSION_STRING - -# AUI Events -wxEVT_AUI_PANE_BUTTON = wx.NewEventType() -wxEVT_AUI_PANE_CLOSE = wx.NewEventType() -wxEVT_AUI_PANE_MAXIMIZE = wx.NewEventType() -wxEVT_AUI_PANE_RESTORE = wx.NewEventType() -wxEVT_AUI_RENDER = wx.NewEventType() -wxEVT_AUI_FIND_MANAGER = wx.NewEventType() -wxEVT_AUI_PANE_MINIMIZE = wx.NewEventType() -wxEVT_AUI_PANE_MIN_RESTORE = wx.NewEventType() -wxEVT_AUI_PANE_FLOATING = wx.NewEventType() -wxEVT_AUI_PANE_FLOATED = wx.NewEventType() -wxEVT_AUI_PANE_DOCKING = wx.NewEventType() -wxEVT_AUI_PANE_DOCKED = wx.NewEventType() -wxEVT_AUI_PANE_ACTIVATED = wx.NewEventType() -wxEVT_AUI_PERSPECTIVE_CHANGED = wx.NewEventType() - -EVT_AUI_PANE_BUTTON = wx.PyEventBinder(wxEVT_AUI_PANE_BUTTON, 0) -""" Fires an event when the user left-clicks on a pane button. """ -EVT_AUI_PANE_CLOSE = wx.PyEventBinder(wxEVT_AUI_PANE_CLOSE, 0) -""" A pane in `AuiManager` has been closed. """ -EVT_AUI_PANE_MAXIMIZE = wx.PyEventBinder(wxEVT_AUI_PANE_MAXIMIZE, 0) -""" A pane in `AuiManager` has been maximized. """ -EVT_AUI_PANE_RESTORE = wx.PyEventBinder(wxEVT_AUI_PANE_RESTORE, 0) -""" A pane in `AuiManager` has been restored from a maximized state. """ -EVT_AUI_RENDER = wx.PyEventBinder(wxEVT_AUI_RENDER, 0) -""" Fires an event every time the AUI frame is being repainted. """ -EVT_AUI_FIND_MANAGER = wx.PyEventBinder(wxEVT_AUI_FIND_MANAGER, 0) -""" Used to find which AUI manager is controlling a certain pane. """ -EVT_AUI_PANE_MINIMIZE = wx.PyEventBinder(wxEVT_AUI_PANE_MINIMIZE, 0) -""" A pane in `AuiManager` has been minimized. """ -EVT_AUI_PANE_MIN_RESTORE = wx.PyEventBinder(wxEVT_AUI_PANE_MIN_RESTORE, 0) -""" A pane in `AuiManager` has been restored from a minimized state. """ -EVT_AUI_PANE_FLOATING = wx.PyEventBinder(wxEVT_AUI_PANE_FLOATING, 0) -""" A pane in `AuiManager` is about to be floated. """ -EVT_AUI_PANE_FLOATED = wx.PyEventBinder(wxEVT_AUI_PANE_FLOATED, 0) -""" A pane in `AuiManager` has been floated. """ -EVT_AUI_PANE_DOCKING = wx.PyEventBinder(wxEVT_AUI_PANE_DOCKING, 0) -""" A pane in `AuiManager` is about to be docked. """ -EVT_AUI_PANE_DOCKED = wx.PyEventBinder(wxEVT_AUI_PANE_DOCKED, 0) -""" A pane in `AuiManager` has been docked. """ -EVT_AUI_PANE_ACTIVATED = wx.PyEventBinder(wxEVT_AUI_PANE_ACTIVATED, 0) -""" A pane in `AuiManager` has been activated. """ -EVT_AUI_PERSPECTIVE_CHANGED = wx.PyEventBinder(wxEVT_AUI_PERSPECTIVE_CHANGED, 0) -""" The layout in `AuiManager` has been changed. """ - -# ---------------------------------------------------------------------------- # - -class AuiDockInfo(object): - """ A class to store all properties of a dock. """ - - def __init__(self): - """ - Default class constructor. - Used internally, do not call it in your code! - """ - - object.__init__(self) - - self.dock_direction = 0 - self.dock_layer = 0 - self.dock_row = 0 - self.size = 0 - self.min_size = 0 - self.resizable = True - self.fixed = False - self.toolbar = False - self.rect = wx.Rect() - self.panes = [] - - - def IsOk(self): - """ - Returns whether a dock is valid or not. - - In order to be valid, a dock needs to have a non-zero `dock_direction`. - """ - - return self.dock_direction != 0 - - - def IsHorizontal(self): - """ Returns whether the dock is horizontal or not. """ - - return self.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM] - - - def IsVertical(self): - """ Returns whether the dock is vertical or not. """ - - return self.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT, AUI_DOCK_CENTER] - - -# ---------------------------------------------------------------------------- # - -class AuiDockingGuideInfo(object): - """ A class which holds information about VS2005 docking guide windows. """ - - def __init__(self, other=None): - """ - Default class constructor. - Used internally, do not call it in your code! - - :param `other`: another instance of L{AuiDockingGuideInfo}. - """ - - if other: - self.Assign(other) - else: - # window representing the docking target - self.host = None - # dock direction (top, bottom, left, right, center) - self.dock_direction = AUI_DOCK_NONE - - - def Assign(self, other): - """ - Assigns the properties of the `other` L{AuiDockingGuideInfo} to `self`. - - :param `other`: another instance of L{AuiDockingGuideInfo}. - """ - - self.host = other.host - self.dock_direction = other.dock_direction - - - def Host(self, h): - """ - Hosts a docking guide window. - - :param `h`: an instance of L{AuiSingleDockingGuide} or L{AuiCenterDockingGuide}. - """ - - self.host = h - return self - - - def Left(self): - """ Sets the guide window to left docking. """ - - self.dock_direction = AUI_DOCK_LEFT - return self - - - def Right(self): - """ Sets the guide window to right docking. """ - - self.dock_direction = AUI_DOCK_RIGHT - return self - - - def Top(self): - """ Sets the guide window to top docking. """ - - self.dock_direction = AUI_DOCK_TOP - return self - - - def Bottom(self): - """ Sets the guide window to bottom docking. """ - - self.dock_direction = AUI_DOCK_BOTTOM - return self - - - def Center(self): - """ Sets the guide window to center docking. """ - - self.dock_direction = AUI_DOCK_CENTER - return self - - - def Centre(self): - """ Sets the guide window to centre docking. """ - - self.dock_direction = AUI_DOCK_CENTRE - return self - - -# ---------------------------------------------------------------------------- # - -class AuiDockUIPart(object): - """ A class which holds attributes for a UI part in the interface. """ - - typeCaption = 0 - typeGripper = 1 - typeDock = 2 - typeDockSizer = 3 - typePane = 4 - typePaneSizer = 5 - typeBackground = 6 - typePaneBorder = 7 - typePaneButton = 8 - - def __init__(self): - """ - Default class constructor. - Used internally, do not call it in your code! - """ - - self.orientation = wx.VERTICAL - self.type = 0 - self.rect = wx.Rect() - - -# ---------------------------------------------------------------------------- # - -class AuiPaneButton(object): - """ A simple class which describes the caption pane button attributes. """ - - def __init__(self, button_id): - """ - Default class constructor. - Used internally, do not call it in your code! - - :param `button_id`: the pane button identifier. - """ - - self.button_id = button_id - - -# ---------------------------------------------------------------------------- # - -# event declarations/classes - -class AuiManagerEvent(wx.PyCommandEvent): - """ A specialized command event class for events sent by L{AuiManager}. """ - - def __init__(self, eventType, id=1): - """ - Default class constructor. - - :param `eventType`: the event kind; - :param `id`: the event identification number. - """ - - wx.PyCommandEvent.__init__(self, eventType, id) - - self.manager = None - self.pane = None - self.button = 0 - self.veto_flag = False - self.canveto_flag = True - self.dc = None - - - def SetManager(self, mgr): - """ - Associates a L{AuiManager} to the current event. - - :param `mgr`: an instance of L{AuiManager}. - """ - - self.manager = mgr - - - def SetDC(self, pdc): - """ - Associates a `wx.DC` device context to this event. - - :param `pdc`: a `wx.DC` device context object. - """ - - self.dc = pdc - - - def SetPane(self, p): - """ - Associates a L{AuiPaneInfo} instance to this event. - - :param `p`: a L{AuiPaneInfo} instance. - """ - - self.pane = p - - - def SetButton(self, b): - """ - Associates a L{AuiPaneButton} instance to this event. - - :param `b`: a L{AuiPaneButton} instance. - """ - - self.button = b - - - def GetManager(self): - """ Returns the associated L{AuiManager} (if any). """ - - return self.manager - - - def GetDC(self): - """ Returns the associated `wx.DC` device context (if any). """ - - return self.dc - - - def GetPane(self): - """ Returns the associated L{AuiPaneInfo} structure (if any). """ - - return self.pane - - - def GetButton(self): - """ Returns the associated L{AuiPaneButton} instance (if any). """ - - return self.button - - - def Veto(self, veto=True): - """ - Prevents the change announced by this event from happening. - - It is in general a good idea to notify the user about the reasons for - vetoing the change because otherwise the applications behaviour (which - just refuses to do what the user wants) might be quite surprising. - - :param `veto`: ``True`` to veto the event, ``False`` otherwise. - """ - - self.veto_flag = veto - - - def GetVeto(self): - """ Returns whether the event has been vetoed or not. """ - - return self.veto_flag - - - def SetCanVeto(self, can_veto): - """ - Sets whether the event can be vetoed or not. - - :param `can_veto`: a bool flag. ``True`` if the event can be vetoed, ``False`` otherwise. - """ - - self.canveto_flag = can_veto - - - def CanVeto(self): - """ Returns whether the event can be vetoed and has been vetoed. """ - - return self.canveto_flag and self.veto_flag - - -# ---------------------------------------------------------------------------- # - -class AuiPaneInfo(object): - """ - AuiPaneInfo specifies all the parameters for a pane. These parameters specify where - the pane is on the screen, whether it is docked or floating, or hidden. In addition, - these parameters specify the pane's docked position, floating position, preferred - size, minimum size, caption text among many other parameters. - """ - - optionFloating = 2**0 - optionHidden = 2**1 - optionLeftDockable = 2**2 - optionRightDockable = 2**3 - optionTopDockable = 2**4 - optionBottomDockable = 2**5 - optionFloatable = 2**6 - optionMovable = 2**7 - optionResizable = 2**8 - optionPaneBorder = 2**9 - optionCaption = 2**10 - optionGripper = 2**11 - optionDestroyOnClose = 2**12 - optionToolbar = 2**13 - optionActive = 2**14 - optionGripperTop = 2**15 - optionMaximized = 2**16 - optionDockFixed = 2**17 - optionNotebookDockable = 2**18 - optionMinimized = 2**19 - optionLeftSnapped = 2**20 - optionRightSnapped = 2**21 - optionTopSnapped = 2**22 - optionBottomSnapped = 2**23 - optionFlyOut = 2**24 - optionCaptionLeft = 2**25 - - buttonClose = 2**26 - buttonMaximize = 2**27 - buttonMinimize = 2**28 - buttonPin = 2**29 - - buttonCustom1 = 2**30 - buttonCustom2 = 2**31 - buttonCustom3 = 2**32 - - savedHiddenState = 2**33 # used internally - actionPane = 2**34 # used internally - wasMaximized = 2**35 # used internally - needsRestore = 2**36 # used internally - - - def __init__(self): - """ Default class constructor. """ - - self.window = None - self.frame = None - self.state = 0 - self.dock_direction = AUI_DOCK_LEFT - self.dock_layer = 0 - self.dock_row = 0 - self.dock_pos = 0 - self.minimize_mode = AUI_MINIMIZE_POS_SMART - self.floating_pos = wx.Point(-1, -1) - self.floating_size = wx.Size(-1, -1) - self.best_size = wx.Size(-1, -1) - self.min_size = wx.Size(-1, -1) - self.max_size = wx.Size(-1, -1) - self.dock_proportion = 0 - self.caption = "" - self.buttons = [] - self.name = "" - self.icon = wx.NullIcon - self.rect = wx.Rect() - self.notebook_id = -1 - self.transparent = 255 - self.needsTransparency = False - self.previousDockPos = None - self.previousDockSize = 0 - self.snapped = 0 - - self.DefaultPane() - - - def dock_direction_get(self): - """ - Getter for the `dock_direction`. - - :see: L{dock_direction_set} for a set of valid docking directions. - """ - - if self.IsMaximized(): - return AUI_DOCK_CENTER - else: - return self._dock_direction - - - def dock_direction_set(self, value): - """ - Setter for the `dock_direction`. - - :param `value`: the docking direction. This cab ne one of the following bits: - - ============================ ======= ============================================= - Dock Flag Value Description - ============================ ======= ============================================= - ``AUI_DOCK_NONE`` 0 No docking direction. - ``AUI_DOCK_TOP`` 1 Top docking direction. - ``AUI_DOCK_RIGHT`` 2 Right docking direction. - ``AUI_DOCK_BOTTOM`` 3 Bottom docking direction. - ``AUI_DOCK_LEFT`` 4 Left docking direction. - ``AUI_DOCK_CENTER`` 5 Center docking direction. - ``AUI_DOCK_CENTRE`` 5 Centre docking direction. - ``AUI_DOCK_NOTEBOOK_PAGE`` 6 Automatic AuiNotebooks docking style. - ============================ ======= ============================================= - - """ - - self._dock_direction = value - - dock_direction = property(dock_direction_get, dock_direction_set) - - def IsOk(self): - """ - Returns ``True`` if the L{AuiPaneInfo} structure is valid. - - :note: A pane structure is valid if it has an associated window. - """ - - return self.window != None - - - def IsMaximized(self): - """ Returns ``True`` if the pane is maximized. """ - - return self.HasFlag(self.optionMaximized) - - - def IsMinimized(self): - """ Returns ``True`` if the pane is minimized. """ - - return self.HasFlag(self.optionMinimized) - - - def IsFixed(self): - """ Returns ``True`` if the pane cannot be resized. """ - - return not self.HasFlag(self.optionResizable) - - - def IsResizeable(self): - """ Returns ``True`` if the pane can be resized. """ - - return self.HasFlag(self.optionResizable) - - - def IsShown(self): - """ Returns ``True`` if the pane is currently shown. """ - - return not self.HasFlag(self.optionHidden) - - - def IsFloating(self): - """ Returns ``True`` if the pane is floating. """ - - return self.HasFlag(self.optionFloating) - - - def IsDocked(self): - """ Returns ``True`` if the pane is docked. """ - - return not self.HasFlag(self.optionFloating) - - - def IsToolbar(self): - """ Returns ``True`` if the pane contains a toolbar. """ - - return self.HasFlag(self.optionToolbar) - - - def IsTopDockable(self): - """ - Returns ``True`` if the pane can be docked at the top - of the managed frame. - """ - - return self.HasFlag(self.optionTopDockable) - - - def IsBottomDockable(self): - """ - Returns ``True`` if the pane can be docked at the bottom - of the managed frame. - """ - - return self.HasFlag(self.optionBottomDockable) - - - def IsLeftDockable(self): - """ - Returns ``True`` if the pane can be docked at the left - of the managed frame. - """ - - return self.HasFlag(self.optionLeftDockable) - - - def IsRightDockable(self): - """ - Returns ``True`` if the pane can be docked at the right - of the managed frame. - """ - - return self.HasFlag(self.optionRightDockable) - - - def IsDockable(self): - """ Returns ``True`` if the pane can be docked. """ - - return self.IsTopDockable() or self.IsBottomDockable() or self.IsLeftDockable() or \ - self.IsRightDockable() or self.IsNotebookDockable() - - - def IsFloatable(self): - """ - Returns ``True`` if the pane can be undocked and displayed as a - floating window. - """ - - return self.HasFlag(self.optionFloatable) - - - def IsMovable(self): - """ - Returns ``True`` if the docked frame can be undocked or moved to - another dock position. - """ - - return self.HasFlag(self.optionMovable) - - - def IsDestroyOnClose(self): - """ - Returns ``True`` if the pane should be destroyed when it is closed. - - Normally a pane is simply hidden when the close button is clicked. Calling L{DestroyOnClose} - with a ``True`` input parameter will cause the window to be destroyed when the user clicks - the pane's close button. - """ - - return self.HasFlag(self.optionDestroyOnClose) - - - def IsNotebookDockable(self): - """ - Returns ``True`` if a pane can be docked on top to another to create a - L{AuiNotebook}. - """ - - return self.HasFlag(self.optionNotebookDockable) - - - def IsTopSnappable(self): - """ Returns ``True`` if the pane can be snapped at the top of the managed frame. """ - - return self.HasFlag(self.optionTopSnapped) - - - def IsBottomSnappable(self): - """ Returns ``True`` if the pane can be snapped at the bottom of the managed frame. """ - - return self.HasFlag(self.optionBottomSnapped) - - - def IsLeftSnappable(self): - """ Returns ``True`` if the pane can be snapped on the left of the managed frame. """ - - return self.HasFlag(self.optionLeftSnapped) - - - def IsRightSnappable(self): - """ Returns ``True`` if the pane can be snapped on the right of the managed frame. """ - - return self.HasFlag(self.optionRightSnapped) - - - def IsSnappable(self): - """ Returns ``True`` if the pane can be snapped. """ - - return self.IsTopSnappable() or self.IsBottomSnappable() or self.IsLeftSnappable() or \ - self.IsRightSnappable() - - - def IsFlyOut(self): - """ Returns ``True`` if the floating pane has a "fly-out" effect. """ - - return self.HasFlag(self.optionFlyOut) - - - def HasCaption(self): - """ Returns ``True`` if the pane displays a caption. """ - - return self.HasFlag(self.optionCaption) - - - def HasCaptionLeft(self): - """ Returns ``True`` if the pane displays a caption on the left (rotated by 90 degrees). """ - - return self.HasFlag(self.optionCaptionLeft) - - - def HasGripper(self): - """ Returns ``True`` if the pane displays a gripper. """ - - return self.HasFlag(self.optionGripper) - - - def HasBorder(self): - """ Returns ``True`` if the pane displays a border. """ - - return self.HasFlag(self.optionPaneBorder) - - - def HasCloseButton(self): - """ Returns ``True`` if the pane displays a button to close the pane. """ - - return self.HasFlag(self.buttonClose) - - - def HasMaximizeButton(self): - """ Returns ``True`` if the pane displays a button to maximize the pane. """ - - return self.HasFlag(self.buttonMaximize) - - - def HasMinimizeButton(self): - """ Returns ``True`` if the pane displays a button to minimize the pane. """ - - return self.HasFlag(self.buttonMinimize) - - - def GetMinimizeMode(self): - """ - Returns the minimization style for this pane. - - Possible return values are: - - ============================== ========= ============================== - Minimize Mode Flag Hex Value Description - ============================== ========= ============================== - ``AUI_MINIMIZE_POS_SMART`` 0x01 Minimizes the pane on the closest tool bar - ``AUI_MINIMIZE_POS_TOP`` 0x02 Minimizes the pane on the top tool bar - ``AUI_MINIMIZE_POS_LEFT`` 0x03 Minimizes the pane on its left tool bar - ``AUI_MINIMIZE_POS_RIGHT`` 0x04 Minimizes the pane on its right tool bar - ``AUI_MINIMIZE_POS_BOTTOM`` 0x05 Minimizes the pane on its bottom tool bar - ``AUI_MINIMIZE_POS_MASK`` 0x07 Mask to filter the position flags - ``AUI_MINIMIZE_CAPT_HIDE`` 0x0 Hides the caption of the minimized pane - ``AUI_MINIMIZE_CAPT_SMART`` 0x08 Displays the caption in the best rotation (horizontal or clockwise) - ``AUI_MINIMIZE_CAPT_HORZ`` 0x10 Displays the caption horizontally - ``AUI_MINIMIZE_CAPT_MASK`` 0x18 Mask to filter the caption flags - ============================== ========= ============================== - - The flags can be filtered with the following masks: - - ============================== ========= ============================== - Minimize Mask Flag Hex Value Description - ============================== ========= ============================== - ``AUI_MINIMIZE_POS_MASK`` 0x07 Filters the position flags - ``AUI_MINIMIZE_CAPT_MASK`` 0x18 Filters the caption flags - ============================== ========= ============================== - - """ - - return self.minimize_mode - - - def HasPinButton(self): - """ Returns ``True`` if the pane displays a button to float the pane. """ - - return self.HasFlag(self.buttonPin) - - - def HasGripperTop(self): - """ Returns ``True`` if the pane displays a gripper at the top. """ - - return self.HasFlag(self.optionGripperTop) - - - def Window(self, w): - """ - Associate a `wx.Window` derived window to this pane. - - This normally does not need to be specified, as the window pointer is - automatically assigned to the L{AuiPaneInfo} structure as soon as it is - added to the manager. - - :param `w`: a `wx.Window` derived window. - """ - - self.window = w - return self - - - def Name(self, name): - """ - Sets the name of the pane so it can be referenced in lookup functions. - - If a name is not specified by the user, a random name is assigned to the pane - when it is added to the manager. - - :param `name`: a string specifying the pane name. - - :warning: If you are using L{AuiManager.SavePerspective} and L{AuiManager.LoadPerspective}, you will have - to specify a name for your pane using L{Name}, as randomly generated names can - not be properly restored. - """ - - self.name = name - return self - - - def Caption(self, caption): - """ - Sets the caption of the pane. - - :param `caption`: a string specifying the pane caption. - """ - - self.caption = caption - return self - - - def Left(self): - """ - Sets the pane dock position to the left side of the frame. - - :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_LEFT`` as - parameter. - """ - - self.dock_direction = AUI_DOCK_LEFT - return self - - - def Right(self): - """ - Sets the pane dock position to the right side of the frame. - - :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_RIGHT`` as - parameter. - """ - - self.dock_direction = AUI_DOCK_RIGHT - return self - - - def Top(self): - """ - Sets the pane dock position to the top of the frame. - - :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_TOP`` as - parameter. - """ - - self.dock_direction = AUI_DOCK_TOP - return self - - - def Bottom(self): - """ - Sets the pane dock position to the bottom of the frame. - - :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_BOTTOM`` as - parameter. - """ - - self.dock_direction = AUI_DOCK_BOTTOM - return self - - - def Center(self): - """ - Sets the pane to the center position of the frame. - - The centre pane is the space in the middle after all border panes (left, top, - right, bottom) are subtracted from the layout. - - :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_CENTER`` as - parameter. - """ - - self.dock_direction = AUI_DOCK_CENTER - return self - - - def Centre(self): - """ - Sets the pane to the center position of the frame. - - The centre pane is the space in the middle after all border panes (left, top, - right, bottom) are subtracted from the layout. - - :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_CENTRE`` as - parameter. - """ - - self.dock_direction = AUI_DOCK_CENTRE - return self - - - def Direction(self, direction): - """ - Determines the direction of the docked pane. It is functionally the - same as calling L{Left}, L{Right}, L{Top} or L{Bottom}, except that docking direction - may be specified programmatically via the parameter `direction`. - - :param `direction`: the direction of the docked pane. - - :see: L{dock_direction_set} for a list of valid docking directions. - """ - - self.dock_direction = direction - return self - - - def Layer(self, layer): - """ - Determines the layer of the docked pane. - - The dock layer is similar to an onion, the inner-most layer being layer 0. Each - shell moving in the outward direction has a higher layer number. This allows for - more complex docking layout formation. - - :param `layer`: the layer of the docked pane. - """ - - self.dock_layer = layer - return self - - - def Row(self, row): - """ - Determines the row of the docked pane. - - :param `row`: the row of the docked pane. - """ - - self.dock_row = row - return self - - - def Position(self, pos): - """ - Determines the position of the docked pane. - - :param `pos`: the position of the docked pane. - """ - - self.dock_pos = pos - return self - - - def MinSize(self, arg1=None, arg2=None): - """ - Sets the minimum size of the pane. - - This method is split in 2 versions depending on the input type. If `arg1` is - a `wx.Size` object, then L{MinSize1} is called. Otherwise, L{MinSize2} is called. - - :param `arg1`: a `wx.Size` object, a (x, y) tuple or or a `x` coordinate. - :param `arg2`: a `y` coordinate (only if `arg1` is a `x` coordinate, otherwise unused). - """ - - if isinstance(arg1, wx.Size): - ret = self.MinSize1(arg1) - elif isinstance(arg1, types.TupleType): - ret = self.MinSize1(wx.Size(*arg1)) - else: - ret = self.MinSize2(arg1, arg2) - - return ret - - - def MinSize1(self, size): - """ - Sets the minimum size of the pane. - - :see: L{MinSize} for an explanation of input parameters. - """ - self.min_size = size - return self - - - def MinSize2(self, x, y): - """ - Sets the minimum size of the pane. - - :see: L{MinSize} for an explanation of input parameters. - """ - - self.min_size = wx.Size(x, y) - return self - - - def MaxSize(self, arg1=None, arg2=None): - """ - Sets the maximum size of the pane. - - This method is split in 2 versions depending on the input type. If `arg1` is - a `wx.Size` object, then L{MaxSize1} is called. Otherwise, L{MaxSize2} is called. - - :param `arg1`: a `wx.Size` object, a (x, y) tuple or a `x` coordinate. - :param `arg2`: a `y` coordinate (only if `arg1` is a `x` coordinate, otherwise unused). - """ - - if isinstance(arg1, wx.Size): - ret = self.MaxSize1(arg1) - elif isinstance(arg1, types.TupleType): - ret = self.MaxSize1(wx.Size(*arg1)) - else: - ret = self.MaxSize2(arg1, arg2) - - return ret - - - def MaxSize1(self, size): - """ - Sets the maximum size of the pane. - - :see: L{MaxSize} for an explanation of input parameters. - """ - - self.max_size = size - return self - - - def MaxSize2(self, x, y): - """ - Sets the maximum size of the pane. - - :see: L{MaxSize} for an explanation of input parameters. - """ - - self.max_size.Set(x,y) - return self - - - def BestSize(self, arg1=None, arg2=None): - """ - Sets the ideal size for the pane. The docking manager will attempt to use - this size as much as possible when docking or floating the pane. - - This method is split in 2 versions depending on the input type. If `arg1` is - a `wx.Size` object, then L{BestSize1} is called. Otherwise, L{BestSize2} is called. - - :param `arg1`: a `wx.Size` object, a (x, y) tuple or a `x` coordinate. - :param `arg2`: a `y` coordinate (only if `arg1` is a `x` coordinate, otherwise unused). - """ - - if isinstance(arg1, wx.Size): - ret = self.BestSize1(arg1) - elif isinstance(arg1, types.TupleType): - ret = self.BestSize1(wx.Size(*arg1)) - else: - ret = self.BestSize2(arg1, arg2) - - return ret - - - def BestSize1(self, size): - """ - Sets the best size of the pane. - - :see: L{BestSize} for an explanation of input parameters. - """ - - self.best_size = size - return self - - - def BestSize2(self, x, y): - """ - Sets the best size of the pane. - - :see: L{BestSize} for an explanation of input parameters. - """ - - self.best_size.Set(x,y) - return self - - - def FloatingPosition(self, pos): - """ - Sets the position of the floating pane. - - :param `pos`: a `wx.Point` or a tuple indicating the pane floating position. - """ - - self.floating_pos = wx.Point(*pos) - return self - - - def FloatingSize(self, size): - """ - Sets the size of the floating pane. - - :param `size`: a `wx.Size` or a tuple indicating the pane floating size. - """ - - self.floating_size = wx.Size(*size) - return self - - - def Maximize(self): - """ Makes the pane take up the full area.""" - - return self.SetFlag(self.optionMaximized, True) - - - def Minimize(self): - """ - Makes the pane minimized in a L{AuiToolBar}. - - Clicking on the minimize button causes a new L{AuiToolBar} to be created - and added to the frame manager, (currently the implementation is such that - panes at West will have a toolbar at the right, panes at South will have - toolbars at the bottom etc...) and the pane is hidden in the manager. - - Clicking on the restore button on the newly created toolbar will result in the - toolbar being removed and the original pane being restored. - """ - - return self.SetFlag(self.optionMinimized, True) - - - def MinimizeMode(self, mode): - """ - Sets the expected minimized mode if the MinimizeButton() is visible. - - The minimized pane can have a specific position in the work space: - - ============================== ========= ============================== - Minimize Mode Flag Hex Value Description - ============================== ========= ============================== - ``AUI_MINIMIZE_POS_SMART`` 0x01 Minimizes the pane on the closest tool bar - ``AUI_MINIMIZE_POS_TOP`` 0x02 Minimizes the pane on the top tool bar - ``AUI_MINIMIZE_POS_LEFT`` 0x03 Minimizes the pane on its left tool bar - ``AUI_MINIMIZE_POS_RIGHT`` 0x04 Minimizes the pane on its right tool bar - ``AUI_MINIMIZE_POS_BOTTOM`` 0x05 Minimizes the pane on its bottom tool bar - ============================== ========= ============================== - - The caption of the minimized pane can be displayed in different modes: - - ============================== ========= ============================== - Caption Mode Flag Hex Value Description - ============================== ========= ============================== - ``AUI_MINIMIZE_CAPT_HIDE`` 0x0 Hides the caption of the minimized pane - ``AUI_MINIMIZE_CAPT_SMART`` 0x08 Displays the caption in the best rotation (horizontal in the top and in the bottom tool bar or clockwise in the right and in the left tool bar) - ``AUI_MINIMIZE_CAPT_HORZ`` 0x10 Displays the caption horizontally - ============================== ========= ============================== - - """ - - self.minimize_mode = mode - return self - - - def Restore(self): - """ Is the reverse of L{Maximize} and L{Minimize}.""" - - return self.SetFlag(self.optionMaximized or self.optionMinimized, False) - - - def Fixed(self): - """ - Forces a pane to be fixed size so that it cannot be resized. - After calling L{Fixed}, L{IsFixed} will return ``True``. - """ - - return self.SetFlag(self.optionResizable, False) - - - def Resizable(self, resizable=True): - """ - Allows a pane to be resizable if `resizable` is ``True``, and forces - it to be a fixed size if `resizeable` is ``False``. - - If `resizable` is ``False``, this is simply an antonym for L{Fixed}. - - :param `resizable`: whether the pane will be resizeable or not. - """ - - return self.SetFlag(self.optionResizable, resizable) - - - def Transparent(self, alpha): - """ - Makes the pane transparent when floating. - - :param `alpha`: an integer value between 0 and 255 for pane transparency. - """ - - if alpha < 0 or alpha > 255: - raise Exception("Invalid transparency value (%s)"%repr(alpha)) - - self.transparent = alpha - self.needsTransparency = True - - - def Dock(self): - """ - Indicates that a pane should be docked. It is the opposite of L{Float}. - """ - - if self.IsNotebookPage(): - self.notebook_id = -1 - self.dock_direction = AUI_DOCK_NONE - - return self.SetFlag(self.optionFloating, False) - - - def Float(self): - """ - Indicates that a pane should be floated. It is the opposite of L{Dock}. - """ - - if self.IsNotebookPage(): - self.notebook_id = -1 - self.dock_direction = AUI_DOCK_NONE - - return self.SetFlag(self.optionFloating, True) - - - def Hide(self): - """ - Indicates that a pane should be hidden. - - Calling L{Show} (``False``) achieve the same effect. - """ - - return self.SetFlag(self.optionHidden, True) - - - def Show(self, show=True): - """ - Indicates that a pane should be shown. - - :param `show`: whether the pane should be shown or not. - """ - - return self.SetFlag(self.optionHidden, not show) - - - # By defaulting to 1000, the tab will get placed at the end - def NotebookPage(self, id, tab_position=1000): - """ - Forces a pane to be a notebook page, so that the pane can be - docked on top to another to create a L{AuiNotebook}. - - :param `id`: the notebook id; - :param `tab_position`: the tab number of the pane once docked in a notebook. - """ - - # Remove any floating frame - self.Dock() - self.notebook_id = id - self.dock_pos = tab_position - self.dock_row = 0 - self.dock_layer = 0 - self.dock_direction = AUI_DOCK_NOTEBOOK_PAGE - - return self - - - def NotebookControl(self, id): - """ - Forces a pane to be a notebook control (L{AuiNotebook}). - - :param `id`: the notebook id. - """ - - self.notebook_id = id - self.window = None - self.buttons = [] - - if self.dock_direction == AUI_DOCK_NOTEBOOK_PAGE: - self.dock_direction = AUI_DOCK_NONE - - return self - - - def HasNotebook(self): - """ Returns whether a pane has a L{AuiNotebook} or not. """ - - return self.notebook_id >= 0 - - - def IsNotebookPage(self): - """ Returns whether the pane is a notebook page in a L{AuiNotebook}. """ - - return self.notebook_id >= 0 and self.dock_direction == AUI_DOCK_NOTEBOOK_PAGE - - - def IsNotebookControl(self): - """ Returns whether the pane is a notebook control (L{AuiNotebook}). """ - - return not self.IsNotebookPage() and self.HasNotebook() - - - def SetNameFromNotebookId(self): - """ Sets the pane name once docked in a L{AuiNotebook} using the notebook id. """ - - if self.notebook_id >= 0: - self.name = "__notebook_%d"%self.notebook_id - - return self - - - def CaptionVisible(self, visible=True, left=False): - """ - Indicates that a pane caption should be visible. If `visible` is ``False``, no pane - caption is drawn. - - :param `visible`: whether the caption should be visible or not; - :param `left`: whether the caption should be drawn on the left (rotated by 90 degrees) or not. - """ - - if left: - self.SetFlag(self.optionCaption, False) - return self.SetFlag(self.optionCaptionLeft, visible) - - self.SetFlag(self.optionCaptionLeft, False) - return self.SetFlag(self.optionCaption, visible) - - - def PaneBorder(self, visible=True): - """ - Indicates that a border should be drawn for the pane. - - :param `visible`: whether the pane border should be visible or not. - """ - - return self.SetFlag(self.optionPaneBorder, visible) - - - def Gripper(self, visible=True): - """ - Indicates that a gripper should be drawn for the pane. - - :param `visible`: whether the gripper should be visible or not. - """ - - return self.SetFlag(self.optionGripper, visible) - - - def GripperTop(self, attop=True): - """ - Indicates that a gripper should be drawn at the top of the pane. - - :param `attop`: whether the gripper should be drawn at the top or not. - """ - - return self.SetFlag(self.optionGripperTop, attop) - - - def CloseButton(self, visible=True): - """ - Indicates that a close button should be drawn for the pane. - - :param `visible`: whether the close button should be visible or not. - """ - - return self.SetFlag(self.buttonClose, visible) - - - def MaximizeButton(self, visible=True): - """ - Indicates that a maximize button should be drawn for the pane. - - :param `visible`: whether the maximize button should be visible or not. - """ - - return self.SetFlag(self.buttonMaximize, visible) - - - def MinimizeButton(self, visible=True): - """ - Indicates that a minimize button should be drawn for the pane. - - :param `visible`: whether the minimize button should be visible or not. - """ - - return self.SetFlag(self.buttonMinimize, visible) - - - def PinButton(self, visible=True): - """ - Indicates that a pin button should be drawn for the pane. - - :param `visible`: whether the pin button should be visible or not. - """ - - return self.SetFlag(self.buttonPin, visible) - - - def DestroyOnClose(self, b=True): - """ - Indicates whether a pane should be destroyed when it is closed. - - Normally a pane is simply hidden when the close button is clicked. Setting - `b` to ``True`` will cause the window to be destroyed when the user clicks - the pane's close button. - - :param `b`: whether the pane should be destroyed when it is closed or not. - """ - - return self.SetFlag(self.optionDestroyOnClose, b) - - - def TopDockable(self, b=True): - """ - Indicates whether a pane can be docked at the top of the frame. - - :param `b`: whether the pane can be docked at the top or not. - """ - - return self.SetFlag(self.optionTopDockable, b) - - - def BottomDockable(self, b=True): - """ - Indicates whether a pane can be docked at the bottom of the frame. - - :param `b`: whether the pane can be docked at the bottom or not. - """ - - return self.SetFlag(self.optionBottomDockable, b) - - - def LeftDockable(self, b=True): - """ - Indicates whether a pane can be docked on the left of the frame. - - :param `b`: whether the pane can be docked at the left or not. - """ - - return self.SetFlag(self.optionLeftDockable, b) - - - def RightDockable(self, b=True): - """ - Indicates whether a pane can be docked on the right of the frame. - - :param `b`: whether the pane can be docked at the right or not. - """ - - return self.SetFlag(self.optionRightDockable, b) - - - def Floatable(self, b=True): - """ - Sets whether the user will be able to undock a pane and turn it - into a floating window. - - :param `b`: whether the pane can be floated or not. - """ - - return self.SetFlag(self.optionFloatable, b) - - - def Movable(self, b=True): - """ - Indicates whether a pane can be moved. - - :param `b`: whether the pane can be moved or not. - """ - - return self.SetFlag(self.optionMovable, b) - - - def NotebookDockable(self, b=True): - """ - Indicates whether a pane can be docked in an automatic L{AuiNotebook}. - - :param `b`: whether the pane can be docked in a notebook or not. - """ - - return self.SetFlag(self.optionNotebookDockable, b) - - - def DockFixed(self, b=True): - """ - Causes the containing dock to have no resize sash. This is useful - for creating panes that span the entire width or height of a dock, but should - not be resizable in the other direction. - - :param `b`: whether the pane will have a resize sash or not. - """ - - return self.SetFlag(self.optionDockFixed, b) - - - def Dockable(self, b=True): - """ - Specifies whether a frame can be docked or not. It is the same as specifying - L{TopDockable} . L{BottomDockable} . L{LeftDockable} . L{RightDockable} . - - :param `b`: whether the frame can be docked or not. - """ - - return self.TopDockable(b).BottomDockable(b).LeftDockable(b).RightDockable(b) - - - def TopSnappable(self, b=True): - """ - Indicates whether a pane can be snapped at the top of the main frame. - - :param `b`: whether the pane can be snapped at the top of the main frame or not. - """ - - return self.SetFlag(self.optionTopSnapped, b) - - - def BottomSnappable(self, b=True): - """ - Indicates whether a pane can be snapped at the bottom of the main frame. - - :param `b`: whether the pane can be snapped at the bottom of the main frame or not. - """ - - return self.SetFlag(self.optionBottomSnapped, b) - - - def LeftSnappable(self, b=True): - """ - Indicates whether a pane can be snapped on the left of the main frame. - - :param `b`: whether the pane can be snapped at the left of the main frame or not. - """ - - return self.SetFlag(self.optionLeftSnapped, b) - - - def RightSnappable(self, b=True): - """ - Indicates whether a pane can be snapped on the right of the main frame. - - :param `b`: whether the pane can be snapped at the right of the main frame or not. - """ - - return self.SetFlag(self.optionRightSnapped, b) - - - def Snappable(self, b=True): - """ - Indicates whether a pane can be snapped on the main frame. This is - equivalent as calling L{TopSnappable} . L{BottomSnappable} . L{LeftSnappable} . L{RightSnappable} . - - :param `b`: whether the pane can be snapped on the main frame or not. - """ - - return self.TopSnappable(b).BottomSnappable(b).LeftSnappable(b).RightSnappable(b) - - - def FlyOut(self, b=True): - """ - Indicates whether a pane, when floating, has a "fly-out" effect - (i.e., floating panes which only show themselves when moused over). - - :param `b`: whether the pane can be snapped on the main frame or not. - """ - - return self.SetFlag(self.optionFlyOut, b) - - - # Copy over the members that pertain to docking position - def SetDockPos(self, source): - """ - Copies the `source` pane members that pertain to docking position to `self`. - - :param `source`: the source pane from where to copy the attributes. - """ - - self.dock_direction = source.dock_direction - self.dock_layer = source.dock_layer - self.dock_row = source.dock_row - self.dock_pos = source.dock_pos - self.dock_proportion = source.dock_proportion - self.floating_pos = wx.Point(*source.floating_pos) - self.floating_size = wx.Size(*source.floating_size) - self.rect = wx.Rect(*source.rect) - - return self - - - def DefaultPane(self): - """ Specifies that the pane should adopt the default pane settings. """ - - state = self.state - state |= self.optionTopDockable | self.optionBottomDockable | \ - self.optionLeftDockable | self.optionRightDockable | \ - self.optionNotebookDockable | \ - self.optionFloatable | self.optionMovable | self.optionResizable | \ - self.optionCaption | self.optionPaneBorder | self.buttonClose - - self.state = state - - return self - - - def CentrePane(self): - """ - Specifies that the pane should adopt the default center pane settings. - - Centre panes usually do not have caption bars. This function provides an easy way of - preparing a pane to be displayed in the center dock position. - """ - - return self.CenterPane() - - - def CenterPane(self): - """ - Specifies that the pane should adopt the default center pane settings. - - Centre panes usually do not have caption bars. This function provides an easy way of - preparing a pane to be displayed in the center dock position. - """ - - self.state = 0 - return self.Center().PaneBorder().Resizable() - - - def ToolbarPane(self): - """ Specifies that the pane should adopt the default toolbar pane settings. """ - - self.DefaultPane() - state = self.state - - state |= (self.optionToolbar | self.optionGripper) - state &= ~(self.optionResizable | self.optionCaption | self.optionCaptionLeft) - - if self.dock_layer == 0: - self.dock_layer = 10 - - self.state = state - - return self - - - def Icon(self, icon): - """ - Specifies whether an icon is drawn on the left of the caption text when - the pane is docked. If `icon` is ``None`` or `wx.NullIcon`, no icon is drawn on - the caption space. - - :param icon: an icon to draw on the caption space, or ``None``. - """ - - if icon is None: - icon = wx.NullIcon - - self.icon = icon - return self - - - def SetFlag(self, flag, option_state): - """ - Turns the property given by `flag` on or off with the `option_state` - parameter. - - :param `flag`: the property to set; - :param `option_state`: either ``True`` or ``False``. - """ - - state = self.state - - if option_state: - state |= flag - else: - state &= ~flag - - self.state = state - - if flag in [self.buttonClose, self.buttonMaximize, self.buttonMinimize, self.buttonPin]: - self.ResetButtons() - - return self - - - def HasFlag(self, flag): - """ - Returns ``True`` if the the property specified by flag is active for the pane. - - :param `flag`: the property to check for activity. - """ - - return (self.state & flag and [True] or [False])[0] - - - def ResetButtons(self): - """ - Resets all the buttons and recreates them from scratch depending on the - L{AuiPaneInfo} flags. - """ - - floating = self.HasFlag(self.optionFloating) - self.buttons = [] - - if not floating and self.HasMinimizeButton(): - button = AuiPaneButton(AUI_BUTTON_MINIMIZE) - self.buttons.append(button) - - if not floating and self.HasMaximizeButton(): - button = AuiPaneButton(AUI_BUTTON_MAXIMIZE_RESTORE) - self.buttons.append(button) - - if not floating and self.HasPinButton(): - button = AuiPaneButton(AUI_BUTTON_PIN) - self.buttons.append(button) - - if self.HasCloseButton(): - button = AuiPaneButton(AUI_BUTTON_CLOSE) - self.buttons.append(button) - - - def CountButtons(self): - """ Returns the number of visible buttons in the docked pane. """ - - n = 0 - - if self.HasCaption() or self.HasCaptionLeft(): - if isinstance(wx.GetTopLevelParent(self.window), AuiFloatingFrame): - return 1 - - if self.HasCloseButton(): - n += 1 - if self.HasMaximizeButton(): - n += 1 - if self.HasMinimizeButton(): - n += 1 - if self.HasPinButton(): - n += 1 - - return n - - - def IsHorizontal(self): - """ Returns ``True`` if the pane `dock_direction` is horizontal. """ - - return self.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM] - - def IsVertical(self): - """ Returns ``True`` if the pane `dock_direction` is vertical. """ - - return self.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT] - - -# Null AuiPaneInfo reference -NonePaneInfo = AuiPaneInfo() - - -# ---------------------------------------------------------------------------- # - -class AuiDockingGuide(wx.Frame): - """ Base class for L{AuiCenterDockingGuide} and L{AuiSingleDockingGuide}.""" - - def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, - size=wx.DefaultSize, style=wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | - wx.FRAME_NO_TASKBAR | wx.NO_BORDER, name="AuiDockingGuide"): - """ - Default class constructor. Used internally, do not call it in your code! - - :param `parent`: the L{AuiDockingGuide} parent; - :param `id`: the window identifier. It may take a value of -1 to indicate a default value. - :param `title`: the caption to be displayed on the frame's title bar. - :param `pos`: the window position. A value of (-1, -1) indicates a default position, - chosen by either the windowing system or wxPython, depending on platform. - :param `size`: the window size. A value of (-1, -1) indicates a default size, chosen by - either the windowing system or wxPython, depending on platform. - :param `style`: the window style. - :param `name`: the name of the window. This parameter is used to associate a name with the - item, allowing the application user to set Motif resource values for individual windows. - """ - - wx.Frame.__init__(self, parent, id, title, pos, size, style, name=name) - - - def HitTest(self, x, y): - """ - To be overridden by parent classes. - - :param `x`: the `x` mouse position; - :param `y`: the `y` mouse position. - """ - - return 0 - - - def ValidateNotebookDocking(self, valid): - """ - To be overridden by parent classes. - - :param `valid`: whether a pane can be docked on top to another to form an automatic - L{AuiNotebook}. - """ - - return 0 - -# ============================================================================ -# implementation -# ============================================================================ - -# --------------------------------------------------------------------------- -# AuiDockingGuideWindow -# --------------------------------------------------------------------------- - -class AuiDockingGuideWindow(wx.Window): - """ Target class for L{AuiSingleDockingGuide} and L{AuiCenterDockingGuide}. """ - - def __init__(self, parent, rect, direction=0, center=False, useAero=False): - """ - Default class constructor. Used internally, do not call it in your code! - - :param `parent`: the L{AuiDockingGuideWindow} parent; - :param `rect`: the window rect; - :param `direction`: one of ``wx.TOP``, ``wx.BOTTOM``, ``wx.LEFT``, ``wx.RIGHT``, - ``wx.CENTER``; - :param `center`: whether the calling class is a L{AuiCenterDockingGuide}; - :param `useAero`: whether to use the new Aero-style bitmaps or Whidbey-style bitmaps - for the docking guide. - """ - - wx.Window.__init__(self, parent, -1, rect.GetPosition(), rect.GetSize(), wx.NO_BORDER) - - self._direction = direction - self._center = center - self._valid = True - self._useAero = useAero - - self._bmp_unfocus, self._bmp_focus = GetDockingImage(direction, useAero, center) - - self._currentImage = self._bmp_unfocus - self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) - - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) - self.Bind(wx.EVT_PAINT, self.OnPaint) - - - def SetValid(self, valid): - """ - Sets the docking direction as valid or invalid. - - :param `valid`: whether the docking direction is allowed or not. - """ - - self._valid = valid - - - def IsValid(self): - """ Returns whether the docking direction is valid. """ - - return self._valid - - - def OnEraseBackground(self, event): - """ - Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiDockingGuideWindow}. - - :param `event`: a `wx.EraseEvent` to be processed. - - :note: This is intentionally empty to reduce flickering while drawing. - """ - - pass - - - def DrawBackground(self, dc): - """ - Draws the docking guide background. - - :param `dc`: a `wx.DC` device context object. - """ - - rect = self.GetClientRect() - - dc.SetPen(wx.TRANSPARENT_PEN) - dc.SetBrush(wx.Brush(colourTargetBackground)) - dc.DrawRectangleRect(rect) - - dc.SetPen(wx.Pen(colourTargetBorder)) - - left = rect.GetLeft() - top = rect.GetTop() - right = rect.GetRight() - bottom = rect.GetBottom() - - if self._direction != wx.CENTER: - - if not self._center or self._direction != wx.BOTTOM: - dc.DrawLine(left, top, right+1, top) - if not self._center or self._direction != wx.RIGHT: - dc.DrawLine(left, top, left, bottom+1) - if not self._center or self._direction != wx.LEFT: - dc.DrawLine(right, top, right, bottom+1) - if not self._center or self._direction != wx.TOP: - dc.DrawLine(left, bottom, right+1, bottom) - - dc.SetPen(wx.Pen(colourTargetShade)) - - if self._direction != wx.RIGHT: - dc.DrawLine(left + 1, top + 1, left + 1, bottom) - if self._direction != wx.BOTTOM: - dc.DrawLine(left + 1, top + 1, right, top + 1) - - - def DrawDottedLine(self, dc, point, length, vertical): - """ - Draws a dotted line (not used if the docking guide images are ok). - - :param `dc`: a `wx.DC` device context object; - :param `point`: a `wx.Point` where to start drawing the dotted line; - :param `length`: the length of the dotted line; - :param `vertical`: whether it is a vertical docking guide window or not. - """ - - for i in xrange(0, length, 2): - dc.DrawPoint(point.x, point.y) - if vertical: - point.y += 2 - else: - point.x += 2 - - - def DrawIcon(self, dc): - """ - Draws the docking guide icon (not used if the docking guide images are ok). - - :param `dc`: a `wx.DC` device context object. - """ - - rect = wx.Rect(*self.GetClientRect()) - point = wx.Point() - length = 0 - - rect.Deflate(4, 4) - dc.SetPen(wx.Pen(colourIconBorder)) - dc.SetBrush(wx.Brush(colourIconBackground)) - dc.DrawRectangleRect(rect) - - right1 = rect.GetRight() + 1 - bottom1 = rect.GetBottom() + 1 - - dc.SetPen(wx.Pen(colourIconShadow)) - dc.DrawLine(rect.x + 1, bottom1, right1 + 1, bottom1) - dc.DrawLine(right1, rect.y + 1, right1, bottom1 + 1) - - rect.Deflate(1, 1) - - if self._direction == wx.TOP: - rect.height -= rect.height / 2 - point = rect.GetBottomLeft() - length = rect.width - - elif self._direction == wx.LEFT: - rect.width -= rect.width / 2 - point = rect.GetTopRight() - length = rect.height - - elif self._direction == wx.RIGHT: - rect.x += rect.width / 2 - rect.width -= rect.width / 2 - point = rect.GetTopLeft() - length = rect.height - - elif self._direction == wx.BOTTOM: - rect.y += rect.height / 2 - rect.height -= rect.height / 2 - point = rect.GetTopLeft() - length = rect.width - - elif self._direction == wx.CENTER: - rect.Deflate(1, 1) - point = rect.GetTopLeft() - length = rect.width - - dc.GradientFillLinear(rect, colourIconDockingPart1, - colourIconDockingPart2, self._direction) - - dc.SetPen(wx.Pen(colourIconBorder)) - - if self._direction == wx.CENTER: - self.DrawDottedLine(dc, rect.GetTopLeft(), rect.width, False) - self.DrawDottedLine(dc, rect.GetTopLeft(), rect.height, True) - self.DrawDottedLine(dc, rect.GetBottomLeft(), rect.width, False) - self.DrawDottedLine(dc, rect.GetTopRight(), rect.height, True) - - elif self._direction in [wx.TOP, wx.BOTTOM]: - self.DrawDottedLine(dc, point, length, False) - - else: - self.DrawDottedLine(dc, point, length, True) - - - def DrawArrow(self, dc): - """ - Draws the docking guide arrow icon (not used if the docking guide images are ok). - - :param `dc`: a `wx.DC` device context object. - """ - - rect = self.GetClientRect() - point = wx.Point() - - point.x = (rect.GetLeft() + rect.GetRight()) / 2 - point.y = (rect.GetTop() + rect.GetBottom()) / 2 - rx, ry = wx.Size(), wx.Size() - - if self._direction == wx.TOP: - rx = wx.Size(1, 0) - ry = wx.Size(0, 1) - - elif self._direction == wx.LEFT: - rx = wx.Size(0, -1) - ry = wx.Size(1, 0) - - elif self._direction == wx.RIGHT: - rx = wx.Size(0, 1) - ry = wx.Size(-1, 0) - - elif self._direction == wx.BOTTOM: - rx = wx.Size(-1, 0) - ry = wx.Size(0, -1) - - point.x += ry.x*3 - point.y += ry.y*3 - - dc.SetPen(wx.Pen(colourIconArrow)) - - for i in xrange(4): - pt1 = wx.Point(point.x - rx.x*i, point.y - rx.y*i) - pt2 = wx.Point(point.x + rx.x*(i+1), point.y + rx.y*(i+1)) - dc.DrawLinePoint(pt1, pt2) - point.x += ry.x - point.y += ry.y - - - def OnPaint(self, event): - """ - Handles the ``wx.EVT_PAINT`` event for L{AuiDockingGuideWindow}. - - :param `event`: a `wx.PaintEvent` to be processed. - """ - - dc = wx.AutoBufferedPaintDC(self) - if self._currentImage.IsOk() and self._valid: - dc.DrawBitmap(self._currentImage, 0, 0, True) - else: - self.Draw(dc) - - - def Draw(self, dc): - """ - Draws the whole docking guide window (not used if the docking guide images are ok). - - :param `dc`: a `wx.DC` device context object. - """ - - self.DrawBackground(dc) - - if self._valid: - self.DrawIcon(dc) - self.DrawArrow(dc) - - - def UpdateDockGuide(self, pos): - """ - Updates the docking guide images depending on the mouse position, using focused - images if the mouse is inside the docking guide or unfocused images if it is - outside. - - :param `pos`: a `wx.Point` mouse position. - """ - - inside = self.GetScreenRect().Contains(pos) - - if inside: - image = self._bmp_focus - else: - image = self._bmp_unfocus - - if image != self._currentImage: - self._currentImage = image - self.Refresh() - self.Update() - - -# --------------------------------------------------------------------------- -# AuiSingleDockingGuide -# --------------------------------------------------------------------------- - -class AuiSingleDockingGuide(AuiDockingGuide): - """ A docking guide window for single docking hint (not diamond-shaped HUD). """ - - def __init__(self, parent, direction=0): - """ - Default class constructor. Used internally, do not call it in your code! - - :param `parent`: the L{AuiSingleDockingGuide} parent; - :param `direction`: one of ``wx.TOP``, ``wx.BOTTOM``, ``wx.LEFT``, ``wx.RIGHT``. - """ - - self._direction = direction - - style = wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | \ - wx.FRAME_NO_TASKBAR | wx.NO_BORDER - - # Use of FRAME_SHAPED on wxMac causes the frame to be visible - # breaking the docking hints. - if wx.Platform != '__WXMAC__': - style |= wx.FRAME_SHAPED - - AuiDockingGuide.__init__(self, parent, style=style, name="auiSingleDockTarget") - - self.Hide() - - useAero = GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_AERO_DOCKING_GUIDES - useWhidbey = GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_WHIDBEY_DOCKING_GUIDES - - self._useAero = useAero or useWhidbey - self._valid = True - - if useAero: - sizeX, sizeY = aeroguideSizeX, aeroguideSizeY - elif useWhidbey: - sizeX, sizeY = whidbeySizeX, whidbeySizeY - else: - sizeX, sizeY = guideSizeX, guideSizeY - - if direction not in [wx.TOP, wx.BOTTOM]: - sizeX, sizeY = sizeY, sizeX - - if self._useAero: - self.CreateShapesWithStyle(useWhidbey) - - if wx.Platform == "__WXGTK__": - self.Bind(wx.EVT_WINDOW_CREATE, self.SetGuideShape) - else: - self.SetGuideShape() - - self.SetSize(self.region.GetBox().GetSize()) - else: - self.SetSize((sizeX, sizeY)) - - self.rect = wx.Rect(0, 0, sizeX, sizeY) - - if self._useAero: - useAero = (useWhidbey and [2] or [1])[0] - else: - useAero = 0 - - self.target = AuiDockingGuideWindow(self, self.rect, direction, False, useAero) - - - def CreateShapesWithStyle(self, useWhidbey): - """ - Creates the docking guide window shape based on which docking bitmaps are used. - - :param `useWhidbey`: if ``True``, use Whidbey-style bitmaps; if ``False``, use the - Aero-style bitmaps. - """ - - sizeX, sizeY = aeroguideSizeX, aeroguideSizeY - if useWhidbey: - sizeX, sizeY = whidbeySizeX, whidbeySizeY - - if self._direction not in [wx.TOP, wx.BOTTOM]: - sizeX, sizeY = sizeY, sizeX - - useAero = (useWhidbey and [2] or [1])[0] - bmp, dummy = GetDockingImage(self._direction, useAero, False) - region = wx.RegionFromBitmap(bmp) - - self.region = region - - - def AeroMove(self, pos): - """ - Moves the docking window to the new position. Overridden in children classes. - - :param `pos`: the new docking guide position. - """ - - pass - - - def SetGuideShape(self, event=None): - """ - Sets the correct shape for the docking guide window. - - :param `event`: on wxGTK, a `wx.WindowCreateEvent` event to process. - """ - - self.SetShape(self.region) - - if event is not None: - # Skip the event on wxGTK - event.Skip() - wx.CallAfter(wx.SafeYield, self, True) - - - def SetShape(self, region): - """ - If the platform supports it, sets the shape of the window to that depicted by `region`. - The system will not display or respond to any mouse event for the pixels that lie - outside of the region. To reset the window to the normal rectangular shape simply call - L{SetShape} again with an empty region. - - :param `region`: the shape of the frame. - - :note: Overridden for wxMac. - """ - - if wx.Platform == '__WXMAC__': - # HACK so we don't crash when SetShape is called - return - else: - super(AuiSingleDockingGuide, self).SetShape(region) - - - def SetValid(self, valid): - """ - Sets the docking direction as valid or invalid. - - :param `valid`: whether the docking direction is allowed or not. - """ - - self._valid = valid - - - def IsValid(self): - """ Returns whether the docking direction is valid. """ - - return self._valid - - - def UpdateDockGuide(self, pos): - """ - Updates the docking guide images depending on the mouse position, using focused - images if the mouse is inside the docking guide or unfocused images if it is - outside. - - :param `pos`: a `wx.Point` mouse position. - """ - - self.target.UpdateDockGuide(pos) - - - def HitTest(self, x, y): - """ - Checks if the mouse position is inside the target window rect. - - :param `x`: the `x` mouse position; - :param `y`: the `y` mouse position. - """ - - if self.target.GetScreenRect().Contains((x, y)): - return wx.ALL - - return -1 - - -# --------------------------------------------------------------------------- -# AuiCenterDockingGuide -# --------------------------------------------------------------------------- - -class AuiCenterDockingGuide(AuiDockingGuide): - """ A docking guide window for multiple docking hint (diamond-shaped HUD). """ - - def __init__(self, parent): - """ - Default class constructor. - Used internally, do not call it in your code! - - :param `parent`: the L{AuiCenterDockingGuide} parent. - """ - - AuiDockingGuide.__init__(self, parent, style=wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | - wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.FRAME_SHAPED, - name="auiCenterDockTarget") - - self.Hide() - - self.CreateShapesWithStyle() - self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) - - if wx.Platform == "__WXGTK__": - self.Bind(wx.EVT_WINDOW_CREATE, self.SetGuideShape) - else: - self.SetGuideShape() - - self.SetSize(self.region.GetBox().GetSize()) - - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) - self.Bind(wx.EVT_PAINT, self.OnPaint) - - - def CreateShapesWithStyle(self): - """ Creates the docking guide window shape based on which docking bitmaps are used. """ - - useAero = (GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_AERO_DOCKING_GUIDES) != 0 - useWhidbey = (GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_WHIDBEY_DOCKING_GUIDES) != 0 - - self._useAero = 0 - if useAero: - self._useAero = 1 - elif useWhidbey: - self._useAero = 2 - - if useAero: - sizeX, sizeY = aeroguideSizeX, aeroguideSizeY - elif useWhidbey: - sizeX, sizeY = whidbeySizeX, whidbeySizeY - else: - sizeX, sizeY = guideSizeX, guideSizeY - - rectLeft = wx.Rect(0, sizeY, sizeY, sizeX) - rectTop = wx.Rect(sizeY, 0, sizeX, sizeY) - rectRight = wx.Rect(sizeY+sizeX, sizeY, sizeY, sizeX) - rectBottom = wx.Rect(sizeY, sizeX + sizeY, sizeX, sizeY) - rectCenter = wx.Rect(sizeY, sizeY, sizeX, sizeX) - - if not self._useAero: - - self.targetLeft = AuiDockingGuideWindow(self, rectLeft, wx.LEFT, True, useAero) - self.targetTop = AuiDockingGuideWindow(self, rectTop, wx.TOP, True, useAero) - self.targetRight = AuiDockingGuideWindow(self, rectRight, wx.RIGHT, True, useAero) - self.targetBottom = AuiDockingGuideWindow(self, rectBottom, wx.BOTTOM, True, useAero) - self.targetCenter = AuiDockingGuideWindow(self, rectCenter, wx.CENTER, True, useAero) - - - # top-left diamond - tld = [wx.Point(rectTop.x, rectTop.y+rectTop.height-8), - wx.Point(rectLeft.x+rectLeft.width-8, rectLeft.y), - rectTop.GetBottomLeft()] - # bottom-left diamond - bld = [wx.Point(rectLeft.x+rectLeft.width-8, rectLeft.y+rectLeft.height), - wx.Point(rectBottom.x, rectBottom.y+8), - rectBottom.GetTopLeft()] - # top-right diamond - trd = [wx.Point(rectTop.x+rectTop.width, rectTop.y+rectTop.height-8), - wx.Point(rectRight.x+8, rectRight.y), - rectRight.GetTopLeft()] - # bottom-right diamond - brd = [wx.Point(rectRight.x+8, rectRight.y+rectRight.height), - wx.Point(rectBottom.x+rectBottom.width, rectBottom.y+8), - rectBottom.GetTopRight()] - - self._triangles = [tld[0:2], bld[0:2], - [wx.Point(rectTop.x+rectTop.width-1, rectTop.y+rectTop.height-8), - wx.Point(rectRight.x+7, rectRight.y)], - [wx.Point(rectRight.x+7, rectRight.y+rectRight.height), - wx.Point(rectBottom.x+rectBottom.width-1, rectBottom.y+8)]] - - region = wx.Region() - region.UnionRect(rectLeft) - region.UnionRect(rectTop) - region.UnionRect(rectRight) - region.UnionRect(rectBottom) - region.UnionRect(rectCenter) - region.UnionRegion(wx.RegionFromPoints(tld)) - region.UnionRegion(wx.RegionFromPoints(bld)) - region.UnionRegion(wx.RegionFromPoints(trd)) - region.UnionRegion(wx.RegionFromPoints(brd)) - - elif useAero: - - self._aeroBmp = aero_dock_pane.GetBitmap() - region = wx.RegionFromBitmap(self._aeroBmp) - - self._allAeroBmps = [aero_dock_pane_left.GetBitmap(), aero_dock_pane_top.GetBitmap(), - aero_dock_pane_right.GetBitmap(), aero_dock_pane_bottom.GetBitmap(), - aero_dock_pane_center.GetBitmap(), aero_dock_pane.GetBitmap()] - self._deniedBitmap = aero_denied.GetBitmap() - self._aeroRects = [rectLeft, rectTop, rectRight, rectBottom, rectCenter] - self._valid = True - - elif useWhidbey: - - self._aeroBmp = whidbey_dock_pane.GetBitmap() - region = wx.RegionFromBitmap(self._aeroBmp) - - self._allAeroBmps = [whidbey_dock_pane_left.GetBitmap(), whidbey_dock_pane_top.GetBitmap(), - whidbey_dock_pane_right.GetBitmap(), whidbey_dock_pane_bottom.GetBitmap(), - whidbey_dock_pane_center.GetBitmap(), whidbey_dock_pane.GetBitmap()] - self._deniedBitmap = whidbey_denied.GetBitmap() - self._aeroRects = [rectLeft, rectTop, rectRight, rectBottom, rectCenter] - self._valid = True - - - self.region = region - - - def SetGuideShape(self, event=None): - """ - Sets the correct shape for the docking guide window. - - :param `event`: on wxGTK, a `wx.WindowCreateEvent` event to process. - """ - - self.SetShape(self.region) - - if event is not None: - # Skip the event on wxGTK - event.Skip() - wx.CallAfter(wx.SafeYield, self, True) - - - def UpdateDockGuide(self, pos): - """ - Updates the docking guides images depending on the mouse position, using focused - images if the mouse is inside the docking guide or unfocused images if it is - outside. - - :param `pos`: a `wx.Point` mouse position. - """ - - if not self._useAero: - for target in self.GetChildren(): - target.UpdateDockGuide(pos) - else: - lenRects = len(self._aeroRects) - for indx, rect in enumerate(self._aeroRects): - if rect.Contains(pos): - if self._allAeroBmps[indx] != self._aeroBmp: - if indx < lenRects - 1 or (indx == lenRects - 1 and self._valid): - self._aeroBmp = self._allAeroBmps[indx] - self.Refresh() - else: - self._aeroBmp = self._allAeroBmps[-1] - self.Refresh() - - return - - if self._aeroBmp != self._allAeroBmps[-1]: - self._aeroBmp = self._allAeroBmps[-1] - self.Refresh() - - - def HitTest(self, x, y): - """ - Checks if the mouse position is inside the target windows rect. - - :param `x`: the `x` mouse position; - :param `y`: the `y` mouse position. - """ - - if not self._useAero: - if self.targetLeft.GetScreenRect().Contains((x, y)): - return wx.LEFT - if self.targetTop.GetScreenRect().Contains((x, y)): - return wx.UP - if self.targetRight.GetScreenRect().Contains((x, y)): - return wx.RIGHT - if self.targetBottom.GetScreenRect().Contains((x, y)): - return wx.DOWN - if self.targetCenter.IsValid() and self.targetCenter.GetScreenRect().Contains((x, y)): - return wx.CENTER - else: - constants = [wx.LEFT, wx.UP, wx.RIGHT, wx.DOWN, wx.CENTER] - lenRects = len(self._aeroRects) - for indx, rect in enumerate(self._aeroRects): - if rect.Contains((x, y)): - if indx < lenRects or (indx == lenRects-1 and self._valid): - return constants[indx] - - return -1 - - - def ValidateNotebookDocking(self, valid): - """ - Sets whether a pane can be docked on top of another to create an automatic - L{AuiNotebook}. - - :param `valid`: whether a pane can be docked on top to another to form an automatic - L{AuiNotebook}. - """ - - if not self._useAero: - if self.targetCenter.IsValid() != valid: - self.targetCenter.SetValid(valid) - self.targetCenter.Refresh() - else: - if self._valid != valid: - self._valid = valid - self.Refresh() - - - def AeroMove(self, pos): - """ - Moves the docking guide window to the new position. - - :param `pos`: the new docking guide position. - """ - - if not self._useAero: - return - - useWhidbey = (GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_WHIDBEY_DOCKING_GUIDES) != 0 - - if useWhidbey: - sizeX, sizeY = whidbeySizeX, whidbeySizeY - else: - sizeX, sizeY = aeroguideSizeX, aeroguideSizeY - - size = self.GetSize() - - leftRect, topRect, rightRect, bottomRect, centerRect = self._aeroRects - thePos = pos + wx.Point((size.x-sizeY)/2, (size.y-sizeX)/2) - - centerRect.SetPosition(thePos) - - leftRect.SetPosition(thePos + wx.Point(-sizeY, 0)) - topRect.SetPosition(thePos + wx.Point(0, -sizeY)) - rightRect.SetPosition(thePos + wx.Point(sizeX, 0)) - bottomRect.SetPosition(thePos + wx.Point(0, sizeX)) - - - def OnEraseBackground(self, event): - """ - Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiCenterDockingGuide}. - - :param `event`: `wx.EraseEvent` to be processed. - - :note: This is intentionally empty to reduce flickering while drawing. - """ - - pass - - - def OnPaint(self, event): - """ - Handles the ``wx.EVT_PAINT`` event for L{AuiCenterDockingGuide}. - - :param `event`: a `wx.PaintEvent` to be processed. - """ - - dc = wx.AutoBufferedPaintDC(self) - - if self._useAero: - dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.SetPen(wx.TRANSPARENT_PEN) - else: - dc.SetBrush(wx.Brush(colourTargetBackground)) - dc.SetPen(wx.Pen(colourTargetBorder)) - - rect = self.GetClientRect() - dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) - - if self._useAero: - dc.DrawBitmap(self._aeroBmp, 0, 0, True) - if not self._valid: - diff = (self._useAero == 2 and [1] or [0])[0] - bmpX, bmpY = self._deniedBitmap.GetWidth(), self._deniedBitmap.GetHeight() - xPos, yPos = (rect.x + (rect.width)/2 - bmpX/2), (rect.y + (rect.height)/2 - bmpY/2) - dc.DrawBitmap(self._deniedBitmap, xPos+1, yPos+diff, True) - - return - - dc.SetPen(wx.Pen(colourTargetBorder, 2)) - for pts in self._triangles: - dc.DrawLinePoint(pts[0], pts[1]) - - -# ---------------------------------------------------------------------------- -# AuiDockingHintWindow -# ---------------------------------------------------------------------------- - -class AuiDockingHintWindow(wx.Frame): - """ The original wxAUI docking window hint. """ - - def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, - size=wx.Size(1, 1), style=wx.FRAME_TOOL_WINDOW | wx.FRAME_FLOAT_ON_PARENT | - wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.FRAME_SHAPED, - name="auiHintWindow"): - """ - Default class constructor. Used internally, do not call it in your code! - - :param `parent`: the L{AuiDockingGuide} parent; - :param `id`: the window identifier. It may take a value of -1 to indicate a default value. - :param `title`: the caption to be displayed on the frame's title bar; - :param `pos`: the window position. A value of (-1, -1) indicates a default position, - chosen by either the windowing system or wxPython, depending on platform; - :param `size`: the window size. A value of (-1, -1) indicates a default size, chosen by - either the windowing system or wxPython, depending on platform; - :param `style`: the window style; - :param `name`: the name of the window. This parameter is used to associate a name with the - item, allowing the application user to set Motif resource values for individual windows. - """ - if wx.Platform == '__WXMAC__' and style & wx.FRAME_SHAPED: - # Having the shaped frame causes the frame to not be visible - # with the transparent style hints. - style -= wx.FRAME_SHAPED - - wx.Frame.__init__(self, parent, id, title, pos, size, style, name=name) - - self._blindMode = False - self.SetBackgroundColour(colourHintBackground) - - # Can't set background colour on a frame on wxMac - # so add a panel to set the colour on. - if wx.Platform == '__WXMAC__': - sizer = wx.BoxSizer(wx.HORIZONTAL) - self.panel = wx.Panel(self) - sizer.Add(self.panel, 1, wx.EXPAND) - self.SetSizer(sizer) - self.panel.SetBackgroundColour(colourHintBackground) - - self.Bind(wx.EVT_SIZE, self.OnSize) - - - def MakeVenetianBlinds(self): - """ - Creates the "venetian blind" effect if L{AuiManager} has the ``AUI_MGR_VENETIAN_BLINDS_HINT`` - flag set. - """ - - amount = 128 - size = self.GetClientSize() - region = wx.Region(0, 0, size.x, 1) - - for y in xrange(size.y): - - # Reverse the order of the bottom 4 bits - j = (y & 8 and [1] or [0])[0] | (y & 4 and [2] or [0])[0] | \ - (y & 2 and [4] or [0])[0] | (y & 1 and [8] or [0])[0] - - if 16*j+8 < amount: - region.Union(0, y, size.x, 1) - - self.SetShape(region) - - - def SetBlindMode(self, agwFlags): - """ - Sets whether venetian blinds or transparent hints will be shown as docking hint. - This depends on the L{AuiManager} flags. - - :param `agwFlags`: the L{AuiManager} flags. - """ - - self._blindMode = (agwFlags & AUI_MGR_VENETIAN_BLINDS_HINT) != 0 - - if self._blindMode or not self.CanSetTransparent(): - self.MakeVenetianBlinds() - self.SetTransparent(255) - - else: - self.SetShape(wx.Region()) - if agwFlags & AUI_MGR_HINT_FADE == 0: - self.SetTransparent(80) - else: - self.SetTransparent(0) - - - def SetShape(self, region): - """ - If the platform supports it, sets the shape of the window to that depicted by `region`. - The system will not display or respond to any mouse event for the pixels that lie - outside of the region. To reset the window to the normal rectangular shape simply call - L{SetShape} again with an empty region. - - :param `region`: the shape of the frame (an instance of `wx.Region`). - - :note: Overridden for wxMac. - """ - - if wx.Platform == '__WXMAC__': - # HACK so we don't crash when SetShape is called - return - else: - super(AuiDockingHintWindow, self).SetShape(region) - - - def Show(self, show=True): - """ - Show the hint window. - - :param `show`: whether to show or hide the hint docking window. - """ - - super(AuiDockingHintWindow, self).Show(show) - if wx.Platform == '__WXMAC__': - # Need to manually do layout since its a borderless frame. - self.Layout() - - - def OnSize(self, event): - """ - Handles the ``wx.EVT_SIZE`` event for L{AuiDockingHintWindow}. - - :param `event`: a `wx.SizeEvent` to be processed. - """ - - if self._blindMode or not self.CanSetTransparent(): - self.MakeVenetianBlinds() - - -# ---------------------------------------------------------------------------- # - -# -- AuiFloatingFrame class implementation -- - -class AuiFloatingFrame(wx.MiniFrame): - """ AuiFloatingFrame is the frame class that holds floating panes. """ - - def __init__(self, parent, owner_mgr, pane=None, id=wx.ID_ANY, title="", - style=wx.FRAME_TOOL_WINDOW | wx.FRAME_FLOAT_ON_PARENT | - wx.FRAME_NO_TASKBAR | wx.CLIP_CHILDREN): - """ - Default class constructor. Used internally, do not call it in your code! - - :param `parent`: the L{AuiFloatingFrame} parent; - :param `owner_mgr`: the L{AuiManager} that manages the floating pane; - :param `pane`: the L{AuiPaneInfo} pane that is about to float; - :param `id`: the window identifier. It may take a value of -1 to indicate a default value. - :param `title`: the caption to be displayed on the frame's title bar. - :param `style`: the window style. - """ - - if pane and pane.IsResizeable(): - style += wx.RESIZE_BORDER - if pane: - self._is_toolbar = pane.IsToolbar() - - self._useNativeMiniframes = False - if AuiManager_UseNativeMiniframes(owner_mgr): - # On wxMac we always use native miniframes - self._useNativeMiniframes = True - style += wx.CAPTION + wx.SYSTEM_MENU - if pane.HasCloseButton(): - style += wx.CLOSE_BOX - if pane.HasMaximizeButton(): - style += wx.MAXIMIZE_BOX - if pane.HasMinimizeButton(): - style += wx.MINIMIZE_BOX - - wx.MiniFrame.__init__(self, parent, id, title, pos=pane.floating_pos, - size=pane.floating_size, style=style, name="auiFloatingFrame") - - self._fly_timer = wx.Timer(self, wx.ID_ANY) - self._check_fly_timer = wx.Timer(self, wx.ID_ANY) - - self.Bind(wx.EVT_CLOSE, self.OnClose) - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Bind(wx.EVT_ACTIVATE, self.OnActivate) - self.Bind(wx.EVT_TIMER, self.OnCheckFlyTimer, self._check_fly_timer) - self.Bind(wx.EVT_TIMER, self.OnFlyTimer, self._fly_timer) - self.Bind(EVT_AUI_FIND_MANAGER, self.OnFindManager) - - if self._useNativeMiniframes: - self.Bind(wx.EVT_MOVE, self.OnMoveEvent) - self.Bind(wx.EVT_MOVING, self.OnMoveEvent) - self.Bind(wx.EVT_IDLE, self.OnIdle) - self._useNativeMiniframes = True - self.SetExtraStyle(wx.WS_EX_PROCESS_IDLE) - else: - self.Bind(wx.EVT_MOVE, self.OnMove) - - self._fly = False - self._send_size = True - self._alpha_amount = 255 - - self._owner_mgr = owner_mgr - self._moving = False - self._lastDirection = None - self._transparent = 255 - - self._last_rect = wx.Rect() - self._last2_rect = wx.Rect() - self._last3_rect = wx.Rect() - - self._mgr = AuiManager() - self._mgr.SetManagedWindow(self) - self._mgr.SetArtProvider(owner_mgr.GetArtProvider()) - self._mgr.SetAGWFlags(owner_mgr.GetAGWFlags()) - - - def CopyAttributes(self, pane): - """ - Copies all the attributes of the input `pane` into another L{AuiPaneInfo}. - - :param `pane`: the source L{AuiPaneInfo} from where to copy attributes. - """ - - contained_pane = AuiPaneInfo() - - contained_pane.name = pane.name - contained_pane.caption = pane.caption - contained_pane.window = pane.window - contained_pane.frame = pane.frame - contained_pane.state = pane.state - contained_pane.dock_direction = pane.dock_direction - contained_pane.dock_layer = pane.dock_layer - contained_pane.dock_row = pane.dock_row - contained_pane.dock_pos = pane.dock_pos - contained_pane.best_size = wx.Size(*pane.best_size) - contained_pane.min_size = wx.Size(*pane.min_size) - contained_pane.max_size = wx.Size(*pane.max_size) - contained_pane.floating_pos = wx.Point(*pane.floating_pos) - contained_pane.floating_size = wx.Size(*pane.floating_size) - contained_pane.dock_proportion = pane.dock_proportion - contained_pane.buttons = pane.buttons - contained_pane.rect = wx.Rect(*pane.rect) - contained_pane.icon = pane.icon - contained_pane.notebook_id = pane.notebook_id - contained_pane.transparent = pane.transparent - contained_pane.snapped = pane.snapped - contained_pane.minimize_mode = pane.minimize_mode - - return contained_pane - - - def SetPaneWindow(self, pane): - """ - Sets all the properties of a pane. - - :param `pane`: the L{AuiPaneInfo} to analyze. - """ - - self._is_toolbar = pane.IsToolbar() - self._pane_window = pane.window - - if isinstance(pane.window, auibar.AuiToolBar): - pane.window.SetAuiManager(self._mgr) - - self._pane_window.Reparent(self) - - contained_pane = self.CopyAttributes(pane) - - contained_pane.Dock().Center().Show(). \ - CaptionVisible(False). \ - PaneBorder(False). \ - Layer(0).Row(0).Position(0) - - if not contained_pane.HasGripper() and not self._useNativeMiniframes: - contained_pane.CaptionVisible(True) - - indx = self._owner_mgr._panes.index(pane) - - # Carry over the minimum size - pane_min_size = pane.window.GetMinSize() - - # if the best size is smaller than the min size - # then set the min size to the best size as well - pane_best_size = contained_pane.best_size - if pane_best_size.IsFullySpecified() and (pane_best_size.x < pane_min_size.x or \ - pane_best_size.y < pane_min_size.y): - - pane_min_size = pane_best_size - self._pane_window.SetMinSize(pane_min_size) - - # if the frame window's max size is greater than the min size - # then set the max size to the min size as well - cur_max_size = self.GetMaxSize() - if cur_max_size.IsFullySpecified() and (cur_max_size.x < pane_min_size.x or \ - cur_max_size.y < pane_min_size.y): - self.SetMaxSize(pane_min_size) - - art_provider = self._mgr.GetArtProvider() - caption_size = art_provider.GetMetric(AUI_DOCKART_CAPTION_SIZE) - button_size = art_provider.GetMetric(AUI_DOCKART_PANE_BUTTON_SIZE) + \ - 4*art_provider.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) - - min_size = pane.window.GetMinSize() - - if min_size.y < caption_size or min_size.x < button_size: - new_x, new_y = min_size.x, min_size.y - if min_size.y < caption_size: - new_y = (pane.IsResizeable() and [2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)+caption_size] or [1])[0] - if min_size.x < button_size: - new_x = (pane.IsResizeable() and [2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_X)+button_size] or [1])[0] - - self.SetMinSize((new_x, new_y)) - else: - self.SetMinSize(min_size) - - self._mgr.AddPane(self._pane_window, contained_pane) - self._mgr.Update() - - if pane.min_size.IsFullySpecified(): - # because SetSizeHints() calls Fit() too (which sets the window - # size to its minimum allowed), we keep the size before calling - # SetSizeHints() and reset it afterwards... - tmp = self.GetSize() - self.GetSizer().SetSizeHints(self) - self.SetSize(tmp) - - self.SetTitle(pane.caption) - - if pane.floating_size != wx.Size(-1, -1): - self.SetSize(pane.floating_size) - else: - size = pane.best_size - if size == wx.Size(-1, -1): - size = pane.min_size - if size == wx.Size(-1, -1): - size = self._pane_window.GetSize() - if self._owner_mgr and pane.HasGripper(): - if pane.HasGripperTop(): - size.y += self._owner_mgr._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) - else: - size.x += self._owner_mgr._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) - - if not self._useNativeMiniframes: - size.y += self._owner_mgr._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - - pane.floating_size = size - - self.SetClientSize(size) - - self._owner_mgr._panes[indx] = pane - - self._fly_step = abs(pane.floating_size.y - \ - (caption_size + 2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)))/10 - - self._floating_size = wx.Size(*self.GetSize()) - - if pane.IsFlyOut(): - self._check_fly_timer.Start(50) - - - def GetOwnerManager(self): - """ Returns the L{AuiManager} that manages the pane. """ - - return self._owner_mgr - - - def OnSize(self, event): - """ - Handles the ``wx.EVT_SIZE`` event for L{AuiFloatingFrame}. - - :param `event`: a `wx.SizeEvent` to be processed. - """ - - if self._owner_mgr and self._send_size: - self._owner_mgr.OnFloatingPaneResized(self._pane_window, event.GetSize()) - - - def OnClose(self, event): - """ - Handles the ``wx.EVT_CLOSE`` event for L{AuiFloatingFrame}. - - :param `event`: a `wx.CloseEvent` to be processed. - """ - - if self._owner_mgr: - self._owner_mgr.OnFloatingPaneClosed(self._pane_window, event) - - if not event.GetVeto(): - self._mgr.DetachPane(self._pane_window) - - if isinstance(self._pane_window, auibar.AuiToolBar): - self._pane_window.SetAuiManager(self._owner_mgr) - - # if we do not do this, then we can crash... - if self._owner_mgr and self._owner_mgr._action_window == self: - self._owner_mgr._action_window = None - - self.Destroy() - - - def OnActivate(self, event): - """ - Handles the ``wx.EVT_ACTIVATE`` event for L{AuiFloatingFrame}. - - :param `event`: a `wx.ActivateEvent` to be processed. - """ - - if self._owner_mgr and event.GetActive(): - self._owner_mgr.OnFloatingPaneActivated(self._pane_window) - - - def OnMove(self, event): - """ - Handles the ``wx.EVT_MOVE`` event for L{AuiFloatingFrame}. - - :param `event`: a `wx.MoveEvent` to be processed. - - :note: This event is not processed on wxMAC or if L{AuiManager} is not using the - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. - """ - - if self._owner_mgr: - self._owner_mgr.OnFloatingPaneMoved(self._pane_window, event) - - - def OnMoveEvent(self, event): - """ - Handles the ``wx.EVT_MOVE`` and ``wx.EVT_MOVING`` events for L{AuiFloatingFrame}. - - :param `event`: a `wx.MoveEvent` to be processed. - - :note: This event is only processed on wxMAC or if L{AuiManager} is using the - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. - """ - - win_rect = self.GetRect() - - if win_rect == self._last_rect: - return - - # skip the first move event - if self._last_rect.IsEmpty(): - self._last_rect = wx.Rect(*win_rect) - return - - # skip if moving too fast to avoid massive redraws and - # jumping hint windows - if abs(win_rect.x - self._last_rect.x) > 3 or abs(win_rect.y - self._last_rect.y) > 3: - self._last3_rect = wx.Rect(*self._last2_rect) - self._last2_rect = wx.Rect(*self._last_rect) - self._last_rect = wx.Rect(*win_rect) - return - - # prevent frame redocking during resize - if self._last_rect.GetSize() != win_rect.GetSize(): - self._last3_rect = wx.Rect(*self._last2_rect) - self._last2_rect = wx.Rect(*self._last_rect) - self._last_rect = wx.Rect(*win_rect) - return - - self._last3_rect = wx.Rect(*self._last2_rect) - self._last2_rect = wx.Rect(*self._last_rect) - self._last_rect = wx.Rect(*win_rect) - - if _VERSION_STRING < "2.9": - leftDown = wx.GetMouseState().LeftDown() - else: - leftDown = wx.GetMouseState().LeftIsDown() - - if not leftDown: - return - - if not self._moving: - self.OnMoveStart(event) - self._moving = True - - if self._last3_rect.IsEmpty(): - return - - self.OnMoving(event) - - - def OnIdle(self, event): - """ - Handles the ``wx.EVT_IDLE`` event for L{AuiFloatingFrame}. - - :param `event`: a `wx.IdleEvent` event to be processed. - - :note: This event is only processed on wxMAC or if L{AuiManager} is using the - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. - """ - - if self._moving: - if _VERSION_STRING < "2.9": - leftDown = wx.GetMouseState().LeftDown() - else: - leftDown = wx.GetMouseState().LeftIsDown() - - if not leftDown: - self._moving = False - self.OnMoveFinished() - else: - event.RequestMore() - - - def OnMoveStart(self, event): - """ - The user has just started moving the floating pane. - - :param `event`: an instance of `wx.MouseEvent`. - - :note: This method is used only on wxMAC or if L{AuiManager} is using the - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. - """ - - # notify the owner manager that the pane has started to move - if self._owner_mgr: - if self._owner_mgr._from_move: - return - self._owner_mgr._action_window = self._pane_window - point = wx.GetMousePosition() - action_offset = point - self.GetPosition() - - if self._is_toolbar: - self._owner_mgr._toolbar_action_offset = action_offset - self._owner_mgr.OnMotion_DragToolbarPane(point) - else: - self._owner_mgr._action_offset = action_offset - self._owner_mgr.OnMotion_DragFloatingPane(point) - - - def OnMoving(self, event): - """ - The user is moving the floating pane. - - :param `event`: an instance of `wx.MouseEvent`. - - :note: This method is used only on wxMAC or if L{AuiManager} is using the - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. - """ - - # notify the owner manager that the pane is moving - self.OnMoveStart(event) - - - def OnMoveFinished(self): - """ - The user has just finished moving the floating pane. - - :note: This method is used only on wxMAC or if L{AuiManager} is using the - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. - """ - - # notify the owner manager that the pane has finished moving - if self._owner_mgr: - self._owner_mgr._action_window = self._pane_window - point = wx.GetMousePosition() - if self._is_toolbar: - self._owner_mgr.OnLeftUp_DragToolbarPane(point) - else: - self._owner_mgr.OnLeftUp_DragFloatingPane(point) - - self._owner_mgr.OnFloatingPaneMoved(self._pane_window, point) - - - def OnCheckFlyTimer(self, event): - """ - Handles the ``wx.EVT_TIMER`` event for L{AuiFloatingFrame}. - - :param `event`: a `wx.TimerEvent` to be processed. - - :note: This is used solely for "fly-out" panes. - """ - - if self._owner_mgr: - pane = self._mgr.GetPane(self._pane_window) - if pane.IsFlyOut(): - if self.IsShownOnScreen(): - self.FlyOut() - - - def OnFindManager(self, event): - """ - Handles the ``EVT_AUI_FIND_MANAGER`` event for L{AuiFloatingFrame}. - - :param `event`: a L{AuiManagerEvent} event to be processed. - """ - - event.SetManager(self._owner_mgr) - - - def FlyOut(self): - """ Starts the flying in and out of a floating pane. """ - - if self._fly_timer.IsRunning(): - return - - if _VERSION_STRING < "2.9": - leftDown = wx.GetMouseState().LeftDown() - else: - leftDown = wx.GetMouseState().LeftIsDown() - - if leftDown: - return - - rect = wx.Rect(*self.GetScreenRect()) - rect.Inflate(10, 10) - - if rect.Contains(wx.GetMousePosition()): - if not self._fly: - return - self._send_size = False - self._fly_timer.Start(5) - else: - if self._fly: - return - self._send_size = False - self._fly_timer.Start(5) - - - def OnFlyTimer(self, event): - """ - Handles the ``wx.EVT_TIMER`` event for L{AuiFloatingFrame}. - - :param `event`: a `wx.TimerEvent` to be processed. - """ - - current_size = self.GetClientSize() - floating_size = wx.Size(*self._owner_mgr.GetPane(self._pane_window).floating_size) - - if floating_size.y == -1: - floating_size = self._floating_size - - if not self._fly: - min_size = self._mgr.GetArtProvider().GetMetric(AUI_DOCKART_CAPTION_SIZE) - - if wx.Platform != "__WXMSW__": - min_size += 2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y) - - if current_size.y - self._fly_step <= min_size: - self.SetClientSize((current_size.x, min_size)) - self._fly = True - self._fly_timer.Stop() - self._send_size = True - else: - self.SetClientSize((current_size.x, current_size.y-self._fly_step)) - - else: - if current_size.y + self._fly_step >= floating_size.y: - self.SetClientSize((current_size.x, floating_size.y)) - self._fly = False - self._fly_timer.Stop() - self._send_size = True - else: - self.SetClientSize((current_size.x, current_size.y+self._fly_step)) - - self.Update() - self.Refresh() - - - def FadeOut(self): - """ Actually starts the fading out of the floating pane. """ - - while 1: - self._alpha_amount -= 10 - if self._alpha_amount <= 0: - self._alpha_amount = 255 - return - - self.SetTransparent(self._alpha_amount) - wx.SafeYield() - wx.MilliSleep(15) - - -# -- static utility functions -- - -def DrawResizeHint(dc, rect): - """ - Draws a resize hint while a sash is dragged. - - :param `rect`: a `wx.Rect` rectangle which specifies the sash dimensions. - """ - - if wx.Platform == "__WXMSW__" and wx.App.GetComCtl32Version() >= 600: - if wx.GetOsVersion()[1] > 5: - # Windows Vista - dc.SetPen(wx.Pen("black", 2, wx.SOLID)) - dc.SetBrush(wx.TRANSPARENT_BRUSH) - else: - # Draw the nice XP style splitter - dc.SetPen(wx.TRANSPARENT_PEN) - dc.SetBrush(wx.BLACK_BRUSH) - dc.SetLogicalFunction(wx.INVERT) - dc.DrawRectangleRect(rect) - dc.SetLogicalFunction(wx.COPY) - else: - stipple = PaneCreateStippleBitmap() - brush = wx.BrushFromBitmap(stipple) - dc.SetBrush(brush) - dc.SetPen(wx.TRANSPARENT_PEN) - - dc.SetLogicalFunction(wx.XOR) - dc.DrawRectangleRect(rect) - - -def CopyDocksAndPanes(src_docks, src_panes): - """ - This utility function creates shallow copies of - the dock and pane info. L{AuiDockInfo} usually contain pointers - to L{AuiPaneInfo} classes, thus this function is necessary to reliably - reconstruct that relationship in the new dock info and pane info arrays. - - :param `src_docks`: a list of L{AuiDockInfo} classes; - :param `src_panes`: a list of L{AuiPaneInfo} classes. - """ - - dest_docks = src_docks - dest_panes = src_panes - - for ii in xrange(len(dest_docks)): - dock = dest_docks[ii] - for jj in xrange(len(dock.panes)): - for kk in xrange(len(src_panes)): - if dock.panes[jj] == src_panes[kk]: - dock.panes[jj] = dest_panes[kk] - - return dest_docks, dest_panes - - -def CopyDocksAndPanes2(src_docks, src_panes): - """ - This utility function creates full copies of - the dock and pane info. L{AuiDockInfo} usually contain pointers - to L{AuiPaneInfo} classes, thus this function is necessary to reliably - reconstruct that relationship in the new dock info and pane info arrays. - - :param `src_docks`: a list of L{AuiDockInfo} classes; - :param `src_panes`: a list of L{AuiPaneInfo} classes. - """ - - dest_docks = [] - - for ii in xrange(len(src_docks)): - dest_docks.append(AuiDockInfo()) - dest_docks[ii].dock_direction = src_docks[ii].dock_direction - dest_docks[ii].dock_layer = src_docks[ii].dock_layer - dest_docks[ii].dock_row = src_docks[ii].dock_row - dest_docks[ii].size = src_docks[ii].size - dest_docks[ii].min_size = src_docks[ii].min_size - dest_docks[ii].resizable = src_docks[ii].resizable - dest_docks[ii].fixed = src_docks[ii].fixed - dest_docks[ii].toolbar = src_docks[ii].toolbar - dest_docks[ii].panes = src_docks[ii].panes - dest_docks[ii].rect = wx.Rect(*src_docks[ii].rect) - - dest_panes = [] - - for ii in xrange(len(src_panes)): - dest_panes.append(AuiPaneInfo()) - dest_panes[ii].name = src_panes[ii].name - dest_panes[ii].caption = src_panes[ii].caption - dest_panes[ii].window = src_panes[ii].window - dest_panes[ii].frame = src_panes[ii].frame - dest_panes[ii].state = src_panes[ii].state - dest_panes[ii].dock_direction = src_panes[ii].dock_direction - dest_panes[ii].dock_layer = src_panes[ii].dock_layer - dest_panes[ii].dock_row = src_panes[ii].dock_row - dest_panes[ii].dock_pos = src_panes[ii].dock_pos - dest_panes[ii].best_size = wx.Size(*src_panes[ii].best_size) - dest_panes[ii].min_size = wx.Size(*src_panes[ii].min_size) - dest_panes[ii].max_size = wx.Size(*src_panes[ii].max_size) - dest_panes[ii].floating_pos = wx.Point(*src_panes[ii].floating_pos) - dest_panes[ii].floating_size = wx.Size(*src_panes[ii].floating_size) - dest_panes[ii].dock_proportion = src_panes[ii].dock_proportion - dest_panes[ii].buttons = src_panes[ii].buttons - dest_panes[ii].rect = wx.Rect(*src_panes[ii].rect) - dest_panes[ii].icon = src_panes[ii].icon - dest_panes[ii].notebook_id = src_panes[ii].notebook_id - dest_panes[ii].transparent = src_panes[ii].transparent - dest_panes[ii].snapped = src_panes[ii].snapped - dest_panes[ii].minimize_mode = src_panes[ii].minimize_mode - - for ii in xrange(len(dest_docks)): - dock = dest_docks[ii] - for jj in xrange(len(dock.panes)): - for kk in xrange(len(src_panes)): - if dock.panes[jj] == src_panes[kk]: - dock.panes[jj] = dest_panes[kk] - - dest_docks[ii] = dock - - return dest_docks, dest_panes - - -def GetMaxLayer(docks, dock_direction): - """ - This is an internal function which returns - the highest layer inside the specified dock. - - :param `docks`: a list of L{AuiDockInfo}; - :param `dock_direction`: the L{AuiDockInfo} docking direction to analyze. - """ - - max_layer = 0 - - for dock in docks: - if dock.dock_direction == dock_direction and dock.dock_layer > max_layer and not dock.fixed: - max_layer = dock.dock_layer - - return max_layer - - -def GetMaxRow(panes, dock_direction, dock_layer): - """ - This is an internal function which returns - the highest layer inside the specified dock. - - :param `panes`: a list of L{AuiPaneInfo}; - :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; - :param `dock_layer`: the L{AuiPaneInfo} layer to analyze. - """ - - max_row = 0 - - for pane in panes: - if pane.dock_direction == dock_direction and pane.dock_layer == dock_layer and \ - pane.dock_row > max_row: - max_row = pane.dock_row - - return max_row - - -def DoInsertDockLayer(panes, dock_direction, dock_layer): - """ - This is an internal function that inserts a new dock - layer by incrementing all existing dock layer values by one. - - :param `panes`: a list of L{AuiPaneInfo}; - :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; - :param `dock_layer`: the L{AuiPaneInfo} layer to analyze. - """ - - for ii in xrange(len(panes)): - pane = panes[ii] - if not pane.IsFloating() and pane.dock_direction == dock_direction and pane.dock_layer >= dock_layer: - pane.dock_layer = pane.dock_layer + 1 - - panes[ii] = pane - - return panes - - -def DoInsertDockRow(panes, dock_direction, dock_layer, dock_row): - """ - This is an internal function that inserts a new dock - row by incrementing all existing dock row values by one. - - :param `panes`: a list of L{AuiPaneInfo}; - :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; - :param `dock_layer`: the L{AuiPaneInfo} layer to analyze; - :param `dock_row`: the L{AuiPaneInfo} row to analyze. - """ - - for pane in panes: - if not pane.IsFloating() and pane.dock_direction == dock_direction and \ - pane.dock_layer == dock_layer and pane.dock_row >= dock_row: - pane.dock_row += 1 - - return panes - - -def DoInsertPane(panes, dock_direction, dock_layer, dock_row, dock_pos): - """ - This is an internal function that inserts a new pane - by incrementing all existing dock position values by one. - - :param `panes`: a list of L{AuiPaneInfo}; - :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; - :param `dock_layer`: the L{AuiPaneInfo} layer to analyze; - :param `dock_row`: the L{AuiPaneInfo} row to analyze; - :param `dock_pos`: the L{AuiPaneInfo} row to analyze. - """ - - for ii in xrange(len(panes)): - pane = panes[ii] - if not pane.IsFloating() and pane.dock_direction == dock_direction and \ - pane.dock_layer == dock_layer and pane.dock_row == dock_row and \ - pane.dock_pos >= dock_pos: - pane.dock_pos = pane.dock_pos + 1 - - panes[ii] = pane - - return panes - - -def FindDocks(docks, dock_direction, dock_layer=-1, dock_row=-1, reverse=False): - """ - This is an internal function that returns a list of docks which meet - the specified conditions in the parameters and returns a sorted array - (sorted by layer and then row). - - :param `docks`: a list of L{AuiDockInfo}; - :param `dock_direction`: the L{AuiDockInfo} docking direction to analyze; - :param `dock_layer`: the L{AuiDockInfo} layer to analyze; - :param `dock_row`: the L{AuiDockInfo} row to analyze; - """ - - matchDocks = [(d.dock_layer, d.dock_row, d.dock_direction, d) for d in docks if \ - (dock_direction == -1 or dock_direction == d.dock_direction) and \ - ((dock_layer == -1 or dock_layer == d.dock_layer) and \ - (dock_row == -1 or dock_row == d.dock_row))] - - arr = [x[-1] for x in sorted(matchDocks, reverse=reverse)] - - return arr - - -def FindOppositeDocks(docks, dock_direction): - """ - This is an internal function that returns a list of docks - which is related to the opposite direction. - - :param `docks`: a list of L{AuiDockInfo}; - :param `dock_direction`: the L{AuiDockInfo} docking direction to analyze; - """ - - if dock_direction == AUI_DOCK_LEFT: - arr = FindDocks(docks, AUI_DOCK_RIGHT, -1, -1) - elif dock_direction == AUI_DOCK_TOP: - arr = FindDocks(docks, AUI_DOCK_BOTTOM, -1, -1) - elif dock_direction == AUI_DOCK_RIGHT: - arr = FindDocks(docks, AUI_DOCK_LEFT, -1, -1) - elif dock_direction == AUI_DOCK_BOTTOM: - arr = FindDocks(docks, AUI_DOCK_TOP, -1, -1) - - return arr - - -def FindPaneInDock(dock, window): - """ - This method looks up a specified window pointer inside a dock. - If found, the corresponding L{AuiPaneInfo} pointer is returned, otherwise ``None``. - - :param `dock`: a L{AuiDockInfo} structure; - :param `window`: a `wx.Window` derived window (associated to a pane). - """ - - for p in dock.panes: - if p.window == window: - return p - - return None - - -def GetToolBarDockOffsets(docks): - """ - Returns the toolbar dock offsets (top-left and bottom-right). - - :param `docks`: a list of L{AuiDockInfo} to analyze. - """ - - top_left = wx.Size(0, 0) - bottom_right = wx.Size(0, 0) - - for dock in docks: - if dock.toolbar: - dock_direction = dock.dock_direction - if dock_direction == AUI_DOCK_LEFT: - top_left.x += dock.rect.width - bottom_right.x += dock.rect.width - - elif dock_direction == AUI_DOCK_TOP: - top_left.y += dock.rect.height - bottom_right.y += dock.rect.height - - elif dock_direction == AUI_DOCK_RIGHT: - bottom_right.x += dock.rect.width - - elif dock_direction == AUI_DOCK_BOTTOM: - bottom_right.y += dock.rect.height - - return top_left, bottom_right - - -def GetInternalFrameRect(window, docks): - """ - Returns the window rectangle excluding toolbars. - - :param `window`: a `wx.Window` derived window; - :param `docks`: a list of L{AuiDockInfo} structures. - """ - - frameRect = wx.Rect() - - frameRect.SetTopLeft(window.ClientToScreen(window.GetClientAreaOrigin())) - frameRect.SetSize(window.GetClientSize()) - - top_left, bottom_right = GetToolBarDockOffsets(docks) - - # make adjustments for toolbars - frameRect.x += top_left.x - frameRect.y += top_left.y - frameRect.width -= bottom_right.x - frameRect.height -= bottom_right.y - - return frameRect - - -def CheckOutOfWindow(window, pt): - """ - Checks if a point is outside the window rectangle. - - :param `window`: a `wx.Window` derived window; - :param `pt`: a `wx.Point` object. - """ - - auiWindowMargin = 30 - marginRect = wx.Rect(*window.GetClientRect()) - marginRect.Inflate(auiWindowMargin, auiWindowMargin) - - return not marginRect.Contains(pt) - - -def CheckEdgeDrop(window, docks, pt): - """ - Checks on which edge of a window the drop action has taken place. - - :param `window`: a `wx.Window` derived window; - :param `docks`: a list of L{AuiDockInfo} structures; - :param `pt`: a `wx.Point` object. - """ - - screenPt = window.ClientToScreen(pt) - clientSize = window.GetClientSize() - frameRect = GetInternalFrameRect(window, docks) - - if screenPt.y >= frameRect.GetTop() and screenPt.y < frameRect.GetBottom(): - if pt.x < auiLayerInsertOffset and pt.x > auiLayerInsertOffset - auiLayerInsertPixels: - return wx.LEFT - - if pt.x >= clientSize.x - auiLayerInsertOffset and \ - pt.x < clientSize.x - auiLayerInsertOffset + auiLayerInsertPixels: - return wx.RIGHT - - if screenPt.x >= frameRect.GetLeft() and screenPt.x < frameRect.GetRight(): - if pt.y < auiLayerInsertOffset and pt.y > auiLayerInsertOffset - auiLayerInsertPixels: - return wx.TOP - - if pt.y >= clientSize.y - auiLayerInsertOffset and \ - pt.y < clientSize.y - auiLayerInsertOffset + auiLayerInsertPixels: - return wx.BOTTOM - - return -1 - - -def RemovePaneFromDocks(docks, pane, exc=None): - """ - Removes a pane window from all docks - with a possible exception specified by parameter `exc`. - - :param `docks`: a list of L{AuiDockInfo} structures; - :param `pane`: the L{AuiPaneInfo} pane to be removed; - :param `exc`: the possible pane exception. - """ - - for ii in xrange(len(docks)): - d = docks[ii] - if d == exc: - continue - pi = FindPaneInDock(d, pane.window) - if pi: - d.panes.remove(pi) - - docks[ii] = d - - return docks - - -def RenumberDockRows(docks): - """ - Takes a dock and assigns sequential numbers - to existing rows. Basically it takes out the gaps so if a - dock has rows with numbers 0, 2, 5, they will become 0, 1, 2. - - :param `docks`: a list of L{AuiDockInfo} structures. - """ - - for ii in xrange(len(docks)): - dock = docks[ii] - dock.dock_row = ii - for jj in xrange(len(dock.panes)): - dock.panes[jj].dock_row = ii - - docks[ii] = dock - - return docks - - -def SetActivePane(panes, active_pane): - """ - Sets the active pane, as well as cycles through - every other pane and makes sure that all others' active flags - are turned off. - - :param `panes`: a list of L{AuiPaneInfo} structures; - :param `active_pane`: the pane to be made active (if found). - """ - - for pane in panes: - pane.state &= ~AuiPaneInfo.optionActive - - for pane in panes: - if pane.window == active_pane and not pane.IsNotebookPage(): - pane.state |= AuiPaneInfo.optionActive - return True, panes - - return False, panes - - -def ShowDockingGuides(guides, show): - """ - Shows or hide the docking guide windows. - - :param `guides`: a list of L{AuiDockingGuideInfo} classes; - :param `show`: whether to show or hide the docking guide windows. - """ - - for target in guides: - - if show and not target.host.IsShown(): - target.host.Show() - target.host.Update() - - elif not show and target.host.IsShown(): - target.host.Hide() - - -def RefreshDockingGuides(guides): - """ - Refreshes the docking guide windows. - - :param `guides`: a list of L{AuiDockingGuideInfo} classes; - """ - - for target in guides: - if target.host.IsShown(): - target.host.Refresh() - - -def PaneSortFunc(p1, p2): - """ - This function is used to sort panes by dock position. - - :param `p1`: a L{AuiPaneInfo} instance; - :param `p2`: another L{AuiPaneInfo} instance. - """ - - return (p1.dock_pos < p2.dock_pos and [-1] or [1])[0] - - -def GetNotebookRoot(panes, notebook_id): - """ - Returns the L{AuiPaneInfo} which has the specified `notebook_id`. - - :param `panes`: a list of L{AuiPaneInfo} instances; - :param `notebook_id`: the target notebook id. - """ - - for paneInfo in panes: - if paneInfo.IsNotebookControl() and paneInfo.notebook_id == notebook_id: - return paneInfo - - return None - - -def EscapeDelimiters(s): - """ - Changes ``;`` into ``\`` and ``|`` into ``\|`` in the input string. - - :param `s`: the string to be analyzed. - - :note: This is an internal functions which is used for saving perspectives. - """ - - result = s.replace(";", "\\") - result = result.replace("|", "|\\") - - return result - - -def IsDifferentDockingPosition(pane1, pane2): - """ - Returns whether `pane1` and `pane2` are in a different docking position - based on pane status, docking direction, docking layer and docking row. - - :param `pane1`: a L{AuiPaneInfo} instance; - :param `pane2`: another L{AuiPaneInfo} instance. - """ - - return pane1.IsFloating() != pane2.IsFloating() or \ - pane1.dock_direction != pane2.dock_direction or \ - pane1.dock_layer != pane2.dock_layer or \ - pane1.dock_row != pane2.dock_row - - -# Convenience function -def AuiManager_HasLiveResize(manager): - """ - Static function which returns if the input `manager` should have "live resize" - behaviour. - - :param `manager`: an instance of L{AuiManager}. - - :note: This method always returns ``True`` on wxMac as this platform doesn't have - the ability to use `wx.ScreenDC` to draw sashes. - """ - - # With Core Graphics on Mac, it's not possible to show sash feedback, - # so we'll always use live update instead. - - if wx.Platform == "__WXMAC__": - return True - else: - return (manager.GetAGWFlags() & AUI_MGR_LIVE_RESIZE) == AUI_MGR_LIVE_RESIZE - - -# Convenience function -def AuiManager_UseNativeMiniframes(manager): - """ - Static function which returns if the input `manager` should use native `wx.MiniFrame` as - floating panes. - - :param `manager`: an instance of L{AuiManager}. - - :note: This method always returns ``True`` on wxMac as this platform doesn't have - the ability to use custom drawn miniframes. - """ - - # With Core Graphics on Mac, it's not possible to show sash feedback, - # so we'll always use live update instead. - - if wx.Platform == "__WXMAC__": - return True - else: - return (manager.GetAGWFlags() & AUI_MGR_USE_NATIVE_MINIFRAMES) == AUI_MGR_USE_NATIVE_MINIFRAMES - - -def GetManager(window): - """ - This function will return the aui manager for a given window. - - :param `window`: this parameter should be any child window or grand-child - window (and so on) of the frame/window managed by L{AuiManager}. The window - does not need to be managed by the manager itself, nor does it even need - to be a child or sub-child of a managed window. It must however be inside - the window hierarchy underneath the managed window. - """ - - if not isinstance(wx.GetTopLevelParent(window), AuiFloatingFrame): - if isinstance(window, auibar.AuiToolBar): - return window.GetAuiManager() - - evt = AuiManagerEvent(wxEVT_AUI_FIND_MANAGER) - evt.SetManager(None) - evt.ResumePropagation(wx.EVENT_PROPAGATE_MAX) - - if not window.GetEventHandler().ProcessEvent(evt): - return None - - return evt.GetManager() - - -# ---------------------------------------------------------------------------- # - -class AuiManager(wx.EvtHandler): - """ - AuiManager manages the panes associated with it for a particular `wx.Frame`, - using a pane's L{AuiPaneInfo} information to determine each pane's docking and - floating behavior. L{AuiManager} uses wxPython's sizer mechanism to plan the - layout of each frame. It uses a replaceable dock art class to do all drawing, - so all drawing is localized in one area, and may be customized depending on an - applications' specific needs. - - L{AuiManager} works as follows: the programmer adds panes to the class, or makes - changes to existing pane properties (dock position, floating state, show state, etc...). - To apply these changes, the L{AuiManager.Update} function is called. This batch - processing can be used to avoid flicker, by modifying more than one pane at a time, - and then "committing" all of the changes at once by calling `Update()`. - - Panes can be added quite easily:: - - text1 = wx.TextCtrl(self, -1) - text2 = wx.TextCtrl(self, -1) - self._mgr.AddPane(text1, AuiPaneInfo().Left().Caption("Pane Number One")) - self._mgr.AddPane(text2, AuiPaneInfo().Bottom().Caption("Pane Number Two")) - - self._mgr.Update() - - - Later on, the positions can be modified easily. The following will float an - existing pane in a tool window:: - - self._mgr.GetPane(text1).Float() - - - **Layers, Rows and Directions, Positions:** - - Inside AUI, the docking layout is figured out by checking several pane parameters. - Four of these are important for determining where a pane will end up. - - **Direction** - Each docked pane has a direction, `Top`, `Bottom`, `Left`, `Right`, or `Center`. - This is fairly self-explanatory. The pane will be placed in the location specified - by this variable. - - **Position** - More than one pane can be placed inside of a "dock". Imagine two panes - being docked on the left side of a window. One pane can be placed over another. - In proportionally managed docks, the pane position indicates it's sequential position, - starting with zero. So, in our scenario with two panes docked on the left side, the - top pane in the dock would have position 0, and the second one would occupy position 1. - - **Row** - A row can allow for two docks to be placed next to each other. One of the most - common places for this to happen is in the toolbar. Multiple toolbar rows are allowed, - the first row being in row 0, and the second in row 1. Rows can also be used on - vertically docked panes. - - **Layer** - A layer is akin to an onion. Layer 0 is the very center of the managed pane. - Thus, if a pane is in layer 0, it will be closest to the center window (also sometimes - known as the "content window"). Increasing layers "swallow up" all layers of a lower - value. This can look very similar to multiple rows, but is different because all panes - in a lower level yield to panes in higher levels. The best way to understand layers - is by running the AUI sample (`AUI.py`). - """ - - def __init__(self, managed_window=None, agwFlags=None): - """ - Default class constructor. - - :param `managed_window`: specifies the window which should be managed; - :param `agwFlags`: specifies options which allow the frame management behavior to be - modified. `agwFlags` can be a combination of the following style bits: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_MGR_ALLOW_FLOATING`` Allow floating of panes - ``AUI_MGR_ALLOW_ACTIVE_PANE`` If a pane becomes active, "highlight" it in the interface - ``AUI_MGR_TRANSPARENT_DRAG`` If the platform supports it, set transparency on a floating pane while it is dragged by the user - ``AUI_MGR_TRANSPARENT_HINT`` If the platform supports it, show a transparent hint window when the user is about to dock a floating pane - ``AUI_MGR_VENETIAN_BLINDS_HINT`` Show a "venetian blind" effect when the user is about to dock a floating pane - ``AUI_MGR_RECTANGLE_HINT`` Show a rectangle hint effect when the user is about to dock a floating pane - ``AUI_MGR_HINT_FADE`` If the platform supports it, the hint window will fade in and out - ``AUI_MGR_NO_VENETIAN_BLINDS_FADE`` Disables the "venetian blind" fade in and out - ``AUI_MGR_LIVE_RESIZE`` Live resize when the user drag a sash - ``AUI_MGR_ANIMATE_FRAMES`` Fade-out floating panes when they are closed (all platforms which support frames transparency) and show a moving rectangle when they are docked (Windows < Vista and GTK only) - ``AUI_MGR_AERO_DOCKING_GUIDES`` Use the new Aero-style bitmaps as docking guides - ``AUI_MGR_PREVIEW_MINIMIZED_PANES`` Slide in and out minimized panes to preview them - ``AUI_MGR_WHIDBEY_DOCKING_GUIDES`` Use the new Whidbey-style bitmaps as docking guides - ``AUI_MGR_SMOOTH_DOCKING`` Performs a "smooth" docking of panes (a la PyQT) - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` Use miniframes with native caption bar as floating panes instead or custom drawn caption bars (forced on wxMac) - ``AUI_MGR_AUTONB_NO_CAPTION`` Panes that merge into an automatic notebook will not have the pane caption visible - ==================================== ================================== - - Default value for `agwFlags` is: - ``AUI_MGR_DEFAULT`` = ``AUI_MGR_ALLOW_FLOATING`` | ``AUI_MGR_TRANSPARENT_HINT`` | ``AUI_MGR_HINT_FADE`` | ``AUI_MGR_NO_VENETIAN_BLINDS_FADE`` - - :note: If using the ``AUI_MGR_USE_NATIVE_MINIFRAMES``, double-clicking on a - floating pane caption will not re-dock the pane, but simply maximize it (if - L{AuiPaneInfo.MaximizeButton} has been set to ``True``) or do nothing. - """ - - wx.EvtHandler.__init__(self) - - self._action = actionNone - self._action_window = None - self._hover_button = None - self._art = dockart.AuiDefaultDockArt() - self._hint_window = None - self._active_pane = None - self._has_maximized = False - self._has_minimized = False - - self._frame = None - self._dock_constraint_x = 0.3 - self._dock_constraint_y = 0.3 - self._reserved = None - - self._panes = [] - self._docks = [] - self._uiparts = [] - - self._guides = [] - self._notebooks = [] - - self._masterManager = None - self._currentDragItem = -1 - self._lastknowndocks = {} - - self._hint_fadetimer = wx.Timer(self, wx.ID_ANY) - self._hint_fademax = 50 - self._last_hint = wx.Rect() - - self._from_move = False - self._last_rect = wx.Rect() - - if agwFlags is None: - agwFlags = AUI_MGR_DEFAULT - - self._agwFlags = agwFlags - self._is_docked = (False, wx.RIGHT, wx.TOP, 0) - self._snap_limits = (15, 15) - - if wx.Platform == "__WXMSW__": - self._animation_step = 30.0 - else: - self._animation_step = 5.0 - - self._hint_rect = wx.Rect() - - self._preview_timer = wx.Timer(self, wx.ID_ANY) - self._sliding_frame = None - - self._autoNBTabArt = tabart.AuiDefaultTabArt() - self._autoNBStyle = AUI_NB_DEFAULT_STYLE | AUI_NB_BOTTOM | \ - AUI_NB_SUB_NOTEBOOK | AUI_NB_TAB_EXTERNAL_MOVE - self._autoNBStyle -= AUI_NB_DRAW_DND_TAB - - if managed_window: - self.SetManagedWindow(managed_window) - - self.Bind(wx.EVT_PAINT, self.OnPaint) - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Bind(wx.EVT_SET_CURSOR, self.OnSetCursor) - self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) - self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick) - self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) - self.Bind(wx.EVT_MOTION, self.OnMotion) - self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) - self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocus) - self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnCaptureLost) - self.Bind(wx.EVT_TIMER, self.OnHintFadeTimer, self._hint_fadetimer) - self.Bind(wx.EVT_TIMER, self.SlideIn, self._preview_timer) - - self.Bind(wx.EVT_MOVE, self.OnMove) - self.Bind(wx.EVT_SYS_COLOUR_CHANGED, self.OnSysColourChanged) - - self.Bind(EVT_AUI_PANE_BUTTON, self.OnPaneButton) - self.Bind(EVT_AUI_RENDER, self.OnRender) - self.Bind(EVT_AUI_FIND_MANAGER, self.OnFindManager) - self.Bind(EVT_AUI_PANE_MIN_RESTORE, self.OnRestoreMinimizedPane) - self.Bind(EVT_AUI_PANE_DOCKED, self.OnPaneDocked) - - self.Bind(auibook.EVT_AUINOTEBOOK_BEGIN_DRAG, self.OnTabBeginDrag) - self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnTabPageClose) - self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnTabSelected) - - - def CreateFloatingFrame(self, parent, pane_info): - """ - Creates a floating frame for the windows. - - :param `parent`: the floating frame parent; - :param `pane_info`: the L{AuiPaneInfo} class with all the pane's information. - """ - - return AuiFloatingFrame(parent, self, pane_info) - - - def CanDockPanel(self, p): - """ - Returns whether a pane can be docked or not. - - :param `p`: the L{AuiPaneInfo} class with all the pane's information. - """ - - # is the pane dockable? - if not p.IsDockable(): - return False - - # if a key modifier is pressed while dragging the frame, - # don't dock the window - return not (wx.GetKeyState(wx.WXK_CONTROL) or wx.GetKeyState(wx.WXK_ALT)) - - - def GetPaneByWidget(self, window): - """ - This version of L{GetPane} looks up a pane based on a - 'pane window'. - - :param `window`: a `wx.Window` derived window. - - :see: L{GetPane} - """ - - for p in self._panes: - if p.window == window: - return p - - return NonePaneInfo - - - def GetPaneByName(self, name): - """ - This version of L{GetPane} looks up a pane based on a - 'pane name'. - - :param `name`: the pane name. - - :see: L{GetPane} - """ - - for p in self._panes: - if p.name == name: - return p - - return NonePaneInfo - - - def GetPane(self, item): - """ - Looks up a L{AuiPaneInfo} structure based - on the supplied window pointer. Upon failure, L{GetPane} - returns an empty L{AuiPaneInfo}, a condition which can be checked - by calling L{AuiPaneInfo.IsOk}. - - The pane info's structure may then be modified. Once a pane's - info is modified, L{Update} must be called to - realize the changes in the UI. - - :param `item`: either a pane name or a `wx.Window`. - """ - - if isinstance(item, basestring): - return self.GetPaneByName(item) - else: - return self.GetPaneByWidget(item) - - - def GetAllPanes(self): - """ Returns a reference to all the pane info structures. """ - - return self._panes - - - def ShowPane(self, window, show): - """ - Shows or hides a pane based on the window passed as input. - - :param `window`: a `wx.Window` derived window; - :param `show`: ``True`` to show the pane, ``False`` otherwise. - """ - - p = self.GetPane(window) - - if p.IsOk(): - if p.IsNotebookPage(): - if show: - - notebook = self._notebooks[p.notebook_id] - id = notebook.GetPageIndex(p.window) - if id >= 0: - notebook.SetSelection(id) - self.ShowPane(notebook, True) - - else: - p.Show(show) - - if p.frame: - p.frame.Raise() - - self.Update() - - - def HitTest(self, x, y): - """ - This is an internal function which determines - which UI item the specified coordinates are over. - - :param `x`: specifies a x position in client coordinates; - :param `y`: specifies a y position in client coordinates. - """ - - result = None - - for item in self._uiparts: - # we are not interested in typeDock, because this space - # isn't used to draw anything, just for measurements - # besides, the entire dock area is covered with other - # rectangles, which we are interested in. - if item.type == AuiDockUIPart.typeDock: - continue - - # if we already have a hit on a more specific item, we are not - # interested in a pane hit. If, however, we don't already have - # a hit, returning a pane hit is necessary for some operations - if item.type in [AuiDockUIPart.typePane, AuiDockUIPart.typePaneBorder] and result: - continue - - # if the point is inside the rectangle, we have a hit - if item.rect.Contains((x, y)): - result = item - - return result - - - def PaneHitTest(self, panes, pt): - """ - Similar to L{HitTest}, but it checks in which L{AuiPaneInfo} rectangle the - input point belongs to. - - :param `panes`: a list of L{AuiPaneInfo} instances; - :param `pt`: a `wx.Point` object. - """ - - for paneInfo in panes: - if paneInfo.IsDocked() and paneInfo.IsShown() and paneInfo.rect.Contains(pt): - return paneInfo - - return NonePaneInfo - - - # SetAGWFlags() and GetAGWFlags() allow the owner to set various - # options which are global to AuiManager - - def SetAGWFlags(self, agwFlags): - """ - This method is used to specify L{AuiManager}'s settings flags. - - :param `agwFlags`: specifies options which allow the frame management behavior - to be modified. `agwFlags` can be one of the following style bits: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_MGR_ALLOW_FLOATING`` Allow floating of panes - ``AUI_MGR_ALLOW_ACTIVE_PANE`` If a pane becomes active, "highlight" it in the interface - ``AUI_MGR_TRANSPARENT_DRAG`` If the platform supports it, set transparency on a floating pane while it is dragged by the user - ``AUI_MGR_TRANSPARENT_HINT`` If the platform supports it, show a transparent hint window when the user is about to dock a floating pane - ``AUI_MGR_VENETIAN_BLINDS_HINT`` Show a "venetian blind" effect when the user is about to dock a floating pane - ``AUI_MGR_RECTANGLE_HINT`` Show a rectangle hint effect when the user is about to dock a floating pane - ``AUI_MGR_HINT_FADE`` If the platform supports it, the hint window will fade in and out - ``AUI_MGR_NO_VENETIAN_BLINDS_FADE`` Disables the "venetian blind" fade in and out - ``AUI_MGR_LIVE_RESIZE`` Live resize when the user drag a sash - ``AUI_MGR_ANIMATE_FRAMES`` Fade-out floating panes when they are closed (all platforms which support frames transparency) and show a moving rectangle when they are docked (Windows < Vista and GTK only) - ``AUI_MGR_AERO_DOCKING_GUIDES`` Use the new Aero-style bitmaps as docking guides - ``AUI_MGR_PREVIEW_MINIMIZED_PANES`` Slide in and out minimized panes to preview them - ``AUI_MGR_WHIDBEY_DOCKING_GUIDES`` Use the new Whidbey-style bitmaps as docking guides - ``AUI_MGR_SMOOTH_DOCKING`` Performs a "smooth" docking of panes (a la PyQT) - ``AUI_MGR_USE_NATIVE_MINIFRAMES`` Use miniframes with native caption bar as floating panes instead or custom drawn caption bars (forced on wxMac) - ``AUI_MGR_AUTONB_NO_CAPTION`` Panes that merge into an automatic notebook will not have the pane caption visible - ==================================== ================================== - - :note: If using the ``AUI_MGR_USE_NATIVE_MINIFRAMES``, double-clicking on a - floating pane caption will not re-dock the pane, but simply maximize it (if - L{AuiPaneInfo.MaximizeButton} has been set to ``True``) or do nothing. - - """ - - self._agwFlags = agwFlags - - if len(self._guides) > 0: - self.CreateGuideWindows() - - if self._hint_window and agwFlags & AUI_MGR_RECTANGLE_HINT == 0: - self.CreateHintWindow() - - - def GetAGWFlags(self): - """ - Returns the current manager's flags. - - :see: L{SetAGWFlags} for a list of possible L{AuiManager} flags. - """ - - return self._agwFlags - - - def SetManagedWindow(self, managed_window): - """ - Called to specify the frame or window which is to be managed by L{AuiManager}. - Frame management is not restricted to just frames. Child windows or custom - controls are also allowed. - - :param `managed_window`: specifies the window which should be managed by - the AUI manager. - """ - - if not managed_window: - raise Exception("Specified managed window must be non-null. ") - - self._frame = managed_window - self._frame.PushEventHandler(self) - - # if the owner is going to manage an MDI parent frame, - # we need to add the MDI client window as the default - # center pane - - if isinstance(self._frame, wx.MDIParentFrame): - mdi_frame = self._frame - client_window = mdi_frame.GetClientWindow() - - if not client_window: - raise Exception("Client window is None!") - - self.AddPane(client_window, AuiPaneInfo().Name("mdiclient"). - CenterPane().PaneBorder(False)) - - elif isinstance(self._frame, tabmdi.AuiMDIParentFrame): - - mdi_frame = self._frame - client_window = mdi_frame.GetClientWindow() - - if not client_window: - raise Exception("Client window is None!") - - self.AddPane(client_window, AuiPaneInfo().Name("mdiclient"). - CenterPane().PaneBorder(False)) - - - def GetManagedWindow(self): - """ Returns the window being managed by L{AuiManager}. """ - - return self._frame - - - def SetFrame(self, managed_window): - """ - Called to specify the frame or window which is to be managed by L{AuiManager}. - Frame management is not restricted to just frames. Child windows or custom - controls are also allowed. - - :param `managed_window`: specifies the window which should be managed by - the AUI manager. - - :warning: This method is now deprecated, use L{SetManagedWindow} instead. - """ - - DeprecationWarning("This method is deprecated, use SetManagedWindow instead.") - return self.SetManagedWindow(managed_window) - - - def GetFrame(self): - """ - Returns the window being managed by L{AuiManager}. - - :warning: This method is now deprecated, use L{GetManagedWindow} instead. - """ - - DeprecationWarning("This method is deprecated, use GetManagedWindow instead.") - return self._frame - - - def CreateGuideWindows(self): - """ Creates the VS2005 HUD guide windows. """ - - self.DestroyGuideWindows() - - self._guides.append(AuiDockingGuideInfo().Left(). - Host(AuiSingleDockingGuide(self._frame, wx.LEFT))) - self._guides.append(AuiDockingGuideInfo().Top(). - Host(AuiSingleDockingGuide(self._frame, wx.TOP))) - self._guides.append(AuiDockingGuideInfo().Right(). - Host(AuiSingleDockingGuide(self._frame, wx.RIGHT))) - self._guides.append(AuiDockingGuideInfo().Bottom(). - Host(AuiSingleDockingGuide(self._frame, wx.BOTTOM))) - self._guides.append(AuiDockingGuideInfo().Centre(). - Host(AuiCenterDockingGuide(self._frame))) - - - def DestroyGuideWindows(self): - """ Destroys the VS2005 HUD guide windows. """ - - for guide in self._guides: - if guide.host: - guide.host.Destroy() - - self._guides = [] - - - def CreateHintWindow(self): - """ Creates the standard wxAUI hint window. """ - - self.DestroyHintWindow() - - self._hint_window = AuiDockingHintWindow(self._frame) - self._hint_window.SetBlindMode(self._agwFlags) - - - def DestroyHintWindow(self): - """ Destroys the standard wxAUI hint window. """ - - if self._hint_window: - - self._hint_window.Destroy() - self._hint_window = None - - - def UnInit(self): - """ - Uninitializes the framework and should be called before a managed frame or - window is destroyed. L{UnInit} is usually called in the managed `wx.Frame`/`wx.Window` - destructor. - - It is necessary to call this function before the managed frame or window is - destroyed, otherwise the manager cannot remove its custom event handlers - from a window. - """ - - if self._frame: - self._frame.RemoveEventHandler(self) - - - def GetArtProvider(self): - """ Returns the current art provider being used. """ - - return self._art - - - def ProcessMgrEvent(self, event): - """ - Process the AUI events sent to the manager. - - :param `event`: the event to process, an instance of L{AuiManagerEvent}. - """ - - # first, give the owner frame a chance to override - if self._frame: - if self._frame.GetEventHandler().ProcessEvent(event): - return - - self.ProcessEvent(event) - - - def FireEvent(self, evtType, pane, canVeto=False): - """ - Fires one of the ``EVT_AUI_PANE_FLOATED``/``FLOATING``/``DOCKING``/``DOCKED``/``ACTIVATED`` event. - - :param `evtType`: one of the aforementioned events; - :param `pane`: the L{AuiPaneInfo} instance associated to this event; - :param `canVeto`: whether the event can be vetoed or not. - """ - - event = AuiManagerEvent(evtType) - event.SetPane(pane) - event.SetCanVeto(canVeto) - self.ProcessMgrEvent(event) - - return event - - - def CanUseModernDockArt(self): - """ - Returns whether L{ModernDockArt} can be used (Windows XP / Vista / 7 only, - requires Mark Hammonds's `pywin32` package). - """ - - if not _winxptheme: - return False - - # Get the size of a small close button (themed) - hwnd = self._frame.GetHandle() - hTheme = winxptheme.OpenThemeData(hwnd, "Window") - - if not hTheme: - return False - - return True - - - def SetArtProvider(self, art_provider): - """ - Instructs L{AuiManager} to use art provider specified by the parameter - `art_provider` for all drawing calls. This allows plugable look-and-feel - features. - - :param `art_provider`: a AUI dock art provider. - - :note: The previous art provider object, if any, will be deleted by L{AuiManager}. - """ - - # delete the last art provider, if any - del self._art - - # assign the new art provider - self._art = art_provider - - for pane in self.GetAllPanes(): - if pane.IsFloating() and pane.frame: - pane.frame._mgr.SetArtProvider(art_provider) - pane.frame._mgr.Update() - - - def AddPane(self, window, arg1=None, arg2=None, target=None): - """ - Tells the frame manager to start managing a child window. There - are four versions of this function. The first verison allows the full spectrum - of pane parameter possibilities (L{AddPane1}). The second version is used for - simpler user interfaces which do not require as much configuration (L{AddPane2}). - The L{AddPane3} version allows a drop position to be specified, which will determine - where the pane will be added. The L{AddPane4} version allows to turn the target - L{AuiPaneInfo} pane into a notebook and the added pane into a page. - - In wxPython, simply call L{AddPane}. - - :param `window`: the child window to manage; - :param `arg1`: a L{AuiPaneInfo} or an integer value (direction); - :param `arg2`: a L{AuiPaneInfo} or a `wx.Point` (drop position); - :param `target`: a L{AuiPaneInfo} to be turned into a notebook - and new pane added to it as a page. (additionally, target can be any pane in - an existing notebook) - """ - - if target in self._panes: - return self.AddPane4(window, arg1, target) - - if type(arg1) == type(1): - # This Is Addpane2 - if arg1 is None: - arg1 = wx.LEFT - if arg2 is None: - arg2 = "" - return self.AddPane2(window, arg1, arg2) - else: - if isinstance(arg2, wx.Point): - return self.AddPane3(window, arg1, arg2) - else: - return self.AddPane1(window, arg1) - - - def AddPane1(self, window, pane_info): - """ See comments on L{AddPane}. """ - - # check if the pane has a valid window - if not window: - return False - - # check if the pane already exists - if self.GetPane(pane_info.window).IsOk(): - return False - - # check if the pane name already exists, this could reveal a - # bug in the library user's application - already_exists = False - if pane_info.name != "" and self.GetPane(pane_info.name).IsOk(): - warnings.warn("A pane with the name '%s' already exists in the manager!"%pane_info.name) - already_exists = True - - # if the new pane is docked then we should undo maximize - if pane_info.IsDocked(): - self.RestoreMaximizedPane() - - self._panes.append(pane_info) - pinfo = self._panes[-1] - - # set the pane window - pinfo.window = window - - # if the pane's name identifier is blank, create a random string - if pinfo.name == "" or already_exists: - pinfo.name = ("%s%08x%08x%08x")%(pinfo.window.GetName(), time.time(), - time.clock(), len(self._panes)) - - # set initial proportion (if not already set) - if pinfo.dock_proportion == 0: - pinfo.dock_proportion = 100000 - - floating = isinstance(self._frame, AuiFloatingFrame) - - pinfo.buttons = [] - - if not floating and pinfo.HasMinimizeButton(): - button = AuiPaneButton(AUI_BUTTON_MINIMIZE) - pinfo.buttons.append(button) - - if not floating and pinfo.HasMaximizeButton(): - button = AuiPaneButton(AUI_BUTTON_MAXIMIZE_RESTORE) - pinfo.buttons.append(button) - - if not floating and pinfo.HasPinButton(): - button = AuiPaneButton(AUI_BUTTON_PIN) - pinfo.buttons.append(button) - - if pinfo.HasCloseButton(): - button = AuiPaneButton(AUI_BUTTON_CLOSE) - pinfo.buttons.append(button) - - if pinfo.HasGripper(): - if isinstance(pinfo.window, auibar.AuiToolBar): - # prevent duplicate gripper -- both AuiManager and AuiToolBar - # have a gripper control. The toolbar's built-in gripper - # meshes better with the look and feel of the control than ours, - # so turn AuiManager's gripper off, and the toolbar's on. - - tb = pinfo.window - pinfo.SetFlag(AuiPaneInfo.optionGripper, False) - tb.SetGripperVisible(True) - - if pinfo.window: - if pinfo.best_size == wx.Size(-1, -1): - pinfo.best_size = pinfo.window.GetClientSize() - - if isinstance(pinfo.window, wx.ToolBar): - # GetClientSize() doesn't get the best size for - # a toolbar under some newer versions of wxWidgets, - # so use GetBestSize() - pinfo.best_size = pinfo.window.GetBestSize() - - # this is needed for Win2000 to correctly fill toolbar backround - # it should probably be repeated once system colour change happens - if wx.Platform == "__WXMSW__" and pinfo.window.UseBgCol(): - pinfo.window.SetBackgroundColour(self.GetArtProvider().GetColour(AUI_DOCKART_BACKGROUND_COLOUR)) - - if pinfo.min_size != wx.Size(-1, -1): - if pinfo.best_size.x < pinfo.min_size.x: - pinfo.best_size.x = pinfo.min_size.x - if pinfo.best_size.y < pinfo.min_size.y: - pinfo.best_size.y = pinfo.min_size.y - - self._panes[-1] = pinfo - if isinstance(window, auibar.AuiToolBar): - window.SetAuiManager(self) - - return True - - - def AddPane2(self, window, direction, caption): - """ See comments on L{AddPane}. """ - - pinfo = AuiPaneInfo() - pinfo.Caption(caption) - - if direction == wx.TOP: - pinfo.Top() - elif direction == wx.BOTTOM: - pinfo.Bottom() - elif direction == wx.LEFT: - pinfo.Left() - elif direction == wx.RIGHT: - pinfo.Right() - elif direction == wx.CENTER: - pinfo.CenterPane() - - return self.AddPane(window, pinfo) - - - def AddPane3(self, window, pane_info, drop_pos): - """ See comments on L{AddPane}. """ - - if not self.AddPane(window, pane_info): - return False - - pane = self.GetPane(window) - indx = self._panes.index(pane) - - ret, pane = self.DoDrop(self._docks, self._panes, pane, drop_pos, wx.Point(0, 0)) - self._panes[indx] = pane - - return True - - - def AddPane4(self, window, pane_info, target): - """ See comments on L{AddPane}. """ - - if not self.AddPane(window, pane_info): - return False - - paneInfo = self.GetPane(window) - - if not paneInfo.IsNotebookDockable(): - return self.AddPane1(window, pane_info) - if not target.IsNotebookDockable() and not target.IsNotebookControl(): - return self.AddPane1(window, pane_info) - - if not target.HasNotebook(): - self.CreateNotebookBase(self._panes, target) - - # Add new item to notebook - paneInfo.NotebookPage(target.notebook_id) - - # we also want to remove our captions sometimes - self.RemoveAutoNBCaption(paneInfo) - self.UpdateNotebook() - - return True - - - def InsertPane(self, window, pane_info, insert_level=AUI_INSERT_PANE): - """ - This method is used to insert either a previously unmanaged pane window - into the frame manager, or to insert a currently managed pane somewhere else. - L{InsertPane} will push all panes, rows, or docks aside and insert the window - into the position specified by `pane_info`. - - Because `pane_info` can specify either a pane, dock row, or dock layer, the - `insert_level` parameter is used to disambiguate this. The parameter `insert_level` - can take a value of ``AUI_INSERT_PANE``, ``AUI_INSERT_ROW`` or ``AUI_INSERT_DOCK``. - - :param `window`: the window to be inserted and managed; - :param `pane_info`: the insert location for the new window; - :param `insert_level`: the insertion level of the new pane. - """ - - if not window: - raise Exception("Invalid window passed to InsertPane.") - - # shift the panes around, depending on the insert level - if insert_level == AUI_INSERT_PANE: - self._panes = DoInsertPane(self._panes, pane_info.dock_direction, - pane_info.dock_layer, pane_info.dock_row, - pane_info.dock_pos) - - elif insert_level == AUI_INSERT_ROW: - self._panes = DoInsertDockRow(self._panes, pane_info.dock_direction, - pane_info.dock_layer, pane_info.dock_row) - - elif insert_level == AUI_INSERT_DOCK: - self._panes = DoInsertDockLayer(self._panes, pane_info.dock_direction, - pane_info.dock_layer) - - # if the window already exists, we are basically just moving/inserting the - # existing window. If it doesn't exist, we need to add it and insert it - existing_pane = self.GetPane(window) - indx = self._panes.index(existing_pane) - - if not existing_pane.IsOk(): - - return self.AddPane(window, pane_info) - - else: - - if pane_info.IsFloating(): - existing_pane.Float() - if pane_info.floating_pos != wx.Point(-1, -1): - existing_pane.FloatingPosition(pane_info.floating_pos) - if pane_info.floating_size != wx.Size(-1, -1): - existing_pane.FloatingSize(pane_info.floating_size) - else: - # if the new pane is docked then we should undo maximize - self.RestoreMaximizedPane() - - existing_pane.Direction(pane_info.dock_direction) - existing_pane.Layer(pane_info.dock_layer) - existing_pane.Row(pane_info.dock_row) - existing_pane.Position(pane_info.dock_pos) - - self._panes[indx] = existing_pane - - return True - - - def DetachPane(self, window): - """ - Tells the L{AuiManager} to stop managing the pane specified - by `window`. The window, if in a floated frame, is reparented to the frame - managed by L{AuiManager}. - - :param `window`: the window to be un-managed. - """ - - for p in self._panes: - if p.window == window: - if p.frame: - # we have a floating frame which is being detached. We need to - # reparent it to self._frame and destroy the floating frame - - # reduce flicker - p.window.SetSize((1, 1)) - if p.frame.IsShown(): - p.frame.Show(False) - - if self._action_window == p.frame: - self._action_window = None - - # reparent to self._frame and destroy the pane - p.window.Reparent(self._frame) - p.frame.SetSizer(None) - p.frame.Destroy() - p.frame = None - - elif p.IsNotebookPage(): - notebook = self._notebooks[p.notebook_id] - id = notebook.GetPageIndex(p.window) - notebook.RemovePage(id) - - # make sure there are no references to this pane in our uiparts, - # just in case the caller doesn't call Update() immediately after - # the DetachPane() call. This prevets obscure crashes which would - # happen at window repaint if the caller forgets to call Update() - counter = 0 - for pi in xrange(len(self._uiparts)): - part = self._uiparts[counter] - if part.pane == p: - self._uiparts.pop(counter) - counter -= 1 - - counter += 1 - - self._panes.remove(p) - return True - - return False - - - def ClosePane(self, pane_info): - """ - Destroys or hides the pane depending on its flags. - - :param `pane_info`: a L{AuiPaneInfo} instance. - """ - - # if we were maximized, restore - if pane_info.IsMaximized(): - self.RestorePane(pane_info) - - if pane_info.frame: - if self._agwFlags & AUI_MGR_ANIMATE_FRAMES: - pane_info.frame.FadeOut() - - # first, hide the window - if pane_info.window and pane_info.window.IsShown(): - pane_info.window.Show(False) - - # make sure that we are the parent of this window - if pane_info.window and pane_info.window.GetParent() != self._frame: - pane_info.window.Reparent(self._frame) - - # if we have a frame, destroy it - if pane_info.frame: - pane_info.frame.Destroy() - pane_info.frame = None - - elif pane_info.IsNotebookPage(): - # if we are a notebook page, remove ourselves... - # the code would index out of bounds - # if the last page of a sub-notebook was closed - # because the notebook would be deleted, before this - # code is executed. - # This code just prevents an out-of bounds error. - if self._notebooks: - nid = pane_info.notebook_id - if nid >= 0 and nid < len(self._notebooks): - notebook = self._notebooks[nid] - page_idx = notebook.GetPageIndex(pane_info.window) - if page_idx >= 0: - notebook.RemovePage(page_idx) - - # now we need to either destroy or hide the pane - to_destroy = 0 - if pane_info.IsDestroyOnClose(): - to_destroy = pane_info.window - self.DetachPane(to_destroy) - else: - if isinstance(pane_info.window, auibar.AuiToolBar) and pane_info.IsFloating(): - tb = pane_info.window - if pane_info.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT]: - tb.SetAGWWindowStyleFlag(tb.GetAGWWindowStyleFlag() | AUI_TB_VERTICAL) - - pane_info.Dock().Hide() - - if pane_info.IsNotebookControl(): - - notebook = self._notebooks[pane_info.notebook_id] - while notebook.GetPageCount(): - window = notebook.GetPage(0) - notebook.RemovePage(0) - info = self.GetPane(window) - if info.IsOk(): - info.notebook_id = -1 - info.dock_direction = AUI_DOCK_NONE - # Note: this could change our paneInfo reference ... - self.ClosePane(info) - - if to_destroy: - to_destroy.Destroy() - - - def MaximizePane(self, pane_info, savesizes=True): - """ - Maximizes the input pane. - - :param `pane_info`: a L{AuiPaneInfo} instance. - :param `savesizes`: whether to save previous dock sizes. - """ - - if savesizes: - self.SavePreviousDockSizes(pane_info) - - for p in self._panes: - - # save hidden state - p.SetFlag(p.savedHiddenState, p.HasFlag(p.optionHidden)) - - if not p.IsToolbar() and not p.IsFloating(): - p.Restore() - - # hide the pane, because only the newly - # maximized pane should show - p.Hide() - - pane_info.previousDockPos = pane_info.dock_pos - - # mark ourselves maximized - pane_info.Maximize() - pane_info.Show() - self._has_maximized = True - - # last, show the window - if pane_info.window and not pane_info.window.IsShown(): - pane_info.window.Show(True) - - - def SavePreviousDockSizes(self, pane_info): - """ - Stores the previous dock sizes, to be used in a "restore" action later. - - :param `pane_info`: a L{AuiPaneInfo} instance. - """ - - for d in self._docks: - if not d.toolbar: - for p in d.panes: - p.previousDockSize = d.size - if pane_info is not p: - p.SetFlag(p.needsRestore, True) - - - def RestorePane(self, pane_info): - """ - Restores the input pane from a previous maximized or minimized state. - - :param `pane_info`: a L{AuiPaneInfo} instance. - """ - - # restore all the panes - for p in self._panes: - if not p.IsToolbar(): - p.SetFlag(p.optionHidden, p.HasFlag(p.savedHiddenState)) - - pane_info.SetFlag(pane_info.needsRestore, True) - - # mark ourselves non-maximized - pane_info.Restore() - self._has_maximized = False - self._has_minimized = False - - # last, show the window - if pane_info.window and not pane_info.window.IsShown(): - pane_info.window.Show(True) - - - def RestoreMaximizedPane(self): - """ Restores the current maximized pane (if any). """ - - # restore all the panes - for p in self._panes: - if p.IsMaximized(): - self.RestorePane(p) - break - - - def ActivatePane(self, window): - """ - Activates the pane to which `window` is associated. - - :param `window`: a `wx.Window` derived window. - """ - - if self.GetAGWFlags() & AUI_MGR_ALLOW_ACTIVE_PANE: - while window: - ret, self._panes = SetActivePane(self._panes, window) - if ret: - break - - window = window.GetParent() - - self.RefreshCaptions() - self.FireEvent(wxEVT_AUI_PANE_ACTIVATED, window, canVeto=False) - - - def CreateNotebook(self): - """ - Creates an automatic L{AuiNotebook} when a pane is docked on - top of another pane. - """ - - notebook = auibook.AuiNotebook(self._frame, -1, wx.Point(0, 0), wx.Size(0, 0), agwStyle=self._autoNBStyle) - - # This is so we can get the tab-drag event. - notebook.GetAuiManager().SetMasterManager(self) - notebook.SetArtProvider(self._autoNBTabArt.Clone()) - self._notebooks.append(notebook) - - return notebook - - - def SetAutoNotebookTabArt(self, art): - """ - Sets the default tab art provider for automatic notebooks. - - :param `art`: a tab art provider. - """ - - for nb in self._notebooks: - nb.SetArtProvider(art.Clone()) - nb.Refresh() - nb.Update() - - self._autoNBTabArt = art - - - def GetAutoNotebookTabArt(self): - """ Returns the default tab art provider for automatic notebooks. """ - - return self._autoNBTabArt - - - def SetAutoNotebookStyle(self, agwStyle): - """ - Sets the default AGW-specific window style for automatic notebooks. - - :param `agwStyle`: the underlying L{AuiNotebook} window style. - This can be a combination of the following bits: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook - ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. - ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. - ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook - ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab - ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging - ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control - ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width - ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed - ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available - ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar - ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab - ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs - ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click - ``AUI_NB_SUB_NOTEBOOK`` This style is used by {AuiManager} to create automatic AuiNotebooks - ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present - ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows - ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items - ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) - ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages - ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) - ==================================== ================================== - - """ - - for nb in self._notebooks: - nb.SetAGWWindowStyleFlag(agwStyle) - nb.Refresh() - nb.Update() - - self._autoNBStyle = agwStyle - - - def GetAutoNotebookStyle(self): - """ - Returns the default AGW-specific window style for automatic notebooks. - - :see: L{SetAutoNotebookStyle} method for a list of possible styles. - """ - - return self._autoNBStyle - - - def SavePaneInfo(self, pane): - """ - This method is similar to L{SavePerspective}, with the exception - that it only saves information about a single pane. It is used in - combination with L{LoadPaneInfo}. - - :param `pane`: a L{AuiPaneInfo} instance to save. - """ - - result = "name=" + EscapeDelimiters(pane.name) + ";" - result += "caption=" + EscapeDelimiters(pane.caption) + ";" - - result += "state=%u;"%pane.state - result += "dir=%d;"%pane.dock_direction - result += "layer=%d;"%pane.dock_layer - result += "row=%d;"%pane.dock_row - result += "pos=%d;"%pane.dock_pos - result += "prop=%d;"%pane.dock_proportion - result += "bestw=%d;"%pane.best_size.x - result += "besth=%d;"%pane.best_size.y - result += "minw=%d;"%pane.min_size.x - result += "minh=%d;"%pane.min_size.y - result += "maxw=%d;"%pane.max_size.x - result += "maxh=%d;"%pane.max_size.y - result += "floatx=%d;"%pane.floating_pos.x - result += "floaty=%d;"%pane.floating_pos.y - result += "floatw=%d;"%pane.floating_size.x - result += "floath=%d;"%pane.floating_size.y - result += "notebookid=%d;"%pane.notebook_id - result += "transparent=%d"%pane.transparent - - return result - - - def LoadPaneInfo(self, pane_part, pane): - """ - This method is similar to to L{LoadPerspective}, with the exception that - it only loads information about a single pane. It is used in combination - with L{SavePaneInfo}. - - :param `pane_part`: the string to analyze; - :param `pane`: the L{AuiPaneInfo} structure in which to load `pane_part`. - """ - - # replace escaped characters so we can - # split up the string easily - pane_part = pane_part.replace("\\|", "\a") - pane_part = pane_part.replace("\\;", "\b") - - options = pane_part.split(";") - for items in options: - - val_name, value = items.split("=") - val_name = val_name.strip() - - if val_name == "name": - pane.name = value - elif val_name == "caption": - pane.caption = value - elif val_name == "state": - pane.state = int(value) - elif val_name == "dir": - pane.dock_direction = int(value) - elif val_name == "layer": - pane.dock_layer = int(value) - elif val_name == "row": - pane.dock_row = int(value) - elif val_name == "pos": - pane.dock_pos = int(value) - elif val_name == "prop": - pane.dock_proportion = int(value) - elif val_name == "bestw": - pane.best_size.x = int(value) - elif val_name == "besth": - pane.best_size.y = int(value) - pane.best_size = wx.Size(pane.best_size.x, pane.best_size.y) - elif val_name == "minw": - pane.min_size.x = int(value) - elif val_name == "minh": - pane.min_size.y = int(value) - pane.min_size = wx.Size(pane.min_size.x, pane.min_size.y) - elif val_name == "maxw": - pane.max_size.x = int(value) - elif val_name == "maxh": - pane.max_size.y = int(value) - pane.max_size = wx.Size(pane.max_size.x, pane.max_size.y) - elif val_name == "floatx": - pane.floating_pos.x = int(value) - elif val_name == "floaty": - pane.floating_pos.y = int(value) - pane.floating_pos = wx.Point(pane.floating_pos.x, pane.floating_pos.y) - elif val_name == "floatw": - pane.floating_size.x = int(value) - elif val_name == "floath": - pane.floating_size.y = int(value) - pane.floating_size = wx.Size(pane.floating_size.x, pane.floating_size.y) - elif val_name == "notebookid": - pane.notebook_id = int(value) - elif val_name == "transparent": - pane.transparent = int(value) - else: - raise Exception("Bad perspective string") - - # replace escaped characters so we can - # split up the string easily - pane.name = pane.name.replace("\a", "|") - pane.name = pane.name.replace("\b", ";") - pane.caption = pane.caption.replace("\a", "|") - pane.caption = pane.caption.replace("\b", ";") - pane_part = pane_part.replace("\a", "|") - pane_part = pane_part.replace("\b", ";") - - return pane - - - def SavePerspective(self): - """ - Saves the entire user interface layout into an encoded string, which can then - be stored by the application (probably using `wx.Config`). - - When a perspective is restored using L{LoadPerspective}, the entire user - interface will return to the state it was when the perspective was saved. - """ - - result = "layout2|" - - for pane in self._panes: - result += self.SavePaneInfo(pane) + "|" - - for dock in self._docks: - result = result + ("dock_size(%d,%d,%d)=%d|")%(dock.dock_direction, - dock.dock_layer, - dock.dock_row, - dock.size) - return result - - - def LoadPerspective(self, layout, update=True): - """ - Loads a layout which was saved with L{SavePerspective}. - - If the `update` flag parameter is ``True``, L{Update} will be - automatically invoked, thus realizing the saved perspective on screen. - - :param `layout`: a string which contains a saved AUI layout; - :param `update`: whether to update immediately the window or not. - """ - - input = layout - - # check layout string version - # 'layout1' = wxAUI 0.9.0 - wxAUI 0.9.2 - # 'layout2' = wxAUI 0.9.2 (wxWidgets 2.8) - index = input.find("|") - part = input[0:index].strip() - input = input[index+1:] - - if part != "layout2": - return False - - # mark all panes currently managed as docked and hidden - for pane in self._panes: - pane.Dock().Hide() - - # clear out the dock array; this will be reconstructed - self._docks = [] - - # replace escaped characters so we can - # split up the string easily - input = input.replace("\\|", "\a") - input = input.replace("\\;", "\b") - - while 1: - - pane = AuiPaneInfo() - index = input.find("|") - pane_part = input[0:index].strip() - input = input[index+1:] - - # if the string is empty, we're done parsing - if pane_part == "": - break - - if pane_part[0:9] == "dock_size": - index = pane_part.find("=") - val_name = pane_part[0:index] - value = pane_part[index+1:] - - index = val_name.find("(") - piece = val_name[index+1:] - index = piece.find(")") - piece = piece[0:index] - - vals = piece.split(",") - dir = int(vals[0]) - layer = int(vals[1]) - row = int(vals[2]) - size = int(value) - - dock = AuiDockInfo() - dock.dock_direction = dir - dock.dock_layer = layer - dock.dock_row = row - dock.size = size - self._docks.append(dock) - - continue - - # Undo our escaping as LoadPaneInfo needs to take an unescaped - # name so it can be called by external callers - pane_part = pane_part.replace("\a", "|") - pane_part = pane_part.replace("\b", ";") - - pane = self.LoadPaneInfo(pane_part, pane) - - p = self.GetPane(pane.name) - - if not p.IsOk(): - if pane.IsNotebookControl(): - # notebook controls - auto add... - self._panes.append(pane) - indx = self._panes.index(pane) - else: - # the pane window couldn't be found - # in the existing layout -- skip it - continue - - else: - indx = self._panes.index(p) - pane.window = p.window - pane.frame = p.frame - pane.buttons = p.buttons - self._panes[indx] = pane - - if isinstance(pane.window, auibar.AuiToolBar) and (pane.IsFloatable() or pane.IsDockable()): - pane.window.SetGripperVisible(True) - - if update: - self.Update() - - return True - - - def GetPanePositionsAndSizes(self, dock): - """ - Returns all the panes positions and sizes in a dock. - - :param `dock`: a L{AuiDockInfo} instance. - """ - - caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) - gripper_size = self._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) - - positions = [] - sizes = [] - - action_pane = -1 - pane_count = len(dock.panes) - - # find the pane marked as our action pane - for pane_i in xrange(pane_count): - pane = dock.panes[pane_i] - if pane.HasFlag(AuiPaneInfo.actionPane): - if action_pane != -1: - raise Exception("Too many action panes!") - action_pane = pane_i - - # set up each panes default position, and - # determine the size (width or height, depending - # on the dock's orientation) of each pane - for pane in dock.panes: - positions.append(pane.dock_pos) - size = 0 - - if pane.HasBorder(): - size += pane_border_size*2 - - if dock.IsHorizontal(): - if pane.HasGripper() and not pane.HasGripperTop(): - size += gripper_size - - if pane.HasCaptionLeft(): - size += caption_size - - size += pane.best_size.x - - else: - if pane.HasGripper() and pane.HasGripperTop(): - size += gripper_size - - if pane.HasCaption() and not pane.HasCaptionLeft(): - size += caption_size - - size += pane.best_size.y - - sizes.append(size) - - # if there is no action pane, just return the default - # positions (as specified in pane.pane_pos) - if action_pane == -1: - return positions, sizes - - offset = 0 - for pane_i in xrange(action_pane-1, -1, -1): - amount = positions[pane_i+1] - (positions[pane_i] + sizes[pane_i]) - if amount >= 0: - offset += amount - else: - positions[pane_i] -= -amount - - offset += sizes[pane_i] - - # if the dock mode is fixed, make sure none of the panes - # overlap we will bump panes that overlap - offset = 0 - for pane_i in xrange(action_pane, pane_count): - amount = positions[pane_i] - offset - if amount >= 0: - offset += amount - else: - positions[pane_i] += -amount - - offset += sizes[pane_i] - - return positions, sizes - - - def LayoutAddPane(self, cont, dock, pane, uiparts, spacer_only): - """ - Adds a pane into the existing layout (in an existing dock). - - :param `cont`: a `wx.Sizer` object; - :param `dock`: the L{AuiDockInfo} structure in which to add the pane; - :param `pane`: the L{AuiPaneInfo} instance to add to the dock; - :param `uiparts`: a list of UI parts in the interface; - :param `spacer_only`: whether to add a simple spacer or a real window. - """ - - sizer_item = wx.SizerItem() - caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - gripper_size = self._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) - pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) - pane_button_size = self._art.GetMetric(AUI_DOCKART_PANE_BUTTON_SIZE) - - # find out the orientation of the item (orientation for panes - # is the same as the dock's orientation) - - if dock.IsHorizontal(): - orientation = wx.HORIZONTAL - else: - orientation = wx.VERTICAL - - # this variable will store the proportion - # value that the pane will receive - pane_proportion = pane.dock_proportion - - horz_pane_sizer = wx.BoxSizer(wx.HORIZONTAL) - vert_pane_sizer = wx.BoxSizer(wx.VERTICAL) - - if pane.HasGripper(): - - part = AuiDockUIPart() - if pane.HasGripperTop(): - sizer_item = vert_pane_sizer.Add((1, gripper_size), 0, wx.EXPAND) - else: - sizer_item = horz_pane_sizer.Add((gripper_size, 1), 0, wx.EXPAND) - - part.type = AuiDockUIPart.typeGripper - part.dock = dock - part.pane = pane - part.button = None - part.orientation = orientation - part.cont_sizer = horz_pane_sizer - part.sizer_item = sizer_item - uiparts.append(part) - - button_count = len(pane.buttons) - button_width_total = button_count*pane_button_size - if button_count >= 1: - button_width_total += 3 - - caption, captionLeft = pane.HasCaption(), pane.HasCaptionLeft() - button_count = len(pane.buttons) - - if captionLeft: - caption_sizer = wx.BoxSizer(wx.VERTICAL) - - # add pane buttons to the caption - dummy_parts = [] - for btn_id in xrange(len(pane.buttons)-1, -1, -1): - sizer_item = caption_sizer.Add((caption_size, pane_button_size), 0, wx.EXPAND) - part = AuiDockUIPart() - part.type = AuiDockUIPart.typePaneButton - part.dock = dock - part.pane = pane - part.button = pane.buttons[btn_id] - part.orientation = orientation - part.cont_sizer = caption_sizer - part.sizer_item = sizer_item - dummy_parts.append(part) - - sizer_item = caption_sizer.Add((caption_size, 1), 1, wx.EXPAND) - vert_pane_sizer = wx.BoxSizer(wx.HORIZONTAL) - - # create the caption sizer - part = AuiDockUIPart() - - part.type = AuiDockUIPart.typeCaption - part.dock = dock - part.pane = pane - part.button = None - part.orientation = orientation - part.cont_sizer = vert_pane_sizer - part.sizer_item = sizer_item - caption_part_idx = len(uiparts) - uiparts.append(part) - uiparts.extend(dummy_parts) - - elif caption: - - caption_sizer = wx.BoxSizer(wx.HORIZONTAL) - sizer_item = caption_sizer.Add((1, caption_size), 1, wx.EXPAND) - - # create the caption sizer - part = AuiDockUIPart() - - part.type = AuiDockUIPart.typeCaption - part.dock = dock - part.pane = pane - part.button = None - part.orientation = orientation - part.cont_sizer = vert_pane_sizer - part.sizer_item = sizer_item - caption_part_idx = len(uiparts) - uiparts.append(part) - - # add pane buttons to the caption - for button in pane.buttons: - sizer_item = caption_sizer.Add((pane_button_size, caption_size), 0, wx.EXPAND) - part = AuiDockUIPart() - part.type = AuiDockUIPart.typePaneButton - part.dock = dock - part.pane = pane - part.button = button - part.orientation = orientation - part.cont_sizer = caption_sizer - part.sizer_item = sizer_item - uiparts.append(part) - - if caption or captionLeft: - # if we have buttons, add a little space to the right - # of them to ease visual crowding - if button_count >= 1: - if captionLeft: - caption_sizer.Add((caption_size, 3), 0, wx.EXPAND) - else: - caption_sizer.Add((3, caption_size), 0, wx.EXPAND) - - # add the caption sizer - sizer_item = vert_pane_sizer.Add(caption_sizer, 0, wx.EXPAND) - uiparts[caption_part_idx].sizer_item = sizer_item - - # add the pane window itself - if spacer_only or not pane.window: - sizer_item = vert_pane_sizer.Add((1, 1), 1, wx.EXPAND) - else: - sizer_item = vert_pane_sizer.Add(pane.window, 1, wx.EXPAND) - vert_pane_sizer.SetItemMinSize(pane.window, (1, 1)) - - part = AuiDockUIPart() - part.type = AuiDockUIPart.typePane - part.dock = dock - part.pane = pane - part.button = None - part.orientation = orientation - part.cont_sizer = vert_pane_sizer - part.sizer_item = sizer_item - uiparts.append(part) - - # determine if the pane should have a minimum size if the pane is - # non-resizable (fixed) then we must set a minimum size. Alternatively, - # if the pane.min_size is set, we must use that value as well - - min_size = pane.min_size - if pane.IsFixed(): - if min_size == wx.Size(-1, -1): - min_size = pane.best_size - pane_proportion = 0 - - if min_size != wx.Size(-1, -1): - vert_pane_sizer.SetItemMinSize(len(vert_pane_sizer.GetChildren())-1, (min_size.x, min_size.y)) - - # add the vertical/horizontal sizer (caption, pane window) to the - # horizontal sizer (gripper, vertical sizer) - horz_pane_sizer.Add(vert_pane_sizer, 1, wx.EXPAND) - - # finally, add the pane sizer to the dock sizer - if pane.HasBorder(): - # allowing space for the pane's border - sizer_item = cont.Add(horz_pane_sizer, pane_proportion, - wx.EXPAND | wx.ALL, pane_border_size) - part = AuiDockUIPart() - part.type = AuiDockUIPart.typePaneBorder - part.dock = dock - part.pane = pane - part.button = None - part.orientation = orientation - part.cont_sizer = cont - part.sizer_item = sizer_item - uiparts.append(part) - else: - sizer_item = cont.Add(horz_pane_sizer, pane_proportion, wx.EXPAND) - - return uiparts - - - def LayoutAddDock(self, cont, dock, uiparts, spacer_only): - """ - Adds a dock into the existing layout. - - :param `cont`: a `wx.Sizer` object; - :param `dock`: the L{AuiDockInfo} structure to add to the layout; - :param `uiparts`: a list of UI parts in the interface; - :param `spacer_only`: whether to add a simple spacer or a real window. - """ - - sizer_item = wx.SizerItem() - part = AuiDockUIPart() - - sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) - orientation = (dock.IsHorizontal() and [wx.HORIZONTAL] or [wx.VERTICAL])[0] - - # resizable bottom and right docks have a sash before them - if not self._has_maximized and not dock.fixed and \ - dock.dock_direction in [AUI_DOCK_BOTTOM, AUI_DOCK_RIGHT]: - - sizer_item = cont.Add((sash_size, sash_size), 0, wx.EXPAND) - - part.type = AuiDockUIPart.typeDockSizer - part.orientation = orientation - part.dock = dock - part.pane = None - part.button = None - part.cont_sizer = cont - part.sizer_item = sizer_item - uiparts.append(part) - - # create the sizer for the dock - dock_sizer = wx.BoxSizer(orientation) - - # add each pane to the dock - has_maximized_pane = False - pane_count = len(dock.panes) - - if dock.fixed: - - # figure out the real pane positions we will - # use, without modifying the each pane's pane_pos member - pane_positions, pane_sizes = self.GetPanePositionsAndSizes(dock) - - offset = 0 - for pane_i in xrange(pane_count): - - pane = dock.panes[pane_i] - pane_pos = pane_positions[pane_i] - - if pane.IsMaximized(): - has_maximized_pane = True - - amount = pane_pos - offset - if amount > 0: - - if dock.IsVertical(): - sizer_item = dock_sizer.Add((1, amount), 0, wx.EXPAND) - else: - sizer_item = dock_sizer.Add((amount, 1), 0, wx.EXPAND) - - part = AuiDockUIPart() - part.type = AuiDockUIPart.typeBackground - part.dock = dock - part.pane = None - part.button = None - part.orientation = (orientation==wx.HORIZONTAL and \ - [wx.VERTICAL] or [wx.HORIZONTAL])[0] - part.cont_sizer = dock_sizer - part.sizer_item = sizer_item - uiparts.append(part) - - offset = offset + amount - - uiparts = self.LayoutAddPane(dock_sizer, dock, pane, uiparts, spacer_only) - - offset = offset + pane_sizes[pane_i] - - # at the end add a very small stretchable background area - sizer_item = dock_sizer.Add((0, 0), 1, wx.EXPAND) - part = AuiDockUIPart() - part.type = AuiDockUIPart.typeBackground - part.dock = dock - part.pane = None - part.button = None - part.orientation = orientation - part.cont_sizer = dock_sizer - part.sizer_item = sizer_item - uiparts.append(part) - - else: - - for pane_i in xrange(pane_count): - - pane = dock.panes[pane_i] - - if pane.IsMaximized(): - has_maximized_pane = True - - # if this is not the first pane being added, - # we need to add a pane sizer - if not self._has_maximized and pane_i > 0: - sizer_item = dock_sizer.Add((sash_size, sash_size), 0, wx.EXPAND) - part = AuiDockUIPart() - part.type = AuiDockUIPart.typePaneSizer - part.dock = dock - part.pane = dock.panes[pane_i-1] - part.button = None - part.orientation = (orientation==wx.HORIZONTAL and \ - [wx.VERTICAL] or [wx.HORIZONTAL])[0] - part.cont_sizer = dock_sizer - part.sizer_item = sizer_item - uiparts.append(part) - - uiparts = self.LayoutAddPane(dock_sizer, dock, pane, uiparts, spacer_only) - - if dock.dock_direction == AUI_DOCK_CENTER or has_maximized_pane: - sizer_item = cont.Add(dock_sizer, 1, wx.EXPAND) - else: - sizer_item = cont.Add(dock_sizer, 0, wx.EXPAND) - - part = AuiDockUIPart() - part.type = AuiDockUIPart.typeDock - part.dock = dock - part.pane = None - part.button = None - part.orientation = orientation - part.cont_sizer = cont - part.sizer_item = sizer_item - uiparts.append(part) - - if dock.IsHorizontal(): - cont.SetItemMinSize(dock_sizer, (0, dock.size)) - else: - cont.SetItemMinSize(dock_sizer, (dock.size, 0)) - - # top and left docks have a sash after them - if not self._has_maximized and not dock.fixed and \ - dock.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_LEFT]: - - sizer_item = cont.Add((sash_size, sash_size), 0, wx.EXPAND) - - part = AuiDockUIPart() - part.type = AuiDockUIPart.typeDockSizer - part.dock = dock - part.pane = None - part.button = None - part.orientation = orientation - part.cont_sizer = cont - part.sizer_item = sizer_item - uiparts.append(part) - - return uiparts - - - def LayoutAll(self, panes, docks, uiparts, spacer_only=False, oncheck=True): - """ - Layouts all the UI structures in the interface. - - :param `panes`: a list of L{AuiPaneInfo} instances; - :param `docks`: a list of L{AuiDockInfo} classes; - :param `uiparts`: a list of UI parts in the interface; - :param `spacer_only`: whether to add a simple spacer or a real window; - :param `oncheck`: whether to store the results in a class member or not. - """ - - container = wx.BoxSizer(wx.VERTICAL) - - pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) - caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - cli_size = self._frame.GetClientSize() - - # empty all docks out - for dock in docks: - dock.panes = [] - if dock.fixed: - # always reset fixed docks' sizes, because - # the contained windows may have been resized - dock.size = 0 - - dock_count = len(docks) - - # iterate through all known panes, filing each - # of them into the appropriate dock. If the - # pane does not exist in the dock, add it - for p in panes: - - # don't layout hidden panes. - if p.IsShown(): - - # find any docks with the same dock direction, dock layer, and - # dock row as the pane we are working on - arr = FindDocks(docks, p.dock_direction, p.dock_layer, p.dock_row) - - if arr: - dock = arr[0] - - else: - # dock was not found, so we need to create a new one - d = AuiDockInfo() - d.dock_direction = p.dock_direction - d.dock_layer = p.dock_layer - d.dock_row = p.dock_row - docks.append(d) - dock = docks[-1] - - if p.HasFlag(p.needsRestore) and not p.HasFlag(p.wasMaximized): - - isHor = dock.IsHorizontal() - sashSize = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) - - # get the sizes of any docks that might - # overlap with our restored dock - - # make list of widths or heights from the size in the dock rects - sizes = [d.rect[2:][isHor] for \ - d in docks if d.IsOk() and \ - (d.IsHorizontal() == isHor) and \ - not d.toolbar and \ - d.dock_direction != AUI_DOCK_CENTER] - - frameRect = GetInternalFrameRect(self._frame, self._docks) - - # set max size allowing for sashes and absolute minimum - maxsize = frameRect[2:][isHor] - sum(sizes) - (len(sizes)*10) - (sashSize*len(sizes)) - dock.size = min(p.previousDockSize,maxsize) - - else: - dock.size = 0 - - if p.HasFlag(p.wasMaximized): - self.MaximizePane(p, savesizes=False) - p.SetFlag(p.wasMaximized, False) - - if p.HasFlag(p.needsRestore): - if p.previousDockPos is not None: - DoInsertPane(dock.panes, dock.dock_direction, dock.dock_layer, dock.dock_row, p.previousDockPos) - p.dock_pos = p.previousDockPos - p.previousDockPos = None - p.SetFlag(p.needsRestore, False) - - if p.IsDocked(): - # remove the pane from any existing docks except this one - docks = RemovePaneFromDocks(docks, p, dock) - - # pane needs to be added to the dock, - # if it doesn't already exist - if not FindPaneInDock(dock, p.window): - dock.panes.append(p) - else: - # remove the pane from any existing docks - docks = RemovePaneFromDocks(docks, p) - - # remove any empty docks - docks = [dock for dock in docks if dock.panes] - - dock_count = len(docks) - # configure the docks further - for ii, dock in enumerate(docks): - # sort the dock pane array by the pane's - # dock position (dock_pos), in ascending order - dock.panes.sort(PaneSortFunc) - dock_pane_count = len(dock.panes) - - # for newly created docks, set up their initial size - if dock.size == 0: - size = 0 - for pane in dock.panes: - pane_size = pane.best_size - if pane_size == wx.Size(-1, -1): - pane_size = pane.min_size - if pane_size == wx.Size(-1, -1) and pane.window: - pane_size = pane.window.GetSize() - if dock.IsHorizontal(): - size = max(pane_size.y, size) - else: - size = max(pane_size.x, size) - - # add space for the border (two times), but only - # if at least one pane inside the dock has a pane border - for pane in dock.panes: - if pane.HasBorder(): - size = size + pane_border_size*2 - break - - # if pane is on the top or bottom, add the caption height, - # but only if at least one pane inside the dock has a caption - if dock.IsHorizontal(): - for pane in dock.panes: - if pane.HasCaption() and not pane.HasCaptionLeft(): - size = size + caption_size - break - else: - for pane in dock.panes: - if pane.HasCaptionLeft() and not pane.HasCaption(): - size = size + caption_size - break - - # new dock's size may not be more than the dock constraint - # parameter specifies. See SetDockSizeConstraint() - max_dock_x_size = int(self._dock_constraint_x*float(cli_size.x)) - max_dock_y_size = int(self._dock_constraint_y*float(cli_size.y)) - if cli_size <= wx.Size(20, 20): - max_dock_x_size = 10000 - max_dock_y_size = 10000 - - if dock.IsHorizontal(): - size = min(size, max_dock_y_size) - else: - size = min(size, max_dock_x_size) - - # absolute minimum size for a dock is 10 pixels - if size < 10: - size = 10 - - dock.size = size - - # determine the dock's minimum size - plus_border = False - plus_caption = False - plus_caption_left = False - dock_min_size = 0 - for pane in dock.panes: - if pane.min_size != wx.Size(-1, -1): - if pane.HasBorder(): - plus_border = True - if pane.HasCaption(): - plus_caption = True - if pane.HasCaptionLeft(): - plus_caption_left = True - if dock.IsHorizontal(): - if pane.min_size.y > dock_min_size: - dock_min_size = pane.min_size.y - else: - if pane.min_size.x > dock_min_size: - dock_min_size = pane.min_size.x - - if plus_border: - dock_min_size += pane_border_size*2 - if plus_caption and dock.IsHorizontal(): - dock_min_size += caption_size - if plus_caption_left and dock.IsVertical(): - dock_min_size += caption_size - - dock.min_size = dock_min_size - - # if the pane's current size is less than it's - # minimum, increase the dock's size to it's minimum - if dock.size < dock.min_size: - dock.size = dock.min_size - - # determine the dock's mode (fixed or proportional) - # determine whether the dock has only toolbars - action_pane_marked = False - dock.fixed = True - dock.toolbar = True - for pane in dock.panes: - if not pane.IsFixed(): - dock.fixed = False - if not pane.IsToolbar(): - dock.toolbar = False - if pane.HasFlag(AuiPaneInfo.optionDockFixed): - dock.fixed = True - if pane.HasFlag(AuiPaneInfo.actionPane): - action_pane_marked = True - - # if the dock mode is proportional and not fixed-pixel, - # reassign the dock_pos to the sequential 0, 1, 2, 3 - # e.g. remove gaps like 1, 2, 30, 500 - if not dock.fixed: - for jj in xrange(dock_pane_count): - pane = dock.panes[jj] - pane.dock_pos = jj - - # if the dock mode is fixed, and none of the panes - # are being moved right now, make sure the panes - # do not overlap each other. If they do, we will - # adjust the panes' positions - if dock.fixed and not action_pane_marked: - pane_positions, pane_sizes = self.GetPanePositionsAndSizes(dock) - offset = 0 - for jj in xrange(dock_pane_count): - pane = dock.panes[jj] - pane.dock_pos = pane_positions[jj] - amount = pane.dock_pos - offset - if amount >= 0: - offset += amount - else: - pane.dock_pos += -amount - - offset += pane_sizes[jj] - dock.panes[jj] = pane - - if oncheck: - self._docks[ii] = dock - - # shrink docks if needed -## docks = self.SmartShrink(docks, AUI_DOCK_TOP) -## docks = self.SmartShrink(docks, AUI_DOCK_LEFT) - - if oncheck: - self._docks = docks - - # discover the maximum dock layer - max_layer = 0 - dock_count = len(docks) - - for ii in xrange(dock_count): - max_layer = max(max_layer, docks[ii].dock_layer) - - # clear out uiparts - uiparts = [] - - # create a bunch of box sizers, - # from the innermost level outwards. - cont = None - middle = None - - if oncheck: - docks = self._docks - - for layer in xrange(max_layer+1): - # find any docks in this layer - arr = FindDocks(docks, -1, layer, -1) - # if there aren't any, skip to the next layer - if not arr: - continue - - old_cont = cont - - # create a container which will hold this layer's - # docks (top, bottom, left, right) - cont = wx.BoxSizer(wx.VERTICAL) - - # find any top docks in this layer - arr = FindDocks(docks, AUI_DOCK_TOP, layer, -1) - for row in arr: - uiparts = self.LayoutAddDock(cont, row, uiparts, spacer_only) - - # fill out the middle layer (which consists - # of left docks, content area and right docks) - - middle = wx.BoxSizer(wx.HORIZONTAL) - - # find any left docks in this layer - arr = FindDocks(docks, AUI_DOCK_LEFT, layer, -1) - for row in arr: - uiparts = self.LayoutAddDock(middle, row, uiparts, spacer_only) - - # add content dock (or previous layer's sizer - # to the middle - if not old_cont: - # find any center docks - arr = FindDocks(docks, AUI_DOCK_CENTER, -1, -1) - if arr: - for row in arr: - uiparts = self.LayoutAddDock(middle, row, uiparts, spacer_only) - - elif not self._has_maximized: - # there are no center docks, add a background area - sizer_item = middle.Add((1, 1), 1, wx.EXPAND) - part = AuiDockUIPart() - part.type = AuiDockUIPart.typeBackground - part.pane = None - part.dock = None - part.button = None - part.cont_sizer = middle - part.sizer_item = sizer_item - uiparts.append(part) - else: - middle.Add(old_cont, 1, wx.EXPAND) - - # find any right docks in this layer - arr = FindDocks(docks, AUI_DOCK_RIGHT, layer, -1, reverse=True) - for row in arr: - uiparts = self.LayoutAddDock(middle, row, uiparts, spacer_only) - - if len(middle.GetChildren()) > 0: - cont.Add(middle, 1, wx.EXPAND) - - # find any bottom docks in this layer - arr = FindDocks(docks, AUI_DOCK_BOTTOM, layer, -1, reverse=True) - for row in arr: - uiparts = self.LayoutAddDock(cont, row, uiparts, spacer_only) - - if not cont: - # no sizer available, because there are no docks, - # therefore we will create a simple background area - cont = wx.BoxSizer(wx.VERTICAL) - sizer_item = cont.Add((1, 1), 1, wx.EXPAND) - part = AuiDockUIPart() - part.type = AuiDockUIPart.typeBackground - part.pane = None - part.dock = None - part.button = None - part.cont_sizer = middle - part.sizer_item = sizer_item - uiparts.append(part) - - if oncheck: - self._uiparts = uiparts - self._docks = docks - - container.Add(cont, 1, wx.EXPAND) - - if oncheck: - return container - else: - return container, panes, docks, uiparts - - - def SetDockSizeConstraint(self, width_pct, height_pct): - """ - When a user creates a new dock by dragging a window into a docked position, - often times the large size of the window will create a dock that is unwieldly - large. - - L{AuiManager} by default limits the size of any new dock to 1/3 of the window - size. For horizontal docks, this would be 1/3 of the window height. For vertical - docks, 1/3 of the width. Calling this function will adjust this constraint value. - - The numbers must be between 0.0 and 1.0. For instance, calling L{SetDockSizeConstraint} - with (0.5, 0.5) will cause new docks to be limited to half of the size of the entire - managed window. - - :param `width_pct`: a float number representing the x dock size constraint; - :param `width_pct`: a float number representing the y dock size constraint. - """ - - self._dock_constraint_x = max(0.0, min(1.0, width_pct)) - self._dock_constraint_y = max(0.0, min(1.0, height_pct)) - - - def GetDockSizeConstraint(self): - """ - Returns the current dock constraint values. - - :see: L{SetDockSizeConstraint} - """ - - return self._dock_constraint_x, self._dock_constraint_y - - - def Update(self): - """ - This method is called after any number of changes are made to any of the - managed panes. L{Update} must be invoked after L{AddPane} or L{InsertPane} are - called in order to "realize" or "commit" the changes. - - In addition, any number of changes may be made to L{AuiPaneInfo} structures - (retrieved with L{GetPane}), but to realize the changes, L{Update} - must be called. This construction allows pane flicker to be avoided by updating - the whole layout at one time. - """ - - self._hover_button = None - self._action_part = None - - # destroy floating panes which have been - # redocked or are becoming non-floating - for p in self._panes: - if p.IsFloating() or not p.frame: - continue - - # because the pane is no longer in a floating, we need to - # reparent it to self._frame and destroy the floating frame - # reduce flicker - p.window.SetSize((1, 1)) - - # the following block is a workaround for bug #1531361 - # (see wxWidgets sourceforge page). On wxGTK (only), when - # a frame is shown/hidden, a move event unfortunately - # also gets fired. Because we may be dragging around - # a pane, we need to cancel that action here to prevent - # a spurious crash. - if self._action_window == p.frame: - if self._frame.HasCapture(): - self._frame.ReleaseMouse() - self._action = actionNone - self._action_window = None - - # hide the frame - if p.frame.IsShown(): - p.frame.Show(False) - - if self._action_window == p.frame: - self._action_window = None - - # reparent to self._frame and destroy the pane - p.window.Reparent(self._frame) - if isinstance(p.window, auibar.AuiToolBar): - p.window.SetAuiManager(self) - - if p.frame: - p.frame.SetSizer(None) - p.frame.Destroy() - p.frame = None - - # Only the master manager should create/destroy notebooks... - if not self._masterManager: - self.UpdateNotebook() - - # delete old sizer first - self._frame.SetSizer(None) - - # create a layout for all of the panes - sizer = self.LayoutAll(self._panes, self._docks, self._uiparts, False) - - # hide or show panes as necessary, - # and float panes as necessary - - pane_count = len(self._panes) - - for ii in xrange(pane_count): - p = self._panes[ii] - pFrame = p.frame - - if p.IsFloating(): - if pFrame is None: - # we need to create a frame for this - # pane, which has recently been floated - frame = self.CreateFloatingFrame(self._frame, p) - - # on MSW and Mac, if the owner desires transparent dragging, and - # the dragging is happening right now, then the floating - # window should have this style by default - if self._action in [actionDragFloatingPane, actionDragToolbarPane] and \ - self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: - frame.SetTransparent(150) - - if p.IsToolbar(): - bar = p.window - if isinstance(bar, auibar.AuiToolBar): - bar.SetGripperVisible(False) - agwStyle = bar.GetAGWWindowStyleFlag() - bar.SetAGWWindowStyleFlag(agwStyle & ~AUI_TB_VERTICAL) - bar.Realize() - - s = p.window.GetMinSize() - p.BestSize(s) - p.FloatingSize(wx.DefaultSize) - - frame.SetPaneWindow(p) - p.needsTransparency = True - p.frame = pFrame = frame - if p.IsShown() and not frame.IsShown(): - frame.Show() - frame.Update() - else: - - # frame already exists, make sure it's position - # and size reflect the information in AuiPaneInfo - if pFrame.GetPosition() != p.floating_pos or pFrame.GetSize() != p.floating_size: - pFrame.SetDimensions(p.floating_pos.x, p.floating_pos.y, - p.floating_size.x, p.floating_size.y, wx.SIZE_USE_EXISTING) - - # update whether the pane is resizable or not - style = p.frame.GetWindowStyleFlag() - if p.IsFixed(): - style &= ~wx.RESIZE_BORDER - else: - style |= wx.RESIZE_BORDER - - p.frame.SetWindowStyleFlag(style) - - if pFrame.IsShown() != p.IsShown(): - p.needsTransparency = True - pFrame.Show(p.IsShown()) - - if pFrame.GetTitle() != p.caption: - pFrame.SetTitle(p.caption) - if p.icon.IsOk(): - pFrame.SetIcon(wx.IconFromBitmap(p.icon)) - - else: - - if p.IsToolbar(): -# self.SwitchToolBarOrientation(p) - p.best_size = p.window.GetBestSize() - - if p.window and not p.IsNotebookPage() and p.window.IsShown() != p.IsShown(): - p.window.Show(p.IsShown()) - - if pFrame and p.needsTransparency: - if pFrame.IsShown() and pFrame._transparent != p.transparent: - pFrame.SetTransparent(p.transparent) - pFrame._transparent = p.transparent - - p.needsTransparency = False - - # if "active panes" are no longer allowed, clear - # any optionActive values from the pane states - if self._agwFlags & AUI_MGR_ALLOW_ACTIVE_PANE == 0: - p.state &= ~AuiPaneInfo.optionActive - - self._panes[ii] = p - - old_pane_rects = [] - pane_count = len(self._panes) - - for p in self._panes: - r = wx.Rect() - if p.window and p.IsShown() and p.IsDocked(): - r = p.rect - - old_pane_rects.append(r) - - # apply the new sizer - self._frame.SetSizer(sizer) - self._frame.SetAutoLayout(False) - self.DoFrameLayout() - - # now that the frame layout is done, we need to check - # the new pane rectangles against the old rectangles that - # we saved a few lines above here. If the rectangles have - # changed, the corresponding panes must also be updated - for ii in xrange(pane_count): - p = self._panes[ii] - if p.window and p.IsShown() and p.IsDocked(): - if p.rect != old_pane_rects[ii]: - p.window.Refresh() - p.window.Update() - - if wx.Platform == "__WXMAC__": - self._frame.Refresh() - else: - self.Repaint() - - if not self._masterManager: - e = self.FireEvent(wxEVT_AUI_PERSPECTIVE_CHANGED, None, canVeto=False) - - - def UpdateNotebook(self): - """ Updates the automatic L{AuiNotebook} in the layout (if any exists). """ - - # Workout how many notebooks we need. - max_notebook = -1 - - # destroy floating panes which have been - # redocked or are becoming non-floating - for paneInfo in self._panes: - if max_notebook < paneInfo.notebook_id: - max_notebook = paneInfo.notebook_id - - # We are the master of our domain - extra_notebook = len(self._notebooks) - max_notebook += 1 - - for i in xrange(extra_notebook, max_notebook): - self.CreateNotebook() - - # Remove pages from notebooks that no-longer belong there ... - for nb, notebook in enumerate(self._notebooks): - pages = notebook.GetPageCount() - pageCounter, allPages = 0, pages - - # Check each tab ... - for page in xrange(pages): - - if page >= allPages: - break - - window = notebook.GetPage(pageCounter) - paneInfo = self.GetPane(window) - if paneInfo.IsOk() and paneInfo.notebook_id != nb: - notebook.RemovePage(pageCounter) - window.Hide() - window.Reparent(self._frame) - pageCounter -= 1 - allPages -= 1 - - pageCounter += 1 - - notebook.DoSizing() - - # Add notebook pages that aren't there already... - for paneInfo in self._panes: - if paneInfo.IsNotebookPage(): - - title = (paneInfo.caption == "" and [paneInfo.name] or [paneInfo.caption])[0] - - notebook = self._notebooks[paneInfo.notebook_id] - page_id = notebook.GetPageIndex(paneInfo.window) - - if page_id < 0: - - paneInfo.window.Reparent(notebook) - notebook.AddPage(paneInfo.window, title, True, paneInfo.icon) - - # Update title and icon ... - else: - - notebook.SetPageText(page_id, title) - notebook.SetPageBitmap(page_id, paneInfo.icon) - - notebook.DoSizing() - - # Wire-up newly created notebooks - elif paneInfo.IsNotebookControl() and not paneInfo.window: - paneInfo.window = self._notebooks[paneInfo.notebook_id] - - # Delete empty notebooks, and convert notebooks with 1 page to - # normal panes... - remap_ids = [-1]*len(self._notebooks) - nb_idx = 0 - - for nb, notebook in enumerate(self._notebooks): - if notebook.GetPageCount() == 1: - - # Convert notebook page to pane... - window = notebook.GetPage(0) - child_pane = self.GetPane(window) - notebook_pane = self.GetPane(notebook) - if child_pane.IsOk() and notebook_pane.IsOk(): - - child_pane.SetDockPos(notebook_pane) - child_pane.window.Hide() - child_pane.window.Reparent(self._frame) - child_pane.frame = None - child_pane.notebook_id = -1 - if notebook_pane.IsFloating(): - child_pane.Float() - - self.DetachPane(notebook) - - notebook.RemovePage(0) - notebook.Destroy() - - else: - - raise Exception("Odd notebook docking") - - elif notebook.GetPageCount() == 0: - - self.DetachPane(notebook) - notebook.Destroy() - - else: - - # Correct page ordering. The original wxPython code - # for this did not work properly, and would misplace - # windows causing errors. - notebook.Freeze() - self._notebooks[nb_idx] = notebook - pages = notebook.GetPageCount() - selected = notebook.GetPage(notebook.GetSelection()) - - # Take each page out of the notebook, group it with - # its current pane, and sort the list by pane.dock_pos - # order - pages_and_panes = [] - for idx in reversed(range(pages)): - page = notebook.GetPage(idx) - pane = self.GetPane(page) - pages_and_panes.append((page, pane)) - notebook.RemovePage(idx) - sorted_pnp = sorted(pages_and_panes, key=lambda tup: tup[1].dock_pos) - - # Grab the attributes from the panes which are ordered - # correctly, and copy those attributes to the original - # panes. (This avoids having to change the ordering - # of self._panes) Then, add the page back into the notebook - sorted_attributes = [self.GetAttributes(tup[1]) - for tup in sorted_pnp] - for attrs, tup in zip(sorted_attributes, pages_and_panes): - pane = tup[1] - self.SetAttributes(pane, attrs) - notebook.AddPage(pane.window, pane.caption) - - notebook.SetSelection(notebook.GetPageIndex(selected), True) - notebook.DoSizing() - notebook.Thaw() - - # It's a keeper. - remap_ids[nb] = nb_idx - nb_idx += 1 - - # Apply remap... - nb_count = len(self._notebooks) - - if nb_count != nb_idx: - - self._notebooks = self._notebooks[0:nb_idx] - for p in self._panes: - if p.notebook_id >= 0: - p.notebook_id = remap_ids[p.notebook_id] - if p.IsNotebookControl(): - p.SetNameFromNotebookId() - - # Make sure buttons are correct ... - for notebook in self._notebooks: - want_max = True - want_min = True - want_close = True - - pages = notebook.GetPageCount() - for page in xrange(pages): - - win = notebook.GetPage(page) - pane = self.GetPane(win) - if pane.IsOk(): - - if not pane.HasCloseButton(): - want_close = False - if not pane.HasMaximizeButton(): - want_max = False - if not pane.HasMinimizeButton(): - want_min = False - - notebook_pane = self.GetPane(notebook) - if notebook_pane.IsOk(): - if notebook_pane.HasMinimizeButton() != want_min: - if want_min: - button = AuiPaneButton(AUI_BUTTON_MINIMIZE) - notebook_pane.state |= AuiPaneInfo.buttonMinimize - notebook_pane.buttons.append(button) - - # todo: remove min/max - - if notebook_pane.HasMaximizeButton() != want_max: - if want_max: - button = AuiPaneButton(AUI_BUTTON_MAXIMIZE_RESTORE) - notebook_pane.state |= AuiPaneInfo.buttonMaximize - notebook_pane.buttons.append(button) - - # todo: remove min/max - - if notebook_pane.HasCloseButton() != want_close: - if want_close: - button = AuiPaneButton(AUI_BUTTON_CLOSE) - notebook_pane.state |= AuiPaneInfo.buttonClose - notebook_pane.buttons.append(button) - - # todo: remove close - - - def SmartShrink(self, docks, direction): - """ - Used to intelligently shrink the docks' size (if needed). - - :param `docks`: a list of L{AuiDockInfo} instances; - :param `direction`: the direction in which to shrink. - """ - - sashSize = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) - caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - clientSize = self._frame.GetClientSize() - ourDocks = FindDocks(docks, direction, -1, -1) - oppositeDocks = FindOppositeDocks(docks, direction) - oppositeSize = self.GetOppositeDockTotalSize(docks, direction) - ourSize = 0 - - for dock in ourDocks: - ourSize += dock.size - - if not dock.toolbar: - ourSize += sashSize - - shrinkSize = ourSize + oppositeSize - - if direction == AUI_DOCK_TOP or direction == AUI_DOCK_BOTTOM: - shrinkSize -= clientSize.y - else: - shrinkSize -= clientSize.x - - if shrinkSize <= 0: - return docks - - # Combine arrays - for dock in oppositeDocks: - ourDocks.append(dock) - - oppositeDocks = [] - - for dock in ourDocks: - if dock.toolbar or not dock.resizable: - continue - - dockRange = dock.size - dock.min_size - - if dock.min_size == 0: - dockRange -= sashSize - if direction == AUI_DOCK_TOP or direction == AUI_DOCK_BOTTOM: - dockRange -= caption_size - - if dockRange >= shrinkSize: - - dock.size -= shrinkSize - return docks - - else: - - dock.size -= dockRange - shrinkSize -= dockRange - - return docks - - - def UpdateDockingGuides(self, paneInfo): - """ - Updates the docking guide windows positions and appearance. - - :param `paneInfo`: a L{AuiPaneInfo} instance. - """ - - if len(self._guides) == 0: - self.CreateGuideWindows() - - captionSize = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - frameRect = GetInternalFrameRect(self._frame, self._docks) - mousePos = wx.GetMousePosition() - - for indx, guide in enumerate(self._guides): - - pt = wx.Point() - guide_size = guide.host.GetSize() - if not guide.host: - raise Exception("Invalid docking host") - - direction = guide.dock_direction - - if direction == AUI_DOCK_LEFT: - pt.x = frameRect.x + guide_size.x / 2 + 16 - pt.y = frameRect.y + frameRect.height / 2 - - elif direction == AUI_DOCK_TOP: - pt.x = frameRect.x + frameRect.width / 2 - pt.y = frameRect.y + guide_size.y / 2 + 16 - - elif direction == AUI_DOCK_RIGHT: - pt.x = frameRect.x + frameRect.width - guide_size.x / 2 - 16 - pt.y = frameRect.y + frameRect.height / 2 - - elif direction == AUI_DOCK_BOTTOM: - pt.x = frameRect.x + frameRect.width / 2 - pt.y = frameRect.y + frameRect.height - guide_size.y / 2 - 16 - - elif direction == AUI_DOCK_CENTER: - rc = paneInfo.window.GetScreenRect() - pt.x = rc.x + rc.width / 2 - pt.y = rc.y + rc.height / 2 - if paneInfo.HasCaption(): - pt.y -= captionSize / 2 - elif paneInfo.HasCaptionLeft(): - pt.x -= captionSize / 2 - - # guide will be centered around point 'pt' - targetPosition = wx.Point(pt.x - guide_size.x / 2, pt.y - guide_size.y / 2) - - if guide.host.GetPosition() != targetPosition: - guide.host.Move(targetPosition) - - guide.host.AeroMove(targetPosition) - - if guide.dock_direction == AUI_DOCK_CENTER: - guide.host.ValidateNotebookDocking(paneInfo.IsNotebookDockable()) - - guide.host.UpdateDockGuide(mousePos) - - paneInfo.window.Lower() - - - def DoFrameLayout(self): - """ - This is an internal function which invokes `wx.Sizer.Layout` - on the frame's main sizer, then measures all the various UI items - and updates their internal rectangles. - - :note: This should always be called instead of calling - `self._managed_window.Layout()` directly. - """ - - self._frame.Layout() - - for part in self._uiparts: - # get the rectangle of the UI part - # originally, this code looked like this: - # part.rect = wx.Rect(part.sizer_item.GetPosition(), - # part.sizer_item.GetSize()) - # this worked quite well, with one exception: the mdi - # client window had a "deferred" size variable - # that returned the wrong size. It looks like - # a bug in wx, because the former size of the window - # was being returned. So, we will retrieve the part's - # rectangle via other means - - part.rect = part.sizer_item.GetRect() - flag = part.sizer_item.GetFlag() - border = part.sizer_item.GetBorder() - - if flag & wx.TOP: - part.rect.y -= border - part.rect.height += border - if flag & wx.LEFT: - part.rect.x -= border - part.rect.width += border - if flag & wx.BOTTOM: - part.rect.height += border - if flag & wx.RIGHT: - part.rect.width += border - - if part.type == AuiDockUIPart.typeDock: - part.dock.rect = part.rect - if part.type == AuiDockUIPart.typePane: - part.pane.rect = part.rect - - - def GetPanePart(self, wnd): - """ - Looks up the pane border UI part of the - pane specified. This allows the caller to get the exact rectangle - of the pane in question, including decorations like caption and border. - - :param `wnd`: the window to which the pane border belongs to. - """ - - for part in self._uiparts: - if part.type == AuiDockUIPart.typePaneBorder and \ - part.pane and part.pane.window == wnd: - return part - - for part in self._uiparts: - if part.type == AuiDockUIPart.typePane and \ - part.pane and part.pane.window == wnd: - return part - - return None - - - def GetDockPixelOffset(self, test): - """ - This is an internal function which returns - a dock's offset in pixels from the left side of the window - (for horizontal docks) or from the top of the window (for - vertical docks). - - This value is necessary for calculating fixed-pane/toolbar offsets - when they are dragged. - - :param `test`: a fake L{AuiPaneInfo} for testing purposes. - """ - - # the only way to accurately calculate the dock's - # offset is to actually run a theoretical layout - docks, panes = CopyDocksAndPanes2(self._docks, self._panes) - panes.append(test) - - sizer, panes, docks, uiparts = self.LayoutAll(panes, docks, [], True, False) - client_size = self._frame.GetClientSize() - sizer.SetDimension(0, 0, client_size.x, client_size.y) - sizer.Layout() - - for part in uiparts: - pos = part.sizer_item.GetPosition() - size = part.sizer_item.GetSize() - part.rect = wx.RectPS(pos, size) - if part.type == AuiDockUIPart.typeDock: - part.dock.rect = part.rect - - sizer.Destroy() - - for dock in docks: - if test.dock_direction == dock.dock_direction and \ - test.dock_layer == dock.dock_layer and \ - test.dock_row == dock.dock_row: - - if dock.IsVertical(): - return dock.rect.y - else: - return dock.rect.x - - return 0 - - - def GetPartnerDock(self, dock): - """ - Returns the partner dock for the input dock. - - :param `dock`: a L{AuiDockInfo} instance. - """ - - for layer in xrange(dock.dock_layer, -1, -1): - - bestDock = None - - for tmpDock in self._docks: - - if tmpDock.dock_layer != layer: - continue - - if tmpDock.dock_direction != dock.dock_direction: - continue - - if tmpDock.dock_layer < dock.dock_layer: - - if not bestDock or tmpDock.dock_row < bestDock.dock_row: - bestDock = tmpDock - - elif tmpDock.dock_row > dock.dock_row: - - if not bestDock or tmpDock.dock_row > bestDock.dock_row: - bestDock = tmpDock - - if bestDock: - return bestDock - - return None - - - def GetPartnerPane(self, dock, pane): - """ - Returns the partner pane for the input pane. They both need to live - in the same L{AuiDockInfo}. - - :param `dock`: a L{AuiDockInfo} instance; - :param `pane`: a L{AuiPaneInfo} class. - """ - - panePosition = -1 - - for i, tmpPane in enumerate(dock.panes): - if tmpPane.window == pane.window: - panePosition = i - elif not tmpPane.IsFixed() and panePosition != -1: - return tmpPane - - return None - - - def GetTotalPixSizeAndProportion(self, dock): - """ - Returns the dimensions and proportion of the input dock. - - :param `dock`: the L{AuiDockInfo} structure to analyze. - """ - - totalPixsize = 0 - totalProportion = 0 - - # determine the total proportion of all resizable panes, - # and the total size of the dock minus the size of all - # the fixed panes - for tmpPane in dock.panes: - - if tmpPane.IsFixed(): - continue - - totalProportion += tmpPane.dock_proportion - - if dock.IsHorizontal(): - totalPixsize += tmpPane.rect.width - else: - totalPixsize += tmpPane.rect.height - -## if tmpPane.min_size.IsFullySpecified(): -## -## if dock.IsHorizontal(): -## totalPixsize -= tmpPane.min_size.x -## else: -## totalPixsize -= tmpPane.min_size.y - - return totalPixsize, totalProportion - - - def GetOppositeDockTotalSize(self, docks, direction): - """ - Returns the dimensions of the dock which lives opposite of the input dock. - - :param `docks`: a list of L{AuiDockInfo} structures to analyze; - :param `direction`: the direction in which to look for the opposite dock. - """ - - sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) - caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) - minSizeMax = 0 - result = sash_size - vertical = False - - if direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM]: - vertical = True - - # Get minimum size of the most inner area - for tmpDock in docks: - - if tmpDock.dock_layer != 0: - continue - - if tmpDock.dock_direction != AUI_DOCK_CENTER and tmpDock.IsVertical() != vertical: - continue - - for tmpPane in tmpDock.panes: - - minSize = pane_border_size*2 - sash_size - - if vertical: - minSize += tmpPane.min_size.y + caption_size - else: - minSize += tmpPane.min_size.x - - if minSize > minSizeMax: - minSizeMax = minSize - - result += minSizeMax - - # Get opposite docks - oppositeDocks = FindOppositeDocks(docks, direction) - - # Sum size of the opposite docks and their sashes - for dock in oppositeDocks: - result += dock.size - # if it's not a toolbar add the sash_size too - if not dock.toolbar: - result += sash_size - - return result - - - def CalculateDockSizerLimits(self, dock): - """ - Calculates the minimum and maximum sizes allowed for the input dock. - - :param `dock`: the L{AuiDockInfo} structure to analyze. - """ - - docks, panes = CopyDocksAndPanes2(self._docks, self._panes) - - sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) - caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - opposite_size = self.GetOppositeDockTotalSize(docks, dock.dock_direction) - - for tmpDock in docks: - - if tmpDock.dock_direction == dock.dock_direction and \ - tmpDock.dock_layer == dock.dock_layer and \ - tmpDock.dock_row == dock.dock_row: - - tmpDock.size = 1 - break - - sizer, panes, docks, uiparts = self.LayoutAll(panes, docks, [], True, False) - client_size = self._frame.GetClientSize() - sizer.SetDimension(0, 0, client_size.x, client_size.y) - sizer.Layout() - - for part in uiparts: - - part.rect = wx.RectPS(part.sizer_item.GetPosition(), part.sizer_item.GetSize()) - if part.type == AuiDockUIPart.typeDock: - part.dock.rect = part.rect - - sizer.Destroy() - new_dock = None - - for tmpDock in docks: - if tmpDock.dock_direction == dock.dock_direction and \ - tmpDock.dock_layer == dock.dock_layer and \ - tmpDock.dock_row == dock.dock_row: - - new_dock = tmpDock - break - - partnerDock = self.GetPartnerDock(dock) - - if partnerDock: - partnerRange = partnerDock.size - partnerDock.min_size - if partnerDock.min_size == 0: - partnerRange -= sash_size - if dock.IsHorizontal(): - partnerRange -= caption_size - - direction = dock.dock_direction - - if direction == AUI_DOCK_LEFT: - minPix = new_dock.rect.x + new_dock.rect.width - maxPix = dock.rect.x + dock.rect.width - maxPix += partnerRange - - elif direction == AUI_DOCK_TOP: - minPix = new_dock.rect.y + new_dock.rect.height - maxPix = dock.rect.y + dock.rect.height - maxPix += partnerRange - - elif direction == AUI_DOCK_RIGHT: - minPix = dock.rect.x - partnerRange - sash_size - maxPix = new_dock.rect.x - sash_size - - elif direction == AUI_DOCK_BOTTOM: - minPix = dock.rect.y - partnerRange - sash_size - maxPix = new_dock.rect.y - sash_size - - return minPix, maxPix - - direction = new_dock.dock_direction - - if direction == AUI_DOCK_LEFT: - minPix = new_dock.rect.x + new_dock.rect.width - maxPix = client_size.x - opposite_size - sash_size - - elif direction == AUI_DOCK_TOP: - minPix = new_dock.rect.y + new_dock.rect.height - maxPix = client_size.y - opposite_size - sash_size - - elif direction == AUI_DOCK_RIGHT: - minPix = opposite_size - maxPix = new_dock.rect.x - sash_size - - elif direction == AUI_DOCK_BOTTOM: - minPix = opposite_size - maxPix = new_dock.rect.y - sash_size - - return minPix, maxPix - - - def CalculatePaneSizerLimits(self, dock, pane): - """ - Calculates the minimum and maximum sizes allowed for the input pane. - - :param `dock`: the L{AuiDockInfo} structure to which `pane` belongs to; - :param `pane`: a L{AuiPaneInfo} class for which calculation are requested. - """ - - if pane.IsFixed(): - if dock.IsHorizontal(): - minPix = maxPix = pane.rect.x + 1 + pane.rect.width - else: - minPix = maxPix = pane.rect.y + 1 + pane.rect.height - - return minPix, maxPix - - totalPixsize, totalProportion = self.GetTotalPixSizeAndProportion(dock) - partnerPane = self.GetPartnerPane(dock, pane) - - if dock.IsHorizontal(): - - minPix = pane.rect.x + 1 - maxPix = pane.rect.x + 1 + pane.rect.width - - if pane.min_size.IsFullySpecified(): - minPix += pane.min_size.x - else: - minPix += 1 - - if partnerPane: - maxPix += partnerPane.rect.width - - if partnerPane.min_size.IsFullySpecified(): - maxPix -= partnerPane.min_size.x - 1 - - else: - minPix = maxPix - - else: - - minPix = pane.rect.y + 1 - maxPix = pane.rect.y + 1 + pane.rect.height - - if pane.min_size.IsFullySpecified(): - minPix += pane.min_size.y - else: - minPix += 1 - - if partnerPane: - maxPix += partnerPane.rect.height - - if partnerPane.min_size.IsFullySpecified(): - maxPix -= partnerPane.min_size.y - 1 - - else: - minPix = maxPix - - return minPix, maxPix - - - def CheckMovableSizer(self, part): - """ - Checks if a UI part can be actually resized. - - :param `part`: a UI part. - """ - - # a dock may not be resized if it has a single - # pane which is not resizable - if part.type == AuiDockUIPart.typeDockSizer and part.dock and \ - len(part.dock.panes) == 1 and part.dock.panes[0].IsFixed(): - - return False - - if part.pane: - - # panes that may not be resized should be ignored here - minPix, maxPix = self.CalculatePaneSizerLimits(part.dock, part.pane) - - if minPix == maxPix: - return False - - return True - - - def PaneFromTabEvent(self, event): - """ - Returns a L{AuiPaneInfo} from a L{AuiNotebookEvent} event. - - :param `event`: a L{AuiNotebookEvent} event. - """ - - obj = event.GetEventObject() - - if obj and isinstance(obj, auibook.AuiTabCtrl): - - page_idx = obj.GetActivePage() - - if page_idx >= 0: - page = obj.GetPage(page_idx) - window = page.window - if window: - return self.GetPane(window) - - elif obj and isinstance(obj, auibook.AuiNotebook): - - page_idx = event.GetSelection() - - if page_idx >= 0: - window = obj.GetPage(page_idx) - if window: - return self.GetPane(window) - - return NonePaneInfo - - - def OnTabBeginDrag(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_BEGIN_DRAG`` event. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - if self._masterManager: - self._masterManager.OnTabBeginDrag(event) - - else: - paneInfo = self.PaneFromTabEvent(event) - - if paneInfo.IsOk(): - - # It's one of ours! - self._action = actionDragFloatingPane - mouse = wx.GetMousePosition() - - # set initial float position - may have to think about this - # offset a bit more later ... - self._action_offset = wx.Point(20, 10) - self._toolbar_action_offset = wx.Point(20, 10) - - paneInfo.floating_pos = mouse - self._action_offset - paneInfo.dock_pos = AUI_DOCK_NONE - paneInfo.notebook_id = -1 - - tab = event.GetEventObject() - - if tab.HasCapture(): - tab.ReleaseMouse() - - # float the window - if paneInfo.IsMaximized(): - self.RestorePane(paneInfo) - paneInfo.Float() - self.Update() - - self._action_window = paneInfo.window - - self._frame.CaptureMouse() - event.SetDispatched(True) - - else: - - # not our window - event.Skip() - - - def OnTabPageClose(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_PAGE_CLOSE`` event. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - if self._masterManager: - self._masterManager.OnTabPageClose(event) - - else: - - p = self.PaneFromTabEvent(event) - if p.IsOk(): - - # veto it because we will call "RemovePage" ourselves - event.Veto() - - # Now ask the app if they really want to close... - # fire pane close event - e = AuiManagerEvent(wxEVT_AUI_PANE_CLOSE) - e.SetPane(p) - e.SetCanVeto(True) - self.ProcessMgrEvent(e) - - if e.GetVeto(): - return - - self.ClosePane(p) - self.Update() - else: - event.Skip() - - - def OnTabSelected(self, event): - """ - Handles the ``EVT_AUINOTEBOOK_PAGE_CHANGED`` event. - - :param `event`: a L{AuiNotebookEvent} event to be processed. - """ - - if self._masterManager: - self._masterManager.OnTabSelected(event) - return - - obj = event.GetEventObject() - - if obj and isinstance(obj, auibook.AuiNotebook): - - notebook = obj - page = notebook.GetPage(event.GetSelection()) - paneInfo = self.GetPane(page) - - if paneInfo.IsOk(): - notebookRoot = GetNotebookRoot(self._panes, paneInfo.notebook_id) - if notebookRoot: - - notebookRoot.Caption(paneInfo.caption) - self.RefreshCaptions() - - event.Skip() - - - def GetNotebooks(self): - """ Returns all the automatic L{AuiNotebook} in the L{AuiManager}. """ - - if self._masterManager: - return self._masterManager.GetNotebooks() - - return self._notebooks - - - def SetMasterManager(self, manager): - """ - Sets the master manager for an automatic L{AuiNotebook}. - - :param `manager`: an instance of L{AuiManager}. - """ - - self._masterManager = manager - - - def ProcessDockResult(self, target, new_pos): - """ - This is a utility function used by L{DoDrop} - it checks - if a dock operation is allowed, the new dock position is copied into - the target info. If the operation was allowed, the function returns ``True``. - - :param `target`: the L{AuiPaneInfo} instance to be docked; - :param `new_pos`: the new docking position if the docking operation is allowed. - """ - - allowed = False - direction = new_pos.dock_direction - - if direction == AUI_DOCK_TOP: - allowed = target.IsTopDockable() - elif direction == AUI_DOCK_BOTTOM: - allowed = target.IsBottomDockable() - elif direction == AUI_DOCK_LEFT: - allowed = target.IsLeftDockable() - elif direction == AUI_DOCK_RIGHT: - allowed = target.IsRightDockable() - - if allowed: - target = new_pos - - if target.IsToolbar(): - self.SwitchToolBarOrientation(target) - - return allowed, target - - - def SwitchToolBarOrientation(self, pane): - """ - Switches the toolbar orientation from vertical to horizontal and vice-versa. - This is especially useful for vertical docked toolbars once they float. - - :param `pane`: an instance of L{AuiPaneInfo}, which may have a L{AuiToolBar} - window associated with it. - """ - - if not isinstance(pane.window, auibar.AuiToolBar): - return pane - - if pane.IsFloating(): - return pane - - toolBar = pane.window - direction = pane.dock_direction - vertical = direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT] - - agwStyle = toolBar.GetAGWWindowStyleFlag() - new_agwStyle = agwStyle - - if vertical: - new_agwStyle |= AUI_TB_VERTICAL - else: - new_agwStyle &= ~(AUI_TB_VERTICAL) - - if agwStyle != new_agwStyle: - toolBar.SetAGWWindowStyleFlag(new_agwStyle) - if not toolBar.GetGripperVisible(): - toolBar.SetGripperVisible(True) - - s = pane.window.GetMinSize() - pane.BestSize(s) - - if new_agwStyle != agwStyle: - toolBar.Realize() - - return pane - - - def DoDrop(self, docks, panes, target, pt, offset=wx.Point(0, 0)): - """ - This is an important function. It basically takes a mouse position, - and determines where the panes new position would be. If the pane is to be - dropped, it performs the drop operation using the specified dock and pane - arrays. By specifying copy dock and pane arrays when calling, a "what-if" - scenario can be performed, giving precise coordinates for drop hints. - - :param `docks`: a list of L{AuiDockInfo} classes; - :param `panes`: a list of L{AuiPaneInfo} instances; - :param `pt`: a mouse position to check for a drop operation; - :param `offset`: a possible offset from the input point `pt`. - """ - - if target.IsToolbar(): - return self.DoDropToolbar(docks, panes, target, pt, offset) - elif target.IsFloating(): - return self.DoDropFloatingPane(docks, panes, target, pt) - else: - return self.DoDropNonFloatingPane(docks, panes, target, pt) - - - def CopyTarget(self, target): - """ - Copies all the attributes of the input `target` into another L{AuiPaneInfo}. - - :param `target`: the source L{AuiPaneInfo} from where to copy attributes. - """ - - drop = AuiPaneInfo() - drop.name = target.name - drop.caption = target.caption - drop.window = target.window - drop.frame = target.frame - drop.state = target.state - drop.dock_direction = target.dock_direction - drop.dock_layer = target.dock_layer - drop.dock_row = target.dock_row - drop.dock_pos = target.dock_pos - drop.best_size = wx.Size(*target.best_size) - drop.min_size = wx.Size(*target.min_size) - drop.max_size = wx.Size(*target.max_size) - drop.floating_pos = wx.Point(*target.floating_pos) - drop.floating_size = wx.Size(*target.floating_size) - drop.dock_proportion = target.dock_proportion - drop.buttons = target.buttons - drop.rect = wx.Rect(*target.rect) - drop.icon = target.icon - drop.notebook_id = target.notebook_id - drop.transparent = target.transparent - drop.snapped = target.snapped - drop.minimize_mode = target.minimize_mode - - return drop - - - def DoDropToolbar(self, docks, panes, target, pt, offset): - """ - Handles the situation in which the dropped pane contains a toolbar. - - :param `docks`: a list of L{AuiDockInfo} classes; - :param `panes`: a list of L{AuiPaneInfo} instances; - :param `target`: the target pane containing the toolbar; - :param `pt`: a mouse position to check for a drop operation; - :param `offset`: a possible offset from the input point `pt`. - """ - - drop = self.CopyTarget(target) - - # The result should always be shown - drop.Show() - - # Check to see if the toolbar has been dragged out of the window - if CheckOutOfWindow(self._frame, pt): - if self._agwFlags & AUI_MGR_ALLOW_FLOATING and drop.IsFloatable(): - drop.Float() - - return self.ProcessDockResult(target, drop) - - # Allow directional change when the cursor leaves this rect - safeRect = wx.Rect(*target.rect) - if target.IsHorizontal(): - safeRect.Inflate(100, 50) - else: - safeRect.Inflate(50, 100) - - # Check to see if the toolbar has been dragged to edge of the frame - dropDir = CheckEdgeDrop(self._frame, docks, pt) - - if dropDir != -1: - - if dropDir == wx.LEFT: - drop.Dock().Left().Layer(auiToolBarLayer).Row(0). \ - Position(pt.y - self.GetDockPixelOffset(drop) - offset.y) - - elif dropDir == wx.RIGHT: - drop.Dock().Right().Layer(auiToolBarLayer).Row(0). \ - Position(pt.y - self.GetDockPixelOffset(drop) - offset.y) - - elif dropDir == wx.TOP: - drop.Dock().Top().Layer(auiToolBarLayer).Row(0). \ - Position(pt.x - self.GetDockPixelOffset(drop) - offset.x) - - elif dropDir == wx.BOTTOM: - drop.Dock().Bottom().Layer(auiToolBarLayer).Row(0). \ - Position(pt.x - self.GetDockPixelOffset(drop) - offset.x) - - if not target.IsFloating() and safeRect.Contains(pt) and \ - target.dock_direction != drop.dock_direction: - return False, target - - return self.ProcessDockResult(target, drop) - - # If the windows is floating and out of the client area, do nothing - if drop.IsFloating() and not self._frame.GetClientRect().Contains(pt): - return False, target - - # Ok, can't drop on edge - check internals ... - - clientSize = self._frame.GetClientSize() - x = Clip(pt.x, 0, clientSize.x - 1) - y = Clip(pt.y, 0, clientSize.y - 1) - part = self.HitTest(x, y) - - if not part or not part.dock: - return False, target - - dock = part.dock - - # toolbars may only be moved in and to fixed-pane docks, - # otherwise we will try to float the pane. Also, the pane - # should float if being dragged over center pane windows - if not dock.fixed or dock.dock_direction == AUI_DOCK_CENTER: - - if (self._agwFlags & AUI_MGR_ALLOW_FLOATING and drop.IsFloatable()) or \ - dock.dock_direction not in [AUI_DOCK_CENTER, AUI_DOCK_NONE]: - if drop.IsFloatable(): - drop.Float() - - return self.ProcessDockResult(target, drop) - - # calculate the offset from where the dock begins - # to the point where the user dropped the pane - dockDropOffset = 0 - if dock.IsHorizontal(): - dockDropOffset = pt.x - dock.rect.x - offset.x - else: - dockDropOffset = pt.y - dock.rect.y - offset.y - - drop.Dock().Direction(dock.dock_direction).Layer(dock.dock_layer). \ - Row(dock.dock_row).Position(dockDropOffset) - - if (pt.y <= dock.rect.GetTop() + 2 and dock.IsHorizontal()) or \ - (pt.x <= dock.rect.GetLeft() + 2 and dock.IsVertical()): - - if dock.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_LEFT]: - row = drop.dock_row - panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row) - drop.dock_row = row - - else: - panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row+1) - drop.dock_row = dock.dock_row + 1 - - if (pt.y >= dock.rect.GetBottom() - 2 and dock.IsHorizontal()) or \ - (pt.x >= dock.rect.GetRight() - 2 and dock.IsVertical()): - - if dock.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_LEFT]: - panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row+1) - drop.dock_row = dock.dock_row+1 - - else: - row = drop.dock_row - panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row) - drop.dock_row = row - - if not target.IsFloating() and safeRect.Contains(pt) and \ - target.dock_direction != drop.dock_direction: - return False, target - - return self.ProcessDockResult(target, drop) - - - def DoDropFloatingPane(self, docks, panes, target, pt): - """ - Handles the situation in which the dropped pane contains a normal window. - - :param `docks`: a list of L{AuiDockInfo} classes; - :param `panes`: a list of L{AuiPaneInfo} instances; - :param `target`: the target pane containing the window; - :param `pt`: a mouse position to check for a drop operation. - """ - - screenPt = self._frame.ClientToScreen(pt) - paneInfo = self.PaneHitTest(panes, pt) - - if paneInfo.IsMaximized(): - return False, target - - if paneInfo.window is None: - return False, target - - # search the dock guides. - # reverse order to handle the center first. - for i in xrange(len(self._guides)-1, -1, -1): - guide = self._guides[i] - - # do hit testing on the guide - dir = guide.host.HitTest(screenPt.x, screenPt.y) - - if dir == -1: # point was outside of the dock guide - continue - - if dir == wx.ALL: # target is a single dock guide - return self.DoDropLayer(docks, target, guide.dock_direction) - - elif dir == wx.CENTER: - - if not target.IsNotebookDockable(): - continue - if not paneInfo.IsNotebookDockable() and not paneInfo.IsNotebookControl(): - continue - - if not paneInfo.HasNotebook(): - - # Add a new notebook pane with the original as a tab... - self.CreateNotebookBase(panes, paneInfo) - - # Add new item to notebook - target.NotebookPage(paneInfo.notebook_id) - - else: - - drop_pane = False - drop_row = False - - insert_dir = paneInfo.dock_direction - insert_layer = paneInfo.dock_layer - insert_row = paneInfo.dock_row - insert_pos = paneInfo.dock_pos - - if insert_dir == AUI_DOCK_CENTER: - - insert_layer = 0 - if dir == wx.LEFT: - insert_dir = AUI_DOCK_LEFT - elif dir == wx.UP: - insert_dir = AUI_DOCK_TOP - elif dir == wx.RIGHT: - insert_dir = AUI_DOCK_RIGHT - elif dir == wx.DOWN: - insert_dir = AUI_DOCK_BOTTOM - - if insert_dir == AUI_DOCK_LEFT: - - drop_pane = (dir == wx.UP or dir == wx.DOWN) - drop_row = (dir == wx.LEFT or dir == wx.RIGHT) - if dir == wx.RIGHT: - insert_row += 1 - elif dir == wx.DOWN: - insert_pos += 1 - - elif insert_dir == AUI_DOCK_RIGHT: - - drop_pane = (dir == wx.UP or dir == wx.DOWN) - drop_row = (dir == wx.LEFT or dir == wx.RIGHT) - if dir == wx.LEFT: - insert_row += 1 - elif dir == wx.DOWN: - insert_pos += 1 - - elif insert_dir == AUI_DOCK_TOP: - - drop_pane = (dir == wx.LEFT or dir == wx.RIGHT) - drop_row = (dir == wx.UP or dir == wx.DOWN) - if dir == wx.DOWN: - insert_row += 1 - elif dir == wx.RIGHT: - insert_pos += 1 - - elif insert_dir == AUI_DOCK_BOTTOM: - - drop_pane = (dir == wx.LEFT or dir == wx.RIGHT) - drop_row = (dir == wx.UP or dir == wx.DOWN) - if dir == wx.UP: - insert_row += 1 - elif dir == wx.RIGHT: - insert_pos += 1 - - if paneInfo.dock_direction == AUI_DOCK_CENTER: - insert_row = GetMaxRow(panes, insert_dir, insert_layer) + 1 - - if drop_pane: - return self.DoDropPane(panes, target, insert_dir, insert_layer, insert_row, insert_pos) - - if drop_row: - return self.DoDropRow(panes, target, insert_dir, insert_layer, insert_row) - - return True, target - - return False, target - - - def DoDropNonFloatingPane(self, docks, panes, target, pt): - """ - Handles the situation in which the dropped pane is not floating. - - :param `docks`: a list of L{AuiDockInfo} classes; - :param `panes`: a list of L{AuiPaneInfo} instances; - :param `target`: the target pane containing the toolbar; - :param `pt`: a mouse position to check for a drop operation. - """ - - screenPt = self._frame.ClientToScreen(pt) - clientSize = self._frame.GetClientSize() - frameRect = GetInternalFrameRect(self._frame, self._docks) - - drop = self.CopyTarget(target) - - # The result should always be shown - drop.Show() - - part = self.HitTest(pt.x, pt.y) - - if not part: - return False, target - - if part.type == AuiDockUIPart.typeDockSizer: - - if len(part.dock.panes) != 1: - return False, target - - part = self.GetPanePart(part.dock.panes[0].window) - if not part: - return False, target - - if not part.pane: - return False, target - - part = self.GetPanePart(part.pane.window) - if not part: - return False, target - - insert_dock_row = False - insert_row = part.pane.dock_row - insert_dir = part.pane.dock_direction - insert_layer = part.pane.dock_layer - - direction = part.pane.dock_direction - - if direction == AUI_DOCK_TOP: - if pt.y >= part.rect.y and pt.y < part.rect.y+auiInsertRowPixels: - insert_dock_row = True - - elif direction == AUI_DOCK_BOTTOM: - if pt.y > part.rect.y+part.rect.height-auiInsertRowPixels and \ - pt.y <= part.rect.y + part.rect.height: - insert_dock_row = True - - elif direction == AUI_DOCK_LEFT: - if pt.x >= part.rect.x and pt.x < part.rect.x+auiInsertRowPixels: - insert_dock_row = True - - elif direction == AUI_DOCK_RIGHT: - if pt.x > part.rect.x+part.rect.width-auiInsertRowPixels and \ - pt.x <= part.rect.x+part.rect.width: - insert_dock_row = True - - elif direction == AUI_DOCK_CENTER: - - # "new row pixels" will be set to the default, but - # must never exceed 20% of the window size - new_row_pixels_x = auiNewRowPixels - new_row_pixels_y = auiNewRowPixels - - if new_row_pixels_x > (part.rect.width*20)/100: - new_row_pixels_x = (part.rect.width*20)/100 - - if new_row_pixels_y > (part.rect.height*20)/100: - new_row_pixels_y = (part.rect.height*20)/100 - - # determine if the mouse pointer is in a location that - # will cause a new row to be inserted. The hot spot positions - # are along the borders of the center pane - - insert_layer = 0 - insert_dock_row = True - pr = part.rect - - if pt.x >= pr.x and pt.x < pr.x + new_row_pixels_x: - insert_dir = AUI_DOCK_LEFT - elif pt.y >= pr.y and pt.y < pr.y + new_row_pixels_y: - insert_dir = AUI_DOCK_TOP - elif pt.x >= pr.x + pr.width - new_row_pixels_x and pt.x < pr.x + pr.width: - insert_dir = AUI_DOCK_RIGHT - elif pt.y >= pr.y+ pr.height - new_row_pixels_y and pt.y < pr.y + pr.height: - insert_dir = AUI_DOCK_BOTTOM - else: - return False, target - - insert_row = GetMaxRow(panes, insert_dir, insert_layer) + 1 - - if insert_dock_row: - - panes = DoInsertDockRow(panes, insert_dir, insert_layer, insert_row) - drop.Dock().Direction(insert_dir).Layer(insert_layer). \ - Row(insert_row).Position(0) - - return self.ProcessDockResult(target, drop) - - # determine the mouse offset and the pane size, both in the - # direction of the dock itself, and perpendicular to the dock - - if part.orientation == wx.VERTICAL: - - offset = pt.y - part.rect.y - size = part.rect.GetHeight() - - else: - - offset = pt.x - part.rect.x - size = part.rect.GetWidth() - - drop_position = part.pane.dock_pos - - # if we are in the top/left part of the pane, - # insert the pane before the pane being hovered over - if offset <= size/2: - - drop_position = part.pane.dock_pos - panes = DoInsertPane(panes, - part.pane.dock_direction, - part.pane.dock_layer, - part.pane.dock_row, - part.pane.dock_pos) - - # if we are in the bottom/right part of the pane, - # insert the pane before the pane being hovered over - if offset > size/2: - - drop_position = part.pane.dock_pos+1 - panes = DoInsertPane(panes, - part.pane.dock_direction, - part.pane.dock_layer, - part.pane.dock_row, - part.pane.dock_pos+1) - - - drop.Dock(). \ - Direction(part.dock.dock_direction). \ - Layer(part.dock.dock_layer).Row(part.dock.dock_row). \ - Position(drop_position) - - return self.ProcessDockResult(target, drop) - - - def DoDropLayer(self, docks, target, dock_direction): - """ - Handles the situation in which `target` is a single dock guide. - - :param `docks`: a list of L{AuiDockInfo} classes; - :param `target`: the target pane; - :param `dock_direction`: the docking direction. - """ - - drop = self.CopyTarget(target) - - if dock_direction == AUI_DOCK_LEFT: - drop.Dock().Left() - drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_LEFT), - GetMaxLayer(docks, AUI_DOCK_BOTTOM)), - GetMaxLayer(docks, AUI_DOCK_TOP)) + 1 - - elif dock_direction == AUI_DOCK_TOP: - drop.Dock().Top() - drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_TOP), - GetMaxLayer(docks, AUI_DOCK_LEFT)), - GetMaxLayer(docks, AUI_DOCK_RIGHT)) + 1 - - elif dock_direction == AUI_DOCK_RIGHT: - drop.Dock().Right() - drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_RIGHT), - GetMaxLayer(docks, AUI_DOCK_TOP)), - GetMaxLayer(docks, AUI_DOCK_BOTTOM)) + 1 - - elif dock_direction == AUI_DOCK_BOTTOM: - drop.Dock().Bottom() - drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_BOTTOM), - GetMaxLayer(docks, AUI_DOCK_LEFT)), - GetMaxLayer(docks, AUI_DOCK_RIGHT)) + 1 - - else: - return False, target - - - drop.Dock().Layer(drop_new_layer) - return self.ProcessDockResult(target, drop) - - - def DoDropPane(self, panes, target, dock_direction, dock_layer, dock_row, dock_pos): - """ - Drop a pane in the interface. - - :param `panes`: a list of L{AuiPaneInfo} classes; - :param `target`: the target pane; - :param `dock_direction`: the docking direction; - :param `dock_layer`: the docking layer; - :param `dock_row`: the docking row; - :param `dock_pos`: the docking position. - """ - - drop = self.CopyTarget(target) - panes = DoInsertPane(panes, dock_direction, dock_layer, dock_row, dock_pos) - - drop.Dock().Direction(dock_direction).Layer(dock_layer).Row(dock_row).Position(dock_pos) - return self.ProcessDockResult(target, drop) - - - def DoDropRow(self, panes, target, dock_direction, dock_layer, dock_row): - """ - Insert a row in the interface before dropping. - - :param `panes`: a list of L{AuiPaneInfo} classes; - :param `target`: the target pane; - :param `dock_direction`: the docking direction; - :param `dock_layer`: the docking layer; - :param `dock_row`: the docking row. - """ - - drop = self.CopyTarget(target) - panes = DoInsertDockRow(panes, dock_direction, dock_layer, dock_row) - - drop.Dock().Direction(dock_direction).Layer(dock_layer).Row(dock_row).Position(0) - return self.ProcessDockResult(target, drop) - - - def ShowHint(self, rect): - """ - Shows the AUI hint window. - - :param `rect`: the hint rect calculated in advance. - """ - - if rect == self._last_hint: - return - - if self._agwFlags & AUI_MGR_RECTANGLE_HINT and wx.Platform != "__WXMAC__": - - if self._last_hint != rect: - # remove the last hint rectangle - self._last_hint = wx.Rect(*rect) - self._frame.Refresh() - self._frame.Update() - - screendc = wx.ScreenDC() - clip = wx.Region(1, 1, 10000, 10000) - - # clip all floating windows, so we don't draw over them - for pane in self._panes: - if pane.IsFloating() and pane.frame.IsShown(): - - rect2 = wx.Rect(*pane.frame.GetRect()) - if wx.Platform == "__WXGTK__": - # wxGTK returns the client size, not the whole frame size - rect2.width += 15 - rect2.height += 35 - rect2.Inflate(5, 5) - - clip.SubtractRect(rect2) - - # As we can only hide the hint by redrawing the managed window, we - # need to clip the region to the managed window too or we get - # nasty redrawn problems. - clip.IntersectRect(self._frame.GetRect()) - screendc.SetClippingRegionAsRegion(clip) - - stipple = PaneCreateStippleBitmap() - brush = wx.BrushFromBitmap(stipple) - screendc.SetBrush(brush) - screendc.SetPen(wx.TRANSPARENT_PEN) - screendc.DrawRectangle(rect.x, rect.y, 5, rect.height) - screendc.DrawRectangle(rect.x+5, rect.y, rect.width-10, 5) - screendc.DrawRectangle(rect.x+rect.width-5, rect.y, 5, rect.height) - screendc.DrawRectangle(rect.x+5, rect.y+rect.height-5, rect.width-10, 5) - RefreshDockingGuides(self._guides) - - return - - if not self._hint_window: - self.CreateHintWindow() - - if self._hint_window: - self._hint_window.SetRect(rect) - self._hint_window.Show() - - self._hint_fadeamt = self._hint_fademax - - if self._agwFlags & AUI_MGR_HINT_FADE: - self._hint_fadeamt = 0 - self._hint_window.SetTransparent(self._hint_fadeamt) - - if self._action == actionDragFloatingPane and self._action_window: - self._action_window.SetFocus() - - if self._hint_fadeamt != self._hint_fademax: # Only fade if we need to - # start fade in timer - self._hint_fadetimer.Start(5) - - self._last_hint = wx.Rect(*rect) - - - def HideHint(self): - """ Hides a transparent window hint if there is one. """ - - # hides a transparent window hint if there is one - if self._hint_window: - self._hint_window.Hide() - - self._hint_fadetimer.Stop() - self._last_hint = wx.Rect() - - - def IsPaneButtonVisible(self, part): - """ - Returns whether a pane button in the pane caption is visible. - - :param `part`: the UI part to analyze. - """ - - captionRect = wx.Rect() - - for temp_part in self._uiparts: - if temp_part.pane == part.pane and \ - temp_part.type == AuiDockUIPart.typeCaption: - captionRect = temp_part.rect - break - - return captionRect.ContainsRect(part.rect) - - - def DrawPaneButton(self, dc, part, pt): - """ - Draws a pane button in the caption (convenience function). - - :param `dc`: a `wx.DC` device context object; - :param `part`: the UI part to analyze; - :param `pt`: a `wx.Point` object, specifying the mouse location. - """ - - if not self.IsPaneButtonVisible(part): - return - - state = AUI_BUTTON_STATE_NORMAL - - if part.rect.Contains(pt): - - if _VERSION_STRING < "2.9": - leftDown = wx.GetMouseState().LeftDown() - else: - leftDown = wx.GetMouseState().LeftIsDown() - - if leftDown: - state = AUI_BUTTON_STATE_PRESSED - else: - state = AUI_BUTTON_STATE_HOVER - - self._art.DrawPaneButton(dc, self._frame, part.button.button_id, - state, part.rect, part.pane) - - - def RefreshButton(self, part): - """ - Refreshes a pane button in the caption. - - :param `part`: the UI part to analyze. - """ - - rect = wx.Rect(*part.rect) - rect.Inflate(2, 2) - self._frame.Refresh(True, rect) - self._frame.Update() - - - def RefreshCaptions(self): - """ Refreshes all pane captions. """ - - for part in self._uiparts: - if part.type == AuiDockUIPart.typeCaption: - self._frame.Refresh(True, part.rect) - self._frame.Update() - - - def CalculateHintRect(self, pane_window, pt, offset): - """ - Calculates the drop hint rectangle. - - The method first calls L{DoDrop} to determine the exact position the pane would - be at were if dropped. If the pane would indeed become docked at the - specified drop point, the the rectangle hint will be returned in - screen coordinates. Otherwise, an empty rectangle is returned. - - :param `pane_window`: it is the window pointer of the pane being dragged; - :param `pt`: is the mouse position, in client coordinates; - :param `offset`: describes the offset that the mouse is from the upper-left - corner of the item being dragged. - """ - - # we need to paint a hint rectangle to find out the exact hint rectangle, - # we will create a new temporary layout and then measure the resulting - # rectangle we will create a copy of the docking structures (self._docks) - # so that we don't modify the real thing on screen - - rect = wx.Rect() - pane = self.GetPane(pane_window) - - attrs = self.GetAttributes(pane) - hint = AuiPaneInfo() - hint = self.SetAttributes(hint, attrs) - - if hint.name != "__HINT__": - self._oldname = hint.name - - hint.name = "__HINT__" - hint.PaneBorder(True) - hint.Show() - - if not hint.IsOk(): - hint.name = self._oldname - return rect - - docks, panes = CopyDocksAndPanes2(self._docks, self._panes) - - # remove any pane already there which bears the same window - # this happens when you are moving a pane around in a dock - for ii in xrange(len(panes)): - if panes[ii].window == pane_window: - docks = RemovePaneFromDocks(docks, panes[ii]) - panes.pop(ii) - break - - # find out where the new pane would be - allow, hint = self.DoDrop(docks, panes, hint, pt, offset) - - if not allow: - return rect - - panes.append(hint) - - sizer, panes, docks, uiparts = self.LayoutAll(panes, docks, [], True, False) - - client_size = self._frame.GetClientSize() - sizer.SetDimension(0, 0, client_size.x, client_size.y) - sizer.Layout() - - sought = "__HINT__" - - # For a notebook page, actually look for the noteboot itself. - if hint.IsNotebookPage(): - id = hint.notebook_id - for pane in panes: - if pane.IsNotebookControl() and pane.notebook_id==id: - sought = pane.name - break - - for part in uiparts: - if part.pane and part.pane.name == sought: - rect.Union(wx.RectPS(part.sizer_item.GetPosition(), - part.sizer_item.GetSize())) - - sizer.Destroy() - - # check for floating frame ... - if rect.IsEmpty(): - for p in panes: - if p.name == sought and p.IsFloating(): - return wx.RectPS(p.floating_pos, p.floating_size) - - if rect.IsEmpty(): - return rect - - # actually show the hint rectangle on the screen - rect.x, rect.y = self._frame.ClientToScreen((rect.x, rect.y)) - if self._frame.GetLayoutDirection() == wx.Layout_RightToLeft: - # Mirror rectangle in RTL mode - rect.x -= rect.GetWidth() - - return rect - - - def DrawHintRect(self, pane_window, pt, offset): - """ - Calculates the hint rectangle by calling - L{CalculateHintRect}. If there is a rectangle, it shows it - by calling L{ShowHint}, otherwise it hides any hint - rectangle currently shown. - - :param `pane_window`: it is the window pointer of the pane being dragged; - :param `pt`: is the mouse position, in client coordinates; - :param `offset`: describes the offset that the mouse is from the upper-left - corner of the item being dragged. - """ - - rect = self.CalculateHintRect(pane_window, pt, offset) - - if rect.IsEmpty(): - self.HideHint() - self._hint_rect = wx.Rect() - else: - self.ShowHint(rect) - self._hint_rect = wx.Rect(*rect) - - - def GetPartSizerRect(self, uiparts): - """ - Returns the rectangle surrounding the specified UI parts. - - :param `uiparts`: UI parts. - """ - - rect = wx.Rect() - - for part in self._uiparts: - if part.pane and part.pane.name == "__HINT__": - rect.Union(wx.RectPS(part.sizer_item.GetPosition(), - part.sizer_item.GetSize())) - - return rect - - - def GetAttributes(self, pane): - """ - Returns all the attributes of a L{AuiPaneInfo}. - - :param `pane`: a L{AuiPaneInfo} instance. - """ - - attrs = [] - attrs.extend([pane.window, pane.frame, pane.state, pane.dock_direction, - pane.dock_layer, pane.dock_pos, pane.dock_row, pane.dock_proportion, - pane.floating_pos, pane.floating_size, pane.best_size, - pane.min_size, pane.max_size, pane.caption, pane.name, - pane.buttons, pane.rect, pane.icon, pane.notebook_id, - pane.transparent, pane.snapped, pane.minimize_mode]) - - return attrs - - - def SetAttributes(self, pane, attrs): - """ - Sets all the attributes contained in `attrs` to a L{AuiPaneInfo}. - - :param `pane`: a L{AuiPaneInfo} instance; - :param `attrs`: a list of attributes. - """ - - pane.window = attrs[0] - pane.frame = attrs[1] - pane.state = attrs[2] - pane.dock_direction = attrs[3] - pane.dock_layer = attrs[4] - pane.dock_pos = attrs[5] - pane.dock_row = attrs[6] - pane.dock_proportion = attrs[7] - pane.floating_pos = attrs[8] - pane.floating_size = attrs[9] - pane.best_size = attrs[10] - pane.min_size = attrs[11] - pane.max_size = attrs[12] - pane.caption = attrs[13] - pane.name = attrs[14] - pane.buttons = attrs[15] - pane.rect = attrs[16] - pane.icon = attrs[17] - pane.notebook_id = attrs[18] - pane.transparent = attrs[19] - pane.snapped = attrs[20] - pane.minimize_mode = attrs[21] - - return pane - - - def OnFloatingPaneResized(self, wnd, size): - """ - Handles the resizing of a floating pane. - - :param `wnd`: a `wx.Window` derived window, managed by the pane; - :param `size`: a `wx.Size` object, specifying the new pane floating size. - """ - - # try to find the pane - pane = self.GetPane(wnd) - if not pane.IsOk(): - raise Exception("Pane window not found") - - if pane.frame: - indx = self._panes.index(pane) - pane.floating_pos = pane.frame.GetPosition() - pane.floating_size = size - self._panes[indx] = pane - if pane.IsSnappable(): - self.SnapPane(pane, pane.floating_pos, pane.floating_size, True) - - - def OnFloatingPaneClosed(self, wnd, event): - """ - Handles the close event of a floating pane. - - :param `wnd`: a `wx.Window` derived window, managed by the pane; - :param `event`: a `wx.CloseEvent` to be processed. - """ - - # try to find the pane - pane = self.GetPane(wnd) - if not pane.IsOk(): - raise Exception("Pane window not found") - - # fire pane close event - e = AuiManagerEvent(wxEVT_AUI_PANE_CLOSE) - e.SetPane(pane) - e.SetCanVeto(event.CanVeto()) - self.ProcessMgrEvent(e) - - if e.GetVeto(): - event.Veto() - return - else: - # close the pane, but check that it - # still exists in our pane array first - # (the event handler above might have removed it) - - check = self.GetPane(wnd) - if check.IsOk(): - self.ClosePane(pane) - - - def OnFloatingPaneActivated(self, wnd): - """ - Handles the activation event of a floating pane. - - :param `wnd`: a `wx.Window` derived window, managed by the pane. - """ - - pane = self.GetPane(wnd) - if not pane.IsOk(): - raise Exception("Pane window not found") - - if self.GetAGWFlags() & AUI_MGR_ALLOW_ACTIVE_PANE: - ret, self._panes = SetActivePane(self._panes, wnd) - self.RefreshCaptions() - self.FireEvent(wxEVT_AUI_PANE_ACTIVATED, wnd, canVeto=False) - - - def OnFloatingPaneMoved(self, wnd, eventOrPt): - """ - Handles the move event of a floating pane. - - :param `wnd`: a `wx.Window` derived window, managed by the pane; - :param `eventOrPt`: a `wx.MoveEvent` to be processed or an instance of `wx.Point`. - """ - - pane = self.GetPane(wnd) - if not pane.IsOk(): - raise Exception("Pane window not found") - - if not pane.IsSnappable(): - return - - if isinstance(eventOrPt, wx.Point): - pane_pos = wx.Point(*eventOrPt) - else: - pane_pos = eventOrPt.GetPosition() - - pane_size = pane.floating_size - - self.SnapPane(pane, pane_pos, pane_size, False) - - - def SnapPane(self, pane, pane_pos, pane_size, toSnap=False): - """ - Snaps a floating pane to one of the main frame sides. - - :param `pane`: a L{AuiPaneInfo} instance; - :param `pane_pos`: the new pane floating position; - :param `pane_size`: the new pane floating size; - :param `toSnap`: a bool variable to check if L{SnapPane} was called from - a move event. - """ - - if self._from_move: - return - - managed_window = self.GetManagedWindow() - wnd_pos = managed_window.GetPosition() - wnd_size = managed_window.GetSize() - snapX, snapY = self._snap_limits - - if not toSnap: - pane.snapped = 0 - if pane.IsLeftSnappable(): - # Check if we can snap to the left - diff = wnd_pos.x - (pane_pos.x + pane_size.x) - if -snapX <= diff <= snapX: - pane.snapped = wx.LEFT - pane.floating_pos = wx.Point(wnd_pos.x-pane_size.x, pane_pos.y) - elif pane.IsTopSnappable(): - # Check if we can snap to the top - diff = wnd_pos.y - (pane_pos.y + pane_size.y) - if -snapY <= diff <= snapY: - pane.snapped = wx.TOP - pane.floating_pos = wx.Point(pane_pos.x, wnd_pos.y-pane_size.y) - elif pane.IsRightSnappable(): - # Check if we can snap to the right - diff = pane_pos.x - (wnd_pos.x + wnd_size.x) - if -snapX <= diff <= snapX: - pane.snapped = wx.RIGHT - pane.floating_pos = wx.Point(wnd_pos.x + wnd_size.x, pane_pos.y) - elif pane.IsBottomSnappable(): - # Check if we can snap to the bottom - diff = pane_pos.y - (wnd_pos.y + wnd_size.y) - if -snapY <= diff <= snapY: - pane.snapped = wx.BOTTOM - pane.floating_pos = wx.Point(pane_pos.x, wnd_pos.y + wnd_size.y) - - self.RepositionPane(pane, wnd_pos, wnd_size) - - - def RepositionPane(self, pane, wnd_pos, wnd_size): - """ - Repositions a pane after the main frame has been moved/resized. - - :param `pane`: a L{AuiPaneInfo} instance; - :param `wnd_pos`: the main frame position; - :param `wnd_size`: the main frame size. - """ - - pane_pos = pane.floating_pos - pane_size = pane.floating_size - - snap = pane.snapped - if snap == wx.LEFT: - floating_pos = wx.Point(wnd_pos.x - pane_size.x, pane_pos.y) - elif snap == wx.TOP: - floating_pos = wx.Point(pane_pos.x, wnd_pos.y - pane_size.y) - elif snap == wx.RIGHT: - floating_pos = wx.Point(wnd_pos.x + wnd_size.x, pane_pos.y) - elif snap == wx.BOTTOM: - floating_pos = wx.Point(pane_pos.x, wnd_pos.y + wnd_size.y) - - if snap: - if pane_pos != floating_pos: - pane.floating_pos = floating_pos - self._from_move = True - pane.frame.SetPosition(pane.floating_pos) - self._from_move = False - - - def OnGripperClicked(self, pane_window, start, offset): - """ - Handles the mouse click on the pane gripper. - - :param `pane_window`: a `wx.Window` derived window, managed by the pane; - :param `start`: a `wx.Point` object, specifying the clicking position; - :param `offset`: an offset point from the `start` position. - """ - - # try to find the pane - paneInfo = self.GetPane(pane_window) - - if not paneInfo.IsOk(): - raise Exception("Pane window not found") - - if self.GetAGWFlags() & AUI_MGR_ALLOW_ACTIVE_PANE: - # set the caption as active - ret, self._panes = SetActivePane(self._panes, pane_window) - self.RefreshCaptions() - self.FireEvent(wxEVT_AUI_PANE_ACTIVATED, pane_window, canVeto=False) - - self._action_part = None - self._action_pane = paneInfo - self._action_window = pane_window - self._action_start = start - self._action_offset = offset - self._toolbar_action_offset = wx.Point(*self._action_offset) - - self._frame.CaptureMouse() - - if paneInfo.IsDocked(): - self._action = actionClickCaption - else: - if paneInfo.IsToolbar(): - self._action = actionDragToolbarPane - else: - self._action = actionDragFloatingPane - - if paneInfo.frame: - - windowPt = paneInfo.frame.GetRect().GetTopLeft() - originPt = paneInfo.frame.ClientToScreen(wx.Point()) - self._action_offset += originPt - windowPt - self._toolbar_action_offset = wx.Point(*self._action_offset) - - if self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: - paneInfo.frame.SetTransparent(150) - - if paneInfo.IsToolbar(): - self._frame.SetCursor(wx.StockCursor(wx.CURSOR_SIZING)) - - - def OnRender(self, event): - """ - Draws all of the pane captions, sashes, - backgrounds, captions, grippers, pane borders and buttons. - It renders the entire user interface. It binds the ``EVT_AUI_RENDER`` event. - - :param `event`: an instance of L{AuiManagerEvent}. - """ - - # if the frame is about to be deleted, don't bother - if not self._frame or self._frame.IsBeingDeleted(): - return - - if not self._frame.GetSizer(): - return - - mouse = wx.GetMouseState() - mousePos = wx.Point(mouse.GetX(), mouse.GetY()) - point = self._frame.ScreenToClient(mousePos) - art = self._art - - dc = event.GetDC() - - for part in self._uiparts: - - # don't draw hidden pane items or items that aren't windows - if part.sizer_item and ((not part.sizer_item.IsWindow() and \ - not part.sizer_item.IsSpacer() and \ - not part.sizer_item.IsSizer()) or \ - not part.sizer_item.IsShown()): - - continue - - ptype = part.type - - if ptype in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: - art.DrawSash(dc, self._frame, part.orientation, part.rect) - - elif ptype == AuiDockUIPart.typeBackground: - art.DrawBackground(dc, self._frame, part.orientation, part.rect) - - elif ptype == AuiDockUIPart.typeCaption: - art.DrawCaption(dc, self._frame, part.pane.caption, part.rect, part.pane) - - elif ptype == AuiDockUIPart.typeGripper: - art.DrawGripper(dc, self._frame, part.rect, part.pane) - - elif ptype == AuiDockUIPart.typePaneBorder: - art.DrawBorder(dc, self._frame, part.rect, part.pane) - - elif ptype == AuiDockUIPart.typePaneButton: - self.DrawPaneButton(dc, part, point) - - - def Repaint(self, dc=None): - """ - Repaints the entire frame decorations (sashes, borders, buttons and so on). - It renders the entire user interface. - - :param `dc`: if not ``None``, an instance of `wx.PaintDC`. - """ - - w, h = self._frame.GetClientSize() - - # Figure out which dc to use; if one - # has been specified, use it, otherwise - # make a client dc - if dc is None: - client_dc = wx.ClientDC(self._frame) - dc = client_dc - - # If the frame has a toolbar, the client area - # origin will not be (0, 0). - pt = self._frame.GetClientAreaOrigin() - if pt.x != 0 or pt.y != 0: - dc.SetDeviceOrigin(pt.x, pt.y) - - # Render all the items - self.Render(dc) - - - def Render(self, dc): - """ - Fires a render event, which is normally handled by - L{OnRender}. This allows the render function to - be overridden via the render event. - - This can be useful for painting custom graphics in the main window. - Default behavior can be invoked in the overridden function by calling - L{OnRender}. - - :param `dc`: a `wx.DC` device context object. - """ - - e = AuiManagerEvent(wxEVT_AUI_RENDER) - e.SetManager(self) - e.SetDC(dc) - self.ProcessMgrEvent(e) - - - def OnCaptionDoubleClicked(self, pane_window): - """ - Handles the mouse double click on the pane caption. - - :param `pane_window`: a `wx.Window` derived window, managed by the pane. - """ - - # try to find the pane - paneInfo = self.GetPane(pane_window) - if not paneInfo.IsOk(): - raise Exception("Pane window not found") - - if not paneInfo.IsFloatable() or not paneInfo.IsDockable() or \ - self._agwFlags & AUI_MGR_ALLOW_FLOATING == 0: - return - - indx = self._panes.index(paneInfo) - win_rect = None - - if paneInfo.IsFloating(): - if paneInfo.name.startswith("__floating__"): - # It's a floating tab from a AuiNotebook - notebook = paneInfo.window.__aui_notebook__ - notebook.ReDockPage(paneInfo) - self.Update() - return - else: - - e = self.FireEvent(wxEVT_AUI_PANE_DOCKING, paneInfo, canVeto=True) - if e.GetVeto(): - self.HideHint() - ShowDockingGuides(self._guides, False) - return - - win_rect = paneInfo.frame.GetRect() - paneInfo.Dock() - if paneInfo.IsToolbar(): - paneInfo = self.SwitchToolBarOrientation(paneInfo) - - e = self.FireEvent(wxEVT_AUI_PANE_DOCKED, paneInfo, canVeto=False) - - else: - - e = self.FireEvent(wxEVT_AUI_PANE_FLOATING, paneInfo, canVeto=True) - if e.GetVeto(): - return - - # float the window - if paneInfo.IsMaximized(): - self.RestorePane(paneInfo) - - if paneInfo.floating_pos == wx.Point(-1, -1): - captionSize = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) - paneInfo.floating_pos = pane_window.GetScreenPosition() - paneInfo.floating_pos.y -= captionSize - - paneInfo.Float() - e = self.FireEvent(wxEVT_AUI_PANE_FLOATED, paneInfo, canVeto=False) - - self._panes[indx] = paneInfo - self.Update() - - if win_rect and self._agwFlags & AUI_MGR_ANIMATE_FRAMES: - paneInfo = self.GetPane(pane_window) - pane_rect = paneInfo.window.GetScreenRect() - self.AnimateDocking(win_rect, pane_rect) - - - def OnPaint(self, event): - """ - Handles the ``wx.EVT_PAINT`` event for L{AuiManager}. - - :param `event`: an instance of `wx.PaintEvent` to be processed. - """ - - dc = wx.PaintDC(self._frame) - self.Repaint(dc) - - - def OnEraseBackground(self, event): - """ - Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiManager}. - - :param `event`: `wx.EraseEvent` to be processed. - - :note: This is intentionally empty (excluding wxMAC) to reduce - flickering while drawing. - """ - - if wx.Platform == "__WXMAC__": - event.Skip() - - - def OnSize(self, event): - """ - Handles the ``wx.EVT_SIZE`` event for L{AuiManager}. - - :param `event`: a `wx.SizeEvent` to be processed. - """ - - skipped = False - if isinstance(self._frame, AuiFloatingFrame) and self._frame.IsShownOnScreen(): - skipped = True - event.Skip() - - if self._frame: - - self.DoFrameLayout() - if wx.Platform == "__WXMAC__": - self._frame.Refresh() - else: - self.Repaint() - - if isinstance(self._frame, wx.MDIParentFrame) or isinstance(self._frame, tabmdi.AuiMDIClientWindow) \ - or isinstance(self._frame, tabmdi.AuiMDIParentFrame): - # for MDI parent frames, this event must not - # be "skipped". In other words, the parent frame - # must not be allowed to resize the client window - # after we are finished processing sizing changes - return - - if not skipped: - event.Skip() - - # For the snap to screen... - self.OnMove(None) - - - def OnFindManager(self, event): - """ - Handles the ``EVT_AUI_FIND_MANAGER`` event for L{AuiManager}. - - :param `event`: a L{AuiManagerEvent} event to be processed. - """ - - # Initialize to None - event.SetManager(None) - - if not self._frame: - return - - # See it this window wants to overwrite - self._frame.ProcessEvent(event) - - # if no, it must be us - if not event.GetManager(): - event.SetManager(self) - - - def OnSetCursor(self, event): - """ - Handles the ``wx.EVT_SET_CURSOR`` event for L{AuiManager}. - - :param `event`: a `wx.SetCursorEvent` to be processed. - """ - - # determine cursor - part = self.HitTest(event.GetX(), event.GetY()) - cursor = wx.NullCursor - - if part: - if part.type in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: - - if not self.CheckMovableSizer(part): - return - - if part.orientation == wx.VERTICAL: - cursor = wx.StockCursor(wx.CURSOR_SIZEWE) - else: - cursor = wx.StockCursor(wx.CURSOR_SIZENS) - - elif part.type == AuiDockUIPart.typeGripper: - cursor = wx.StockCursor(wx.CURSOR_SIZING) - - event.SetCursor(cursor) - - - def UpdateButtonOnScreen(self, button_ui_part, event): - """ - Updates/redraws the UI part containing a pane button. - - :param `button_ui_part`: the UI part the button belongs to; - :param `event`: a `wx.MouseEvent` to be processed. - """ - - hit_test = self.HitTest(*event.GetPosition()) - - if not hit_test or not button_ui_part: - return - - state = AUI_BUTTON_STATE_NORMAL - - if hit_test == button_ui_part: - if event.LeftDown(): - state = AUI_BUTTON_STATE_PRESSED - else: - state = AUI_BUTTON_STATE_HOVER - else: - if event.LeftDown(): - state = AUI_BUTTON_STATE_HOVER - - # now repaint the button with hover state - cdc = wx.ClientDC(self._frame) - - # if the frame has a toolbar, the client area - # origin will not be (0,0). - pt = self._frame.GetClientAreaOrigin() - if pt.x != 0 or pt.y != 0: - cdc.SetDeviceOrigin(pt.x, pt.y) - - if hit_test.pane: - self._art.DrawPaneButton(cdc, self._frame, - button_ui_part.button.button_id, - state, - button_ui_part.rect, hit_test.pane) - - - def OnLeftDown(self, event): - """ - Handles the ``wx.EVT_LEFT_DOWN`` event for L{AuiManager}. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - part = self.HitTest(*event.GetPosition()) - - if not part: - event.Skip() - return - - self._currentDragItem = -1 - - if part.type in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: - - if not self.CheckMovableSizer(part): - return - - self._action = actionResize - self._action_part = part - self._action_pane = None - self._action_rect = wx.Rect() - self._action_start = wx.Point(event.GetX(), event.GetY()) - self._action_offset = wx.Point(event.GetX() - part.rect.x, - event.GetY() - part.rect.y) - - # draw the resize hint - rect = wx.RectPS(self._frame.ClientToScreen(part.rect.GetPosition()), - part.rect.GetSize()) - - self._action_rect = wx.Rect(*rect) - - if not AuiManager_HasLiveResize(self): - if wx.Platform == "__WXMAC__": - dc = wx.ClientDC(self._frame) - else: - dc = wx.ScreenDC() - - DrawResizeHint(dc, rect) - - self._frame.CaptureMouse() - - elif part.type == AuiDockUIPart.typePaneButton: - if self.IsPaneButtonVisible(part): - self._action = actionClickButton - self._action_part = part - self._action_pane = None - self._action_start = wx.Point(*event.GetPosition()) - self._frame.CaptureMouse() - - self.RefreshButton(part) - - elif part.type in [AuiDockUIPart.typeCaption, AuiDockUIPart.typeGripper]: - - # if we are managing a AuiFloatingFrame window, then - # we are an embedded AuiManager inside the AuiFloatingFrame. - # We want to initiate a toolbar drag in our owner manager - if isinstance(part.pane.window.GetParent(), AuiFloatingFrame): - rootManager = GetManager(part.pane.window) - else: - rootManager = self - - offset = wx.Point(event.GetX() - part.rect.x, event.GetY() - part.rect.y) - rootManager.OnGripperClicked(part.pane.window, event.GetPosition(), offset) - - if wx.Platform != "__WXMAC__": - event.Skip() - - - def OnLeftDClick(self, event): - """ - Handles the ``wx.EVT_LEFT_DCLICK`` event for L{AuiManager}. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - part = self.HitTest(event.GetX(), event.GetY()) - - if part and part.type == AuiDockUIPart.typeCaption: - if isinstance(part.pane.window.GetParent(), AuiFloatingFrame): - rootManager = GetManager(part.pane.window) - else: - rootManager = self - - rootManager.OnCaptionDoubleClicked(part.pane.window) - - elif part and part.type in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: - # Handles double click on AuiNotebook sashes to unsplit - sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) - for child in part.cont_sizer.GetChildren(): - if child.IsSizer(): - win = child.GetSizer().GetContainingWindow() - if isinstance(win, auibook.AuiNotebook): - win.UnsplitDClick(part, sash_size, event.GetPosition()) - break - - event.Skip() - - - def DoEndResizeAction(self, event): - """ - Ends a resize action, or for live update, resizes the sash. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - clientPt = event.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - return self.RestrictResize(clientPt, screenPt, createDC=False) - - - def RestrictResize(self, clientPt, screenPt, createDC): - """ Common method between L{DoEndResizeAction} and L{OnLeftUp_Resize}. """ - - dock = self._action_part.dock - pane = self._action_part.pane - - if createDC: - if wx.Platform == "__WXMAC__": - dc = wx.ClientDC(self._frame) - else: - dc = wx.ScreenDC() - - DrawResizeHint(dc, self._action_rect) - self._action_rect = wx.Rect() - - newPos = clientPt - self._action_offset - - if self._action_part.type == AuiDockUIPart.typeDockSizer: - minPix, maxPix = self.CalculateDockSizerLimits(dock) - else: - if not self._action_part.pane: - return - minPix, maxPix = self.CalculatePaneSizerLimits(dock, pane) - - if self._action_part.orientation == wx.HORIZONTAL: - newPos.y = Clip(newPos.y, minPix, maxPix) - else: - newPos.x = Clip(newPos.x, minPix, maxPix) - - if self._action_part.type == AuiDockUIPart.typeDockSizer: - - partnerDock = self.GetPartnerDock(dock) - sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) - new_dock_size = 0 - direction = dock.dock_direction - - if direction == AUI_DOCK_LEFT: - new_dock_size = newPos.x - dock.rect.x - - elif direction == AUI_DOCK_TOP: - new_dock_size = newPos.y - dock.rect.y - - elif direction == AUI_DOCK_RIGHT: - new_dock_size = dock.rect.x + dock.rect.width - newPos.x - sash_size - - elif direction == AUI_DOCK_BOTTOM: - new_dock_size = dock.rect.y + dock.rect.height - newPos.y - sash_size - - deltaDockSize = new_dock_size - dock.size - - if partnerDock: - if deltaDockSize > partnerDock.size - sash_size: - deltaDockSize = partnerDock.size - sash_size - - partnerDock.size -= deltaDockSize - - dock.size += deltaDockSize - self.Update() - - else: - - # determine the new pixel size that the user wants - # this will help us recalculate the pane's proportion - if dock.IsHorizontal(): - oldPixsize = pane.rect.width - newPixsize = oldPixsize + newPos.x - self._action_part.rect.x - - else: - oldPixsize = pane.rect.height - newPixsize = oldPixsize + newPos.y - self._action_part.rect.y - - totalPixsize, totalProportion = self.GetTotalPixSizeAndProportion(dock) - partnerPane = self.GetPartnerPane(dock, pane) - - # prevent division by zero - if totalPixsize <= 0 or totalProportion <= 0 or not partnerPane: - return - - # adjust for the surplus - while (oldPixsize > 0 and totalPixsize > 10 and \ - oldPixsize*totalProportion/totalPixsize < pane.dock_proportion): - - totalPixsize -= 1 - - # calculate the new proportion of the pane - - newProportion = newPixsize*totalProportion/totalPixsize - newProportion = Clip(newProportion, 1, totalProportion) - deltaProp = newProportion - pane.dock_proportion - - if partnerPane.dock_proportion - deltaProp < 1: - deltaProp = partnerPane.dock_proportion - 1 - newProportion = pane.dock_proportion + deltaProp - - # borrow the space from our neighbor pane to the - # right or bottom (depending on orientation) - partnerPane.dock_proportion -= deltaProp - pane.dock_proportion = newProportion - - self.Update() - - return True - - - def OnLeftUp(self, event): - """ - Handles the ``wx.EVT_LEFT_UP`` event for L{AuiManager}. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - if self._action == actionResize: -## self._frame.Freeze() - self.OnLeftUp_Resize(event) -## self._frame.Thaw() - - elif self._action == actionClickButton: - self.OnLeftUp_ClickButton(event) - - elif self._action == actionDragFloatingPane: - self.OnLeftUp_DragFloatingPane(event) - - elif self._action == actionDragToolbarPane: - self.OnLeftUp_DragToolbarPane(event) - - else: - event.Skip() - - if self._frame.HasCapture(): - self._frame.ReleaseMouse() - - self._action = actionNone - - - def OnMotion(self, event): - """ - Handles the ``wx.EVT_MOTION`` event for L{AuiManager}. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - if self._action == actionResize: - self.OnMotion_Resize(event) - - elif self._action == actionClickCaption: - self.OnMotion_ClickCaption(event) - - elif self._action == actionDragFloatingPane: - self.OnMotion_DragFloatingPane(event) - - elif self._action == actionDragToolbarPane: - self.OnMotion_DragToolbarPane(event) - - else: - self.OnMotion_Other(event) - - - def OnLeaveWindow(self, event): - """ - Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{AuiManager}. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - if self._hover_button: - self.RefreshButton(self._hover_button) - self._hover_button = None - - - def OnCaptureLost(self, event): - """ - Handles the ``wx.EVT_MOUSE_CAPTURE_LOST`` event for L{AuiManager}. - - :param `event`: a `wx.MouseCaptureLostEvent` to be processed. - """ - - # cancel the operation in progress, if any - if self._action != actionNone: - self._action = actionNone - self.HideHint() - - - def OnHintFadeTimer(self, event): - """ - Handles the ``wx.EVT_TIMER`` event for L{AuiManager}. - - :param `event`: a `wx.TimerEvent` to be processed. - """ - - if not self._hint_window or self._hint_fadeamt >= self._hint_fademax: - self._hint_fadetimer.Stop() - return - - self._hint_fadeamt += 4 - self._hint_window.SetTransparent(self._hint_fadeamt) - - - def OnMove(self, event): - """ - Handles the ``wx.EVT_MOVE`` event for L{AuiManager}. - - :param `event`: a `wx.MoveEvent` to be processed. - """ - - if event is not None: - event.Skip() - - if isinstance(self._frame, AuiFloatingFrame) and self._frame.IsShownOnScreen(): - return - - docked, hAlign, vAlign, monitor = self._is_docked - if docked: - self.Snap() - - for pane in self._panes: - if pane.IsSnappable(): - if pane.IsFloating() and pane.IsShown(): - self.SnapPane(pane, pane.floating_pos, pane.floating_size, True) - - - def OnSysColourChanged(self, event): - """ - Handles the ``wx.EVT_SYS_COLOUR_CHANGED`` event for L{AuiManager}. - - :param `event`: a `wx.SysColourChangedEvent` to be processed. - """ - - # This event is probably triggered by a theme change - # so we have to re-init the art provider. - if self._art: - self._art.Init() - - if self._frame: - self.Update() - self._frame.Refresh() - - - def OnChildFocus(self, event): - """ - Handles the ``wx.EVT_CHILD_FOCUS`` event for L{AuiManager}. - - :param `event`: a `wx.ChildFocusEvent` to be processed. - """ - - # when a child pane has it's focus set, we should change the - # pane's active state to reflect this. (this is only true if - # active panes are allowed by the owner) - - window = event.GetWindow() - if isinstance(window, wx.Dialog): - # Ignore EVT_CHILD_FOCUS events originating from dialogs not - # managed by AUI - rootManager = None - elif isinstance(window.GetParent(), AuiFloatingFrame): - rootManager = GetManager(window) - else: - rootManager = self - - if rootManager: - rootManager.ActivatePane(window) - - event.Skip() - - - def OnMotion_ClickCaption(self, event): - """ - Sub-handler for the L{OnMotion} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - clientPt = event.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - drag_x_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_X) - drag_y_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_Y) - - if not self._action_pane: - return - - # we need to check if the mouse is now being dragged - if not (abs(clientPt.x - self._action_start.x) > drag_x_threshold or \ - abs(clientPt.y - self._action_start.y) > drag_y_threshold): - - return - - # dragged -- we need to change the mouse action to 'drag' - if self._action_pane.IsToolbar(): - self._action = actionDragToolbarPane - self._action_window = self._action_pane.window - - elif self._action_pane.IsFloatable() and self._agwFlags & AUI_MGR_ALLOW_FLOATING: - - e = self.FireEvent(wxEVT_AUI_PANE_FLOATING, self._action_pane, canVeto=True) - if e.GetVeto(): - return - - self._action = actionDragFloatingPane - - # set initial float position - self._action_pane.floating_pos = screenPt - self._action_offset - - # float the window - if self._action_pane.IsMaximized(): - self.RestorePane(self._action_pane) - - self._action_pane.Hide() - self._action_pane.Float() - if wx.Platform == "__WXGTK__": - self._action_pane.Show() - - e = self.FireEvent(wxEVT_AUI_PANE_FLOATED, self._action_pane, canVeto=False) - - if not self._action_pane.frame: - self.Update() - - self._action_window = self._action_pane.window - - # adjust action offset for window frame - windowPt = self._action_pane.frame.GetRect().GetTopLeft() - originPt = self._action_pane.frame.ClientToScreen(wx.Point()) - self._toolbar_action_offset = originPt - windowPt - - if self._agwFlags & AUI_MGR_USE_NATIVE_MINIFRAMES: - originPt = windowPt + wx.Point(3, 3) - - self._action_offset += originPt - windowPt - - # action offset is used here to make it feel "natural" to the user - # to drag a docked pane and suddenly have it become a floating frame. - # Sometimes, however, the offset where the user clicked on the docked - # caption is bigger than the width of the floating frame itself, so - # in that case we need to set the action offset to a sensible value - frame_size = self._action_pane.frame.GetSize() - if self._action_offset.x > frame_size.x * 2 / 3: - self._action_offset.x = frame_size.x / 2 - if self._action_offset.y > frame_size.y * 2 / 3: - self._action_offset.y = frame_size.y / 2 - - self.OnMotion_DragFloatingPane(event) - if wx.Platform != "__WXGTK__": - self._action_pane.Show() - - self.Update() - - - def OnMotion_Resize(self, event): - """ - Sub-handler for the L{OnMotion} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - if AuiManager_HasLiveResize(self): - if self._currentDragItem != -1: - self._action_part = self._uiparts[self._currentDragItem] - else: - self._currentDragItem = self._uiparts.index(self._action_part) - - if self._frame.HasCapture(): - self._frame.ReleaseMouse() - - self.DoEndResizeAction(event) - self._frame.CaptureMouse() - return - - if not self._action_part or not self._action_part.dock or not self._action_part.orientation: - return - - clientPt = event.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - dock = self._action_part.dock - pos = self._action_part.rect.GetPosition() - - if self._action_part.type == AuiDockUIPart.typeDockSizer: - minPix, maxPix = self.CalculateDockSizerLimits(dock) - else: - if not self._action_part.pane: - return - - pane = self._action_part.pane - minPix, maxPix = self.CalculatePaneSizerLimits(dock, pane) - - if self._action_part.orientation == wx.HORIZONTAL: - pos.y = Clip(clientPt.y - self._action_offset.y, minPix, maxPix) - else: - pos.x = Clip(clientPt.x - self._action_offset.x, minPix, maxPix) - - hintrect = wx.RectPS(self._frame.ClientToScreen(pos), self._action_part.rect.GetSize()) - - if hintrect != self._action_rect: - - if wx.Platform == "__WXMAC__": - dc = wx.ClientDC(self._frame) - else: - dc = wx.ScreenDC() - - DrawResizeHint(dc, self._action_rect) - DrawResizeHint(dc, hintrect) - self._action_rect = wx.Rect(*hintrect) - - - def OnLeftUp_Resize(self, event): - """ - Sub-handler for the L{OnLeftUp} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - if self._currentDragItem != -1 and AuiManager_HasLiveResize(self): - self._action_part = self._uiparts[self._currentDragItem] - - if self._frame.HasCapture(): - self._frame.ReleaseMouse() - - self.DoEndResizeAction(event) - self._currentDragItem = -1 - return - - if not self._action_part or not self._action_part.dock: - return - - clientPt = event.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - return self.RestrictResize(clientPt, screenPt, createDC=True) - - - def OnLeftUp_ClickButton(self, event): - """ - Sub-handler for the L{OnLeftUp} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - self._hover_button = None - - if self._action_part: - self.RefreshButton(self._action_part) - - # make sure we're still over the item that was originally clicked - if self._action_part == self.HitTest(*event.GetPosition()): - - # fire button-click event - e = AuiManagerEvent(wxEVT_AUI_PANE_BUTTON) - e.SetManager(self) - e.SetPane(self._action_part.pane) - e.SetButton(self._action_part.button.button_id) - self.ProcessMgrEvent(e) - - - def CheckPaneMove(self, pane): - """ - Checks if a pane has moved by a visible amount. - - :param `pane`: an instance of L{AuiPaneInfo}. - """ - - win_rect = pane.frame.GetRect() - win_rect.x, win_rect.y = pane.floating_pos - - if win_rect == self._last_rect: - return False - - # skip the first move event - if self._last_rect.IsEmpty(): - self._last_rect = wx.Rect(*win_rect) - return False - - # skip if moving too fast to avoid massive redraws and - # jumping hint windows - if abs(win_rect.x - self._last_rect.x) > 10 or \ - abs(win_rect.y - self._last_rect.y) > 10: - self._last_rect = wx.Rect(*win_rect) - return False - - return True - - - def OnMotion_DragFloatingPane(self, eventOrPt): - """ - Sub-handler for the L{OnMotion} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - isPoint = False - if isinstance(eventOrPt, wx.Point): - clientPt = self._frame.ScreenToClient(eventOrPt) - screenPt = wx.Point(*eventOrPt) - isPoint = True - else: - clientPt = eventOrPt.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - framePos = wx.Point() - - # try to find the pane - pane = self.GetPane(self._action_window) - if not pane.IsOk(): - raise Exception("Pane window not found") - - # update floating position - if pane.IsFloating(): - diff = pane.floating_pos - (screenPt - self._action_offset) - pane.floating_pos = screenPt - self._action_offset - - framePos = pane.floating_pos - - # Move the pane window - if pane.frame: - - if diff.x != 0 or diff.y != 0: - if wx.Platform == "__WXMSW__" and (self._agwFlags & AUI_MGR_TRANSPARENT_DRAG) == 0: # and not self.CheckPaneMove(pane): - # return - # HACK: Terrible hack on wxMSW (!) - pane.frame.SetTransparent(254) - - self._from_move = True - pane.frame.Move(pane.floating_pos) - self._from_move = False - - if self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: - pane.frame.SetTransparent(150) - - # calculate the offset from the upper left-hand corner - # of the frame to the mouse pointer - action_offset = screenPt - framePos - - # is the pane dockable? - if not self.CanDockPanel(pane): - self.HideHint() - ShowDockingGuides(self._guides, False) - return - - for paneInfo in self._panes: - - if not paneInfo.IsDocked() or not paneInfo.IsShown(): - continue - if paneInfo.IsToolbar() or paneInfo.IsNotebookControl(): - continue - if paneInfo.IsMaximized(): - continue - - if paneInfo.IsNotebookPage(): - - notebookRoot = GetNotebookRoot(self._panes, paneInfo.notebook_id) - - if not notebookRoot or not notebookRoot.IsDocked(): - continue - - rc = paneInfo.window.GetScreenRect() - if rc.Contains(screenPt): - if rc.height < 20 or rc.width < 20: - return - - self.UpdateDockingGuides(paneInfo) - ShowDockingGuides(self._guides, True) - break - - self.DrawHintRect(pane.window, clientPt, action_offset) - - - def OnLeftUp_DragFloatingPane(self, eventOrPt): - """ - Sub-handler for the L{OnLeftUp} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - if isinstance(eventOrPt, wx.Point): - clientPt = self._frame.ScreenToClient(eventOrPt) - screenPt = wx.Point(*eventOrPt) - else: - clientPt = eventOrPt.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - # try to find the pane - paneInfo = self.GetPane(self._action_window) - if not paneInfo.IsOk(): - raise Exception("Pane window not found") - - ret = False - - if paneInfo.frame: - - # calculate the offset from the upper left-hand corner - # of the frame to the mouse pointer - framePos = paneInfo.frame.GetPosition() - action_offset = screenPt - framePos - - # is the pane dockable? - if self.CanDockPanel(paneInfo): - # do the drop calculation - indx = self._panes.index(paneInfo) - ret, paneInfo = self.DoDrop(self._docks, self._panes, paneInfo, clientPt, action_offset) - - if ret: - e = self.FireEvent(wxEVT_AUI_PANE_DOCKING, paneInfo, canVeto=True) - if e.GetVeto(): - self.HideHint() - ShowDockingGuides(self._guides, False) - return - - e = self.FireEvent(wxEVT_AUI_PANE_DOCKED, paneInfo, canVeto=False) - - if self._agwFlags & AUI_MGR_SMOOTH_DOCKING: - self.SmoothDock(paneInfo) - - self._panes[indx] = paneInfo - - # if the pane is still floating, update it's floating - # position (that we store) - if paneInfo.IsFloating(): - paneInfo.floating_pos = paneInfo.frame.GetPosition() - if paneInfo.frame._transparent != paneInfo.transparent or self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: - paneInfo.frame.SetTransparent(paneInfo.transparent) - paneInfo.frame._transparent = paneInfo.transparent - - elif self._has_maximized: - self.RestoreMaximizedPane() - - # reorder for dropping to a new notebook - # (caution: this code breaks the reference!) - tempPaneInfo = self.CopyTarget(paneInfo) - self._panes.remove(paneInfo) - self._panes.append(tempPaneInfo) - - if ret: - self.Update() - - self.HideHint() - ShowDockingGuides(self._guides, False) - - - def OnMotion_DragToolbarPane(self, eventOrPt): - """ - Sub-handler for the L{OnMotion} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - isPoint = False - if isinstance(eventOrPt, wx.Point): - clientPt = self._frame.ScreenToClient(eventOrPt) - screenPt = wx.Point(*eventOrPt) - isPoint = True - else: - clientPt = eventOrPt.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - pane = self.GetPane(self._action_window) - if not pane.IsOk(): - raise Exception("Pane window not found") - - pane.state |= AuiPaneInfo.actionPane - indx = self._panes.index(pane) - - ret = False - wasFloating = pane.IsFloating() - # is the pane dockable? - if self.CanDockPanel(pane): - # do the drop calculation - ret, pane = self.DoDrop(self._docks, self._panes, pane, clientPt, self._action_offset) - - # update floating position - if pane.IsFloating(): - pane.floating_pos = screenPt - self._toolbar_action_offset - - # move the pane window - if pane.frame: - if wx.Platform == "__WXMSW__" and (self._agwFlags & AUI_MGR_TRANSPARENT_DRAG) == 0: # and not self.CheckPaneMove(pane): - # return - # HACK: Terrible hack on wxMSW (!) - pane.frame.SetTransparent(254) - - self._from_move = True - pane.frame.Move(pane.floating_pos) - self._from_move = False - - if self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: - pane.frame.SetTransparent(150) - - self._panes[indx] = pane - if ret and wasFloating != pane.IsFloating() or (ret and not wasFloating): - wx.CallAfter(self.Update) - - # when release the button out of the window. - # TODO: a better fix is needed. - - if _VERSION_STRING < "2.9": - leftDown = wx.GetMouseState().LeftDown() - else: - leftDown = wx.GetMouseState().LeftIsDown() - - if not leftDown: - self._action = actionNone - self.OnLeftUp_DragToolbarPane(eventOrPt) - - - def OnMotion_Other(self, event): - """ - Sub-handler for the L{OnMotion} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - part = self.HitTest(*event.GetPosition()) - - if part and part.type == AuiDockUIPart.typePaneButton \ - and self.IsPaneButtonVisible(part): - if part != self._hover_button: - - if self._hover_button: - self.RefreshButton(self._hover_button) - - self._hover_button = part - self.RefreshButton(part) - - else: - - if self._hover_button: - self.RefreshButton(self._hover_button) - else: - event.Skip() - - self._hover_button = None - - - def OnLeftUp_DragToolbarPane(self, eventOrPt): - """ - Sub-handler for the L{OnLeftUp} event. - - :param `event`: a `wx.MouseEvent` to be processed. - """ - - isPoint = False - if isinstance(eventOrPt, wx.Point): - clientPt = self._frame.ScreenToClient(eventOrPt) - screenPt = wx.Point(*eventOrPt) - isPoint = True - else: - clientPt = eventOrPt.GetPosition() - screenPt = self._frame.ClientToScreen(clientPt) - - # try to find the pane - pane = self.GetPane(self._action_window) - if not pane.IsOk(): - raise Exception("Pane window not found") - - if pane.IsFloating(): - pane.floating_pos = pane.frame.GetPosition() - if pane.frame._transparent != pane.transparent or self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: - pane.frame.SetTransparent(pane.transparent) - pane.frame._transparent = pane.transparent - - # save the new positions - docks = FindDocks(self._docks, pane.dock_direction, pane.dock_layer, pane.dock_row) - if len(docks) == 1: - dock = docks[0] - pane_positions, pane_sizes = self.GetPanePositionsAndSizes(dock) - - for i in xrange(len(dock.panes)): - dock.panes[i].dock_pos = pane_positions[i] - - pane.state &= ~AuiPaneInfo.actionPane - self.Update() - - - def OnPaneButton(self, event): - """ - Handles the ``EVT_AUI_PANE_BUTTON`` event for L{AuiManager}. - - :param `event`: a L{AuiManagerEvent} event to be processed. - """ - - if not event.pane: - raise Exception("Pane Info passed to AuiManager.OnPaneButton must be non-null") - - pane = event.pane - - if event.button == AUI_BUTTON_CLOSE: - - if isinstance(pane.window.GetParent(), AuiFloatingFrame): - rootManager = GetManager(pane.window) - else: - rootManager = self - - if rootManager != self: - self._frame.Close() - return - - # fire pane close event - e = AuiManagerEvent(wxEVT_AUI_PANE_CLOSE) - e.SetManager(self) - e.SetPane(event.pane) - self.ProcessMgrEvent(e) - - if not e.GetVeto(): - - # close the pane, but check that it - # still exists in our pane array first - # (the event handler above might have removed it) - - check = self.GetPane(pane.window) - if check.IsOk(): - self.ClosePane(pane) - - self.Update() - - # mn this performs the minimizing of a pane - elif event.button == AUI_BUTTON_MINIMIZE: - e = AuiManagerEvent(wxEVT_AUI_PANE_MINIMIZE) - e.SetManager(self) - e.SetPane(event.pane) - self.ProcessMgrEvent(e) - - if not e.GetVeto(): - self.MinimizePane(pane) - - elif event.button == AUI_BUTTON_MAXIMIZE_RESTORE and not pane.IsMaximized(): - - # fire pane close event - e = AuiManagerEvent(wxEVT_AUI_PANE_MAXIMIZE) - e.SetManager(self) - e.SetPane(event.pane) - self.ProcessMgrEvent(e) - - if not e.GetVeto(): - - self.MaximizePane(pane) - self.Update() - - elif event.button == AUI_BUTTON_MAXIMIZE_RESTORE and pane.IsMaximized(): - - # fire pane close event - e = AuiManagerEvent(wxEVT_AUI_PANE_RESTORE) - e.SetManager(self) - e.SetPane(event.pane) - self.ProcessMgrEvent(e) - - if not e.GetVeto(): - - self.RestorePane(pane) - self.Update() - - elif event.button == AUI_BUTTON_PIN: - - if self._agwFlags & AUI_MGR_ALLOW_FLOATING and pane.IsFloatable(): - e = self.FireEvent(wxEVT_AUI_PANE_FLOATING, pane, canVeto=True) - if e.GetVeto(): - return - - pane.Float() - e = self.FireEvent(wxEVT_AUI_PANE_FLOATED, pane, canVeto=False) - - self.Update() - - - def MinimizePane(self, paneInfo): - """ - Minimizes a pane in a newly and automatically created L{AuiToolBar}. - - Clicking on the minimize button causes a new L{AuiToolBar} to be created - and added to the frame manager (currently the implementation is such that - panes at West will have a toolbar at the right, panes at South will have - toolbars at the bottom etc...) and the pane is hidden in the manager. - - Clicking on the restore button on the newly created toolbar will result in the - toolbar being removed and the original pane being restored. - - :param `paneInfo`: a L{AuiPaneInfo} instance for the pane to be minimized. - """ - - if not paneInfo.IsToolbar(): - - if paneInfo.IsMinimized(): - # We are already minimized - return - - # Basically the idea is this. - # - # 1) create a toolbar, with a restore button - # - # 2) place the new toolbar in the toolbar area representative of the location of the pane - # (NORTH/SOUTH/EAST/WEST, central area always to the right) - # - # 3) Hide the minimizing pane - - - # personalize the toolbar style - tbStyle = AUI_TB_DEFAULT_STYLE - posMask = paneInfo.minimize_mode & AUI_MINIMIZE_POS_MASK - captMask = paneInfo.minimize_mode & AUI_MINIMIZE_CAPT_MASK - dockDirection = paneInfo.dock_direction - if captMask != 0: - tbStyle |= AUI_TB_TEXT - if posMask == AUI_MINIMIZE_POS_SMART: - if paneInfo.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM]: - tbStyle |= AUI_TB_HORZ_LAYOUT - - elif paneInfo.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT, AUI_DOCK_CENTER]: - tbStyle |= AUI_TB_VERTICAL - if captMask == AUI_MINIMIZE_CAPT_SMART: - tbStyle |= AUI_TB_CLOCKWISE - - elif posMask in [AUI_MINIMIZE_POS_TOP, AUI_MINIMIZE_POS_BOTTOM]: - tbStyle |= AUI_TB_HORZ_LAYOUT - if posMask == AUI_MINIMIZE_POS_TOP: - dockDirection = AUI_DOCK_TOP - else: - dockDirection = AUI_DOCK_BOTTOM - - else: - tbStyle |= AUI_TB_VERTICAL - if captMask == AUI_MINIMIZE_CAPT_SMART: - tbStyle |= AUI_TB_CLOCKWISE - if posMask == AUI_MINIMIZE_POS_LEFT: - dockDirection = AUI_DOCK_LEFT - elif posMask == AUI_MINIMIZE_POS_RIGHT: - dockDirection = AUI_DOCK_RIGHT - elif posMask == AUI_MINIMIZE_POS_BOTTOM: - dockDirection = AUI_DOCK_BOTTOM - - # Create a new toolbar - # give it the same name as the minimized pane with _min appended - - win_rect = paneInfo.window.GetScreenRect() - - minimize_toolbar = auibar.AuiToolBar(self.GetManagedWindow(), agwStyle=tbStyle) - minimize_toolbar.Hide() - minimize_toolbar.SetToolBitmapSize(wx.Size(16, 16)) - - if paneInfo.icon and paneInfo.icon.IsOk(): - restore_bitmap = paneInfo.icon - else: - restore_bitmap = self._art._restore_bitmap - - minimize_toolbar.AddSimpleTool(ID_RESTORE_FRAME, paneInfo.caption, restore_bitmap, "Restore " + paneInfo.caption) - minimize_toolbar.SetAuiManager(self) - minimize_toolbar.Realize() - toolpanelname = paneInfo.name + "_min" - - if paneInfo.IsMaximized(): - paneInfo.SetFlag(paneInfo.wasMaximized, True) - - if dockDirection == AUI_DOCK_TOP: - self.AddPane(minimize_toolbar, AuiPaneInfo(). \ - Name(toolpanelname).Caption(paneInfo.caption). \ - ToolbarPane().Top().BottomDockable(False). \ - LeftDockable(False).RightDockable(False).DestroyOnClose()) - - elif dockDirection == AUI_DOCK_BOTTOM: - self.AddPane(minimize_toolbar, AuiPaneInfo(). \ - Name(toolpanelname).Caption(paneInfo.caption). \ - ToolbarPane().Bottom().TopDockable(False). \ - LeftDockable(False).RightDockable(False).DestroyOnClose()) - - elif dockDirection == AUI_DOCK_LEFT: - self.AddPane(minimize_toolbar, AuiPaneInfo(). \ - Name(toolpanelname).Caption(paneInfo.caption). \ - ToolbarPane().Left().TopDockable(False). \ - BottomDockable(False).RightDockable(False).DestroyOnClose()) - - elif dockDirection in [AUI_DOCK_RIGHT, AUI_DOCK_CENTER]: - self.AddPane(minimize_toolbar, AuiPaneInfo(). \ - Name(toolpanelname).Caption(paneInfo.caption). \ - ToolbarPane().Right().TopDockable(False). \ - LeftDockable(False).BottomDockable(False).DestroyOnClose()) - - arr = FindDocks(self._docks, paneInfo.dock_direction, paneInfo.dock_layer, paneInfo.dock_row) - - if arr: - dock = arr[0] - paneInfo.previousDockSize = dock.size - - paneInfo.previousDockPos = paneInfo.dock_pos - - # mark ourselves minimized - paneInfo.Minimize() - paneInfo.Show(False) - self._has_minimized = True - # last, hide the window - if paneInfo.window and paneInfo.window.IsShown(): - paneInfo.window.Show(False) - - minimize_toolbar.Show() - self.Update() - if self._agwFlags & AUI_MGR_ANIMATE_FRAMES: - self.AnimateDocking(win_rect, minimize_toolbar.GetScreenRect()) - - - def OnRestoreMinimizedPane(self, event): - """ - Handles the ``EVT_AUI_PANE_MIN_RESTORE`` event for L{AuiManager}. - - :param `event`: an instance of L{AuiManagerEvent} to be processed. - """ - - self.RestoreMinimizedPane(event.pane) - - - def OnPaneDocked(self, event): - """ - Handles the ``EVT_AUI_PANE_DOCKED`` event for L{AuiManager}. - - :param `event`: an instance of L{AuiManagerEvent} to be processed. - """ - - event.Skip() - self.RemoveAutoNBCaption(event.GetPane()) - - - def CreateNotebookBase(self, panes, paneInfo): - """ - Creates an auto-notebook base from a pane, and then add that pane as a page. - - :param `panes`: Set of panes to append new notebook base pane to - :param `paneInfo`: L{AuiPaneInfo} instance to convert to new notebook. - """ - - # Create base notebook pane ... - nbid = len(self._notebooks) - - baseInfo = AuiPaneInfo() - baseInfo.SetDockPos(paneInfo).NotebookControl(nbid). \ - CloseButton(False).SetNameFromNotebookId(). \ - NotebookDockable(False).Floatable(paneInfo.IsFloatable()) - baseInfo.best_size = paneInfo.best_size - panes.append(baseInfo) - - # add original pane as tab ... - paneInfo.NotebookPage(nbid) - - def RemoveAutoNBCaption(self, pane): - """ - Removes the caption on newly created automatic notebooks. - - :param `pane`: an instance of L{AuiPaneInfo} (the target notebook). - """ - - if self._agwFlags & AUI_MGR_AUTONB_NO_CAPTION == 0: - return False - - def RemoveCaption(): - """ Sub-function used to remove the pane caption on automatic notebooks. """ - - if pane.HasNotebook(): - notebook = self._notebooks[pane.notebook_id] - self.GetPane(notebook).CaptionVisible(False).PaneBorder(False) - self.Update() - - # it seems the notebook isnt created by this stage, so remove - # the caption a moment later - wx.CallAfter(RemoveCaption) - return True - - - def RestoreMinimizedPane(self, paneInfo): - """ - Restores a previously minimized pane. - - :param `paneInfo`: a L{AuiPaneInfo} instance for the pane to be restored. - """ - - panename = paneInfo.name - panename = panename[0:-4] - pane = self.GetPane(panename) - - pane.SetFlag(pane.needsRestore, True) - - if not pane.IsOk(): - panename = paneInfo.name - pane = self.GetPane(panename) - paneInfo = self.GetPane(panename + "_min") - if not paneInfo.IsOk(): - # Already minimized - return - - if pane.IsOk(): - if not pane.IsMinimized(): - return - - - if pane.HasFlag(pane.wasMaximized): - - self.SavePreviousDockSizes(pane) - - - self.ShowPane(pane.window, True) - pane.Show(True) - self._has_minimized = False - pane.SetFlag(pane.optionMinimized, False) - paneInfo.window.Show(False) - self.DetachPane(paneInfo.window) - paneInfo.Show(False) - paneInfo.Hide() - - self.Update() - - - def AnimateDocking(self, win_rect, pane_rect): - """ - Animates the minimization/docking of a pane a la Eclipse, using a `wx.ScreenDC` - to draw a "moving docking rectangle" on the screen. - - :param `win_rect`: the original pane screen rectangle; - :param `pane_rect`: the newly created toolbar/pane screen rectangle. - - :note: This functionality is not available on wxMAC as this platform doesn't have - the ability to use `wx.ScreenDC` to draw on-screen and on Windows > Vista. - """ - - if wx.Platform == "__WXMAC__": - # No wx.ScreenDC on the Mac... - return - if wx.Platform == "__WXMSW__" and wx.GetOsVersion()[1] > 5: - # No easy way to handle this on Vista... - return - - xstart, ystart = win_rect.x, win_rect.y - xend, yend = pane_rect.x, pane_rect.y - - step = self.GetAnimationStep() - - wstep = int(abs(win_rect.width - pane_rect.width)/step) - hstep = int(abs(win_rect.height - pane_rect.height)/step) - xstep = int(win_rect.x - pane_rect.x)/step - ystep = int(win_rect.y - pane_rect.y)/step - - dc = wx.ScreenDC() - dc.SetLogicalFunction(wx.INVERT) - dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.SetPen(wx.LIGHT_GREY_PEN) - - for i in xrange(int(step)): - width, height = win_rect.width - i*wstep, win_rect.height - i*hstep - x, y = xstart - i*xstep, ystart - i*ystep - new_rect = wx.Rect(x, y, width, height) - dc.DrawRoundedRectangleRect(new_rect, 3) - wx.SafeYield() - wx.MilliSleep(10) - dc.DrawRoundedRectangleRect(new_rect, 3) - - - def SmoothDock(self, paneInfo): - """ - This method implements a smooth docking effect for floating panes, similar to - what the PyQT library does with its floating windows. - - :param `paneInfo`: an instance of L{AuiPaneInfo}. - - :note: The smooth docking effect can only be used if you set the ``AUI_MGR_SMOOTH_DOCKING`` - style to L{AuiManager}. - """ - - if paneInfo.IsToolbar(): - return - - if not paneInfo.frame or self._hint_rect.IsEmpty(): - return - - hint_rect = self._hint_rect - win_rect = paneInfo.frame.GetScreenRect() - - xstart, ystart = win_rect.x, win_rect.y - xend, yend = hint_rect.x, hint_rect.y - - step = self.GetAnimationStep()/3 - - wstep = int((win_rect.width - hint_rect.width)/step) - hstep = int((win_rect.height - hint_rect.height)/step) - xstep = int((win_rect.x - hint_rect.x))/step - ystep = int((win_rect.y - hint_rect.y))/step - - for i in xrange(int(step)): - width, height = win_rect.width - i*wstep, win_rect.height - i*hstep - x, y = xstart - i*xstep, ystart - i*ystep - new_rect = wx.Rect(x, y, width, height) - paneInfo.frame.SetRect(new_rect) - wx.MilliSleep(10) - - - def SetSnapLimits(self, x, y): - """ - Modifies the snap limits used when snapping the `managed_window` to the screen - (using L{SnapToScreen}) or when snapping the floating panes to one side of the - `managed_window` (using L{SnapPane}). - - To change the limit after which the `managed_window` or the floating panes are - automatically stickled to the screen border (or to the `managed_window` side), - set these two variables. Default values are 15 pixels. - - :param `x`: the minimum horizontal distance below which the snap occurs; - :param `y`: the minimum vertical distance below which the snap occurs. - """ - - self._snap_limits = (x, y) - self.Snap() - - - def Snap(self): - """ - Snaps the main frame to specified position on the screen. - - :see: L{SnapToScreen} - """ - - snap, hAlign, vAlign, monitor = self._is_docked - if not snap: - return - - managed_window = self.GetManagedWindow() - snap_pos = self.GetSnapPosition() - wnd_pos = managed_window.GetPosition() - snapX, snapY = self._snap_limits - - if abs(snap_pos.x - wnd_pos.x) < snapX and abs(snap_pos.y - wnd_pos.y) < snapY: - managed_window.SetPosition(snap_pos) - - - def SnapToScreen(self, snap=True, monitor=0, hAlign=wx.RIGHT, vAlign=wx.TOP): - """ - Snaps the main frame to specified position on the screen. - - :param `snap`: whether to snap the main frame or not; - :param `monitor`: the monitor display in which snapping the window; - :param `hAlign`: the horizontal alignment of the snapping position; - :param `vAlign`: the vertical alignment of the snapping position. - """ - - if not snap: - self._is_docked = (False, wx.RIGHT, wx.TOP, 0) - return - - displayCount = wx.Display.GetCount() - if monitor > displayCount: - raise Exception("Invalid monitor selected: you only have %d monitors"%displayCount) - - self._is_docked = (True, hAlign, vAlign, monitor) - self.GetManagedWindow().SetPosition(self.GetSnapPosition()) - - - def GetSnapPosition(self): - """ Returns the main frame snapping position. """ - - snap, hAlign, vAlign, monitor = self._is_docked - - display = wx.Display(monitor) - area = display.GetClientArea() - size = self.GetManagedWindow().GetSize() - - pos = wx.Point() - if hAlign == wx.LEFT: - pos.x = area.x - elif hAlign == wx.CENTER: - pos.x = area.x + (area.width - size.x)/2 - else: - pos.x = area.x + area.width - size.x - - if vAlign == wx.TOP: - pos.y = area.y - elif vAlign == wx.CENTER: - pos.y = area.y + (area.height - size.y)/2 - else: - pos.y = area.y + area.height - size.y - - return pos - - - def GetAnimationStep(self): - """ Returns the animation step speed (a float) to use in L{AnimateDocking}. """ - - return self._animation_step - - - def SetAnimationStep(self, step): - """ - Sets the animation step speed (a float) to use in L{AnimateDocking}. - - :param `step`: a floating point value for the animation speed. - """ - - self._animation_step = float(step) - - - def RequestUserAttention(self, pane_window): - """ - Requests the user attention by intermittently highlighting the pane caption. - - :param `pane_window`: a `wx.Window` derived window, managed by the pane. - """ - - # try to find the pane - paneInfo = self.GetPane(pane_window) - if not paneInfo.IsOk(): - raise Exception("Pane window not found") - - dc = wx.ClientDC(self._frame) - - # if the frame is about to be deleted, don't bother - if not self._frame or self._frame.IsBeingDeleted(): - return - - if not self._frame.GetSizer(): - return - - for part in self._uiparts: - if part.pane == paneInfo: - self._art.RequestUserAttention(dc, self._frame, part.pane.caption, part.rect, part.pane) - self._frame.RefreshRect(part.rect, True) - break - - - def StartPreviewTimer(self, toolbar): - """ - Starts a timer for sliding in and out a minimized pane. - - :param `toolbar`: the L{AuiToolBar} containing the minimized pane tool. - """ - - toolbar_pane = self.GetPane(toolbar) - toolbar_name = toolbar_pane.name - - pane_name = toolbar_name[0:-4] - - self._sliding_pane = self.GetPane(pane_name) - self._sliding_rect = toolbar.GetScreenRect() - self._sliding_direction = toolbar_pane.dock_direction - self._sliding_frame = None - - self._preview_timer.Start(1000, wx.TIMER_ONE_SHOT) - - - def StopPreviewTimer(self): - """ Stops a timer for sliding in and out a minimized pane. """ - - if self._preview_timer.IsRunning(): - self._preview_timer.Stop() - - self.SlideOut() - self._sliding_pane = None - - - def SlideIn(self, event): - """ - Handles the ``wx.EVT_TIMER`` event for L{AuiManager}. - - :param `event`: a `wx.TimerEvent` to be processed. - - :note: This is used solely for sliding in and out minimized panes. - """ - - window = self._sliding_pane.window - self._sliding_frame = wx.MiniFrame(None, -1, title=_("Pane Preview"), - style=wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | - wx.FRAME_NO_TASKBAR | wx.CAPTION) - window.Reparent(self._sliding_frame) - self._sliding_frame.SetSize((0, 0)) - window.Show() - self._sliding_frame.Show() - - size = window.GetBestSize() - - startX, startY, stopX, stopY = GetSlidingPoints(self._sliding_rect, size, self._sliding_direction) - - step = stopX/10 - window_size = 0 - - for i in xrange(0, stopX, step): - window_size = i - self._sliding_frame.SetDimensions(startX, startY, window_size, stopY) - self._sliding_frame.Refresh() - self._sliding_frame.Update() - wx.MilliSleep(10) - - self._sliding_frame.SetDimensions(startX, startY, stopX, stopY) - self._sliding_frame.Refresh() - self._sliding_frame.Update() - - - def SlideOut(self): - """ - Slides out a preview of a minimized pane. - - :note: This is used solely for sliding in and out minimized panes. - """ - - if not self._sliding_frame: - return - - window = self._sliding_frame.GetChildren()[0] - size = window.GetBestSize() - - startX, startY, stopX, stopY = GetSlidingPoints(self._sliding_rect, size, self._sliding_direction) - - step = stopX/10 - window_size = 0 - - for i in xrange(stopX, 0, -step): - window_size = i - self._sliding_frame.SetDimensions(startX, startY, window_size, stopY) - self._sliding_frame.Refresh() - self._sliding_frame.Update() - self._frame.RefreshRect(wx.Rect(startX+window_size, startY, step, stopY)) - self._frame.Update() - wx.MilliSleep(10) - - self._sliding_frame.SetDimensions(startX, startY, 0, stopY) - - window.Hide() - window.Reparent(self._frame) - - self._sliding_frame.Hide() - self._sliding_frame.Destroy() - self._sliding_frame = None - self._sliding_pane = None - - -class AuiManager_DCP(AuiManager): - """ - A class similar to L{AuiManager} but with a Dummy Center Pane (**DCP**). - The code for this class is still flickery due to the call to `wx.CallAfter` - and the double-update call. - """ - - def __init__(self, *args, **keys): - - AuiManager.__init__(self, *args, **keys) - self.hasDummyPane = False - - - def _createDummyPane(self): - """ Creates a Dummy Center Pane (**DCP**). """ - - if self.hasDummyPane: - return - - self.hasDummyPane = True - dummy = wx.Panel(self.GetManagedWindow()) - info = AuiPaneInfo().CenterPane().NotebookDockable(True).Name('dummyCenterPane').DestroyOnClose(True) - self.AddPane(dummy, info) - - - def _destroyDummyPane(self): - """ Destroys the Dummy Center Pane (**DCP**). """ - - if not self.hasDummyPane: - return - - self.hasDummyPane = False - self.ClosePane(self.GetPane('dummyCenterPane')) - - - def Update(self): - """ - This method is called after any number of changes are made to any of the - managed panes. L{Update} must be invoked after L{AuiManager.AddPane} or L{AuiManager.InsertPane} are - called in order to "realize" or "commit" the changes. - - In addition, any number of changes may be made to L{AuiPaneInfo} structures - (retrieved with L{AuiManager.GetPane}), but to realize the changes, L{Update} - must be called. This construction allows pane flicker to be avoided by updating - the whole layout at one time. - """ - - AuiManager.Update(self) - - # check if there's already a center pane (except our dummy pane) - dummyCenterPane = self.GetPane('dummyCenterPane') - haveCenterPane = any((pane != dummyCenterPane) and (pane.dock_direction == AUI_DOCK_CENTER) and - not pane.IsFloating() and pane.IsShown() for pane in self.GetAllPanes()) - if haveCenterPane: - if self.hasDummyPane: - # there's our dummy pane and also another center pane, therefor let's remove our dummy - def do(): - self._destroyDummyPane() - self.Update() - wx.CallAfter(do) - else: - # if we get here, there's no center pane, create our dummy - if not self.hasDummyPane: - self._createDummyPane() - - diff --git a/aui/tabart.py b/aui/tabart.py deleted file mode 100644 index 60b8e01..0000000 --- a/aui/tabart.py +++ /dev/null @@ -1,2777 +0,0 @@ -""" -Tab art provider code - a tab provider provides all drawing functionality to -the L{AuiNotebook}. This allows the L{AuiNotebook} to have a plugable look-and-feel. - -By default, a L{AuiNotebook} uses an instance of this class called L{AuiDefaultTabArt} -which provides bitmap art and a colour scheme that is adapted to the major platforms' -look. You can either derive from that class to alter its behaviour or write a -completely new tab art class. Call L{AuiNotebook.SetArtProvider} to make use this -new tab art. -""" - -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx - -if wx.Platform == '__WXMAC__': - import Carbon.Appearance - -from aui_utilities import BitmapFromBits, StepColour, IndentPressedBitmap, ChopText -from aui_utilities import GetBaseColour, DrawMACCloseButton, LightColour, TakeScreenShot -from aui_utilities import CopyAttributes - -from aui_constants import * - - -# -- GUI helper classes and functions -- -class AuiCommandCapture(wx.PyEvtHandler): - """ A class to handle the dropdown window menu. """ - - def __init__(self): - """ Default class constructor. """ - - wx.PyEvtHandler.__init__(self) - self._last_id = 0 - - - def GetCommandId(self): - """ Returns the event command identifier. """ - - return self._last_id - - - def ProcessEvent(self, event): - """ - Processes an event, searching event tables and calling zero or more suitable - event handler function(s). - - :param `event`: the event to process. - - :note: Normally, your application would not call this function: it is called - in the wxPython implementation to dispatch incoming user interface events - to the framework (and application). - However, you might need to call it if implementing new functionality (such as - a new control) where you define new event types, as opposed to allowing the - user to override functions. - - An instance where you might actually override the L{ProcessEvent} function is where - you want to direct event processing to event handlers not normally noticed by - wxPython. For example, in the document/view architecture, documents and views - are potential event handlers. When an event reaches a frame, L{ProcessEvent} will - need to be called on the associated document and view in case event handler - functions are associated with these objects. - - The normal order of event table searching is as follows: - - 1. If the object is disabled (via a call to `SetEvtHandlerEnabled`) the function - skips to step (6). - 2. If the object is a `wx.Window`, L{ProcessEvent} is recursively called on the window's - `wx.Validator`. If this returns ``True``, the function exits. - 3. wxWidgets `SearchEventTable` is called for this event handler. If this fails, the - base class table is tried, and so on until no more tables exist or an appropriate - function was found, in which case the function exits. - 4. The search is applied down the entire chain of event handlers (usually the chain - has a length of one). If this succeeds, the function exits. - 5. If the object is a `wx.Window` and the event is a `wx.CommandEvent`, L{ProcessEvent} is - recursively applied to the parent window's event handler. If this returns ``True``, - the function exits. - 6. Finally, L{ProcessEvent} is called on the `wx.App` object. - """ - - if event.GetEventType() == wx.wxEVT_COMMAND_MENU_SELECTED: - self._last_id = event.GetId() - return True - - if self.GetNextHandler(): - return self.GetNextHandler().ProcessEvent(event) - - return False - - -class AuiDefaultTabArt(object): - """ - Tab art provider code - a tab provider provides all drawing functionality to - the L{AuiNotebook}. This allows the L{AuiNotebook} to have a plugable look-and-feel. - - By default, a L{AuiNotebook} uses an instance of this class called L{AuiDefaultTabArt} - which provides bitmap art and a colour scheme that is adapted to the major platforms' - look. You can either derive from that class to alter its behaviour or write a - completely new tab art class. Call L{AuiNotebook.SetArtProvider} to make use this - new tab art. - """ - - def __init__(self): - """ Default class constructor. """ - - self._normal_font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) - self._selected_font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) - self._selected_font.SetWeight(wx.BOLD) - self._measuring_font = self._selected_font - - self._fixed_tab_width = 100 - self._tab_ctrl_height = 0 - self._buttonRect = wx.Rect() - - self.SetDefaultColours() - - if wx.Platform == "__WXMAC__": - bmp_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW) - self._active_close_bmp = DrawMACCloseButton(bmp_colour) - self._disabled_close_bmp = DrawMACCloseButton(wx.Colour(128, 128, 128)) - else: - self._active_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.BLACK) - self._disabled_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.Colour(128, 128, 128)) - - self._hover_close_bmp = self._active_close_bmp - self._pressed_close_bmp = self._active_close_bmp - - self._active_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.BLACK) - self._disabled_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.Colour(128, 128, 128)) - - self._active_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.BLACK) - self._disabled_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.Colour(128, 128, 128)) - - self._active_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.BLACK) - self._disabled_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.Colour(128, 128, 128)) - - if wx.Platform == "__WXMAC__": - # Get proper highlight colour for focus rectangle from the - # current Mac theme. kThemeBrushFocusHighlight is - # available on Mac OS 8.5 and higher - if hasattr(wx, 'MacThemeColour'): - c = wx.MacThemeColour(Carbon.Appearance.kThemeBrushFocusHighlight) - else: - brush = wx.Brush(wx.BLACK) - brush.MacSetTheme(Carbon.Appearance.kThemeBrushFocusHighlight) - c = brush.GetColour() - self._focusPen = wx.Pen(c, 2, wx.SOLID) - else: - self._focusPen = wx.Pen(wx.BLACK, 1, wx.USER_DASH) - self._focusPen.SetDashes([1, 1]) - self._focusPen.SetCap(wx.CAP_BUTT) - - - def SetBaseColour(self, base_colour): - """ - Sets a new base colour. - - :param `base_colour`: an instance of `wx.Colour`. - """ - - self._base_colour = base_colour - self._base_colour_pen = wx.Pen(self._base_colour) - self._base_colour_brush = wx.Brush(self._base_colour) - - - def SetDefaultColours(self, base_colour=None): - """ - Sets the default colours, which are calculated from the given base colour. - - :param `base_colour`: an instance of `wx.Colour`. If defaulted to ``None``, a colour - is generated accordingly to the platform and theme. - """ - - if base_colour is None: - base_colour = GetBaseColour() - - self.SetBaseColour( base_colour ) - self._border_colour = StepColour(base_colour, 75) - self._border_pen = wx.Pen(self._border_colour) - - self._background_top_colour = StepColour(self._base_colour, 90) - self._background_bottom_colour = StepColour(self._base_colour, 170) - - self._tab_top_colour = self._base_colour - self._tab_bottom_colour = wx.WHITE - self._tab_gradient_highlight_colour = wx.WHITE - - self._tab_inactive_top_colour = self._base_colour - self._tab_inactive_bottom_colour = StepColour(self._tab_inactive_top_colour, 160) - - self._tab_text_colour = lambda page: page.text_colour - self._tab_disabled_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT) - - - def Clone(self): - """ Clones the art object. """ - - art = type(self)() - art.SetNormalFont(self.GetNormalFont()) - art.SetSelectedFont(self.GetSelectedFont()) - art.SetMeasuringFont(self.GetMeasuringFont()) - - art = CopyAttributes(art, self) - return art - - - def SetAGWFlags(self, agwFlags): - """ - Sets the tab art flags. - - :param `agwFlags`: a combination of the following values: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook - ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. - ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. - ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook - ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab - ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging - ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control - ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width - ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed - ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available - ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar - ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab - ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs - ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click - ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks - ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present - ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows - ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items - ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) - ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages - ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) - ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs - ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle - ==================================== ================================== - - """ - - self._agwFlags = agwFlags - - - def GetAGWFlags(self): - """ - Returns the tab art flags. - - :see: L{SetAGWFlags} for a list of possible return values. - """ - - return self._agwFlags - - - def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): - """ - Sets the tab sizing information. - - :param `tab_ctrl_size`: the size of the tab control area; - :param `tab_count`: the number of tabs; - :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths - to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. - """ - - self._fixed_tab_width = 100 - minTabWidth, maxTabWidth = minMaxTabWidth - - tot_width = tab_ctrl_size.x - self.GetIndentSize() - 4 - agwFlags = self.GetAGWFlags() - - if agwFlags & AUI_NB_CLOSE_BUTTON: - tot_width -= self._active_close_bmp.GetWidth() - if agwFlags & AUI_NB_WINDOWLIST_BUTTON: - tot_width -= self._active_windowlist_bmp.GetWidth() - - if tab_count > 0: - self._fixed_tab_width = tot_width/tab_count - - if self._fixed_tab_width < 100: - self._fixed_tab_width = 100 - - if self._fixed_tab_width > tot_width/2: - self._fixed_tab_width = tot_width/2 - - if self._fixed_tab_width > 220: - self._fixed_tab_width = 220 - - if minTabWidth > -1: - self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) - if maxTabWidth > -1: - self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) - - self._tab_ctrl_height = tab_ctrl_size.y - - - def DrawBackground(self, dc, wnd, rect): - """ - Draws the tab area background. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `rect`: the tab control rectangle. - """ - - self._buttonRect = wx.Rect() - - # draw background - agwFlags = self.GetAGWFlags() - if agwFlags & AUI_NB_BOTTOM: - r = wx.Rect(rect.x, rect.y, rect.width+2, rect.height) - - # TODO: else if (agwFlags & AUI_NB_LEFT) - # TODO: else if (agwFlags & AUI_NB_RIGHT) - else: #for AUI_NB_TOP - r = wx.Rect(rect.x, rect.y, rect.width+2, rect.height-3) - - dc.GradientFillLinear(r, self._background_top_colour, self._background_bottom_colour, wx.SOUTH) - - # draw base lines - - dc.SetPen(self._border_pen) - y = rect.GetHeight() - w = rect.GetWidth() - - if agwFlags & AUI_NB_BOTTOM: - dc.SetBrush(wx.Brush(self._background_bottom_colour)) - dc.DrawRectangle(-1, 0, w+2, 4) - - # TODO: else if (agwFlags & AUI_NB_LEFT) - # TODO: else if (agwFlags & AUI_NB_RIGHT) - - else: # for AUI_NB_TOP - dc.SetBrush(self._base_colour_brush) - dc.DrawRectangle(-1, y-4, w+2, 4) - - - def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): - """ - Draws a single tab. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `page`: the tab control page associated with the tab; - :param `in_rect`: rectangle the tab should be confined to; - :param `close_button_state`: the state of the close button on the tab; - :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. - """ - - # if the caption is empty, measure some temporary text - caption = page.caption - if not caption: - caption = "Xj" - - dc.SetFont(self._selected_font) - selected_textx, selected_texty, dummy = dc.GetMultiLineTextExtent(caption) - - dc.SetFont(self._normal_font) - normal_textx, normal_texty, dummy = dc.GetMultiLineTextExtent(caption) - - control = page.control - - # figure out the size of the tab - tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, - page.active, close_button_state, control) - - tab_height = self._tab_ctrl_height - 3 - tab_width = tab_size[0] - tab_x = in_rect.x - tab_y = in_rect.y + in_rect.height - tab_height - - caption = page.caption - - # select pen, brush and font for the tab to be drawn - - if page.active: - - dc.SetFont(self._selected_font) - textx, texty = selected_textx, selected_texty - - else: - - dc.SetFont(self._normal_font) - textx, texty = normal_textx, normal_texty - - if not page.enabled: - dc.SetTextForeground(self._tab_disabled_text_colour) - pagebitmap = page.dis_bitmap - else: - dc.SetTextForeground(self._tab_text_colour(page)) - pagebitmap = page.bitmap - - # create points that will make the tab outline - - clip_width = tab_width - if tab_x + clip_width > in_rect.x + in_rect.width: - clip_width = in_rect.x + in_rect.width - tab_x - - # since the above code above doesn't play well with WXDFB or WXCOCOA, - # we'll just use a rectangle for the clipping region for now -- - dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3) - - border_points = [wx.Point() for i in xrange(6)] - agwFlags = self.GetAGWFlags() - - if agwFlags & AUI_NB_BOTTOM: - - border_points[0] = wx.Point(tab_x, tab_y) - border_points[1] = wx.Point(tab_x, tab_y+tab_height-6) - border_points[2] = wx.Point(tab_x+2, tab_y+tab_height-4) - border_points[3] = wx.Point(tab_x+tab_width-2, tab_y+tab_height-4) - border_points[4] = wx.Point(tab_x+tab_width, tab_y+tab_height-6) - border_points[5] = wx.Point(tab_x+tab_width, tab_y) - - else: #if (agwFlags & AUI_NB_TOP) - - border_points[0] = wx.Point(tab_x, tab_y+tab_height-4) - border_points[1] = wx.Point(tab_x, tab_y+2) - border_points[2] = wx.Point(tab_x+2, tab_y) - border_points[3] = wx.Point(tab_x+tab_width-2, tab_y) - border_points[4] = wx.Point(tab_x+tab_width, tab_y+2) - border_points[5] = wx.Point(tab_x+tab_width, tab_y+tab_height-4) - - # TODO: else if (agwFlags & AUI_NB_LEFT) - # TODO: else if (agwFlags & AUI_NB_RIGHT) - - drawn_tab_yoff = border_points[1].y - drawn_tab_height = border_points[0].y - border_points[1].y - - if page.active: - - # draw active tab - - # draw base background colour - r = wx.Rect(tab_x, tab_y, tab_width, tab_height) - dc.SetPen(self._base_colour_pen) - dc.SetBrush(self._base_colour_brush) - dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4) - - # this white helps fill out the gradient at the top of the tab - dc.SetPen( wx.Pen(self._tab_gradient_highlight_colour) ) - dc.SetBrush( wx.Brush(self._tab_gradient_highlight_colour) ) - dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4) - - # these two points help the rounded corners appear more antialiased - dc.SetPen(self._base_colour_pen) - dc.DrawPoint(r.x+2, r.y+1) - dc.DrawPoint(r.x+r.width-2, r.y+1) - - # set rectangle down a bit for gradient drawing - r.SetHeight(r.GetHeight()/2) - r.x += 2 - r.width -= 2 - r.y += r.height - r.y -= 2 - - # draw gradient background - top_colour = self._tab_bottom_colour - bottom_colour = self._tab_top_colour - dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) - - else: - - # draw inactive tab - - r = wx.Rect(tab_x, tab_y+1, tab_width, tab_height-3) - - # start the gradent up a bit and leave the inside border inset - # by a pixel for a 3D look. Only the top half of the inactive - # tab will have a slight gradient - r.x += 3 - r.y += 1 - r.width -= 4 - r.height /= 2 - r.height -= 1 - - # -- draw top gradient fill for glossy look - top_colour = self._tab_inactive_top_colour - bottom_colour = self._tab_inactive_bottom_colour - dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) - - r.y += r.height - r.y -= 1 - - # -- draw bottom fill for glossy look - top_colour = self._tab_inactive_bottom_colour - bottom_colour = self._tab_inactive_bottom_colour - dc.GradientFillLinear(r, top_colour, bottom_colour, wx.SOUTH) - - # draw tab outline - dc.SetPen(self._border_pen) - dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.DrawPolygon(border_points) - - # there are two horizontal grey lines at the bottom of the tab control, - # this gets rid of the top one of those lines in the tab control - if page.active: - - if agwFlags & AUI_NB_BOTTOM: - dc.SetPen(wx.Pen(self._background_bottom_colour)) - - # TODO: else if (agwFlags & AUI_NB_LEFT) - # TODO: else if (agwFlags & AUI_NB_RIGHT) - else: # for AUI_NB_TOP - dc.SetPen(self._base_colour_pen) - - dc.DrawLine(border_points[0].x+1, - border_points[0].y, - border_points[5].x, - border_points[5].y) - - text_offset = tab_x + 8 - close_button_width = 0 - - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - close_button_width = self._active_close_bmp.GetWidth() - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - text_offset += close_button_width - 5 - - bitmap_offset = 0 - - if pagebitmap.IsOk(): - - bitmap_offset = tab_x + 8 - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: - bitmap_offset += close_button_width - 5 - - # draw bitmap - dc.DrawBitmap(pagebitmap, - bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2), - True) - - text_offset = bitmap_offset + pagebitmap.GetWidth() - text_offset += 3 # bitmap padding - - else: - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: - text_offset = tab_x + 8 - - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) - - ypos = drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1 - - offset_focus = text_offset - if control is not None: - if control.GetPosition() != wx.Point(text_offset+1, ypos): - control.SetPosition(wx.Point(text_offset+1, ypos)) - - if not control.IsShown(): - control.Show() - - if paint_control: - bmp = TakeScreenShot(control.GetScreenRect()) - dc.DrawBitmap(bmp, text_offset+1, ypos, True) - - controlW, controlH = control.GetSize() - text_offset += controlW + 4 - textx += controlW + 4 - - # draw tab text - rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) - dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) - - # draw focus rectangle - if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: - self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff, drawn_tab_height, rectx, recty) - - out_button_rect = wx.Rect() - - # draw close button if necessary - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - - bmp = self._disabled_close_bmp - - if close_button_state == AUI_BUTTON_STATE_HOVER: - bmp = self._hover_close_bmp - elif close_button_state == AUI_BUTTON_STATE_PRESSED: - bmp = self._pressed_close_bmp - - shift = (agwFlags & AUI_NB_BOTTOM and [1] or [0])[0] - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - rect = wx.Rect(tab_x + 4, tab_y + (tab_height - bmp.GetHeight())/2 - shift, - close_button_width, tab_height) - else: - rect = wx.Rect(tab_x + tab_width - close_button_width - 1, - tab_y + (tab_height - bmp.GetHeight())/2 - shift, - close_button_width, tab_height) - - rect = IndentPressedBitmap(rect, close_button_state) - dc.DrawBitmap(bmp, rect.x, rect.y, True) - - out_button_rect = rect - - out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) - - dc.DestroyClippingRegion() - - return out_tab_rect, out_button_rect, x_extent - - - def SetCustomButton(self, bitmap_id, button_state, bmp): - """ - Sets a custom bitmap for the close, left, right and window list - buttons. - - :param `bitmap_id`: the button identifier; - :param `button_state`: the button state; - :param `bmp`: the custom bitmap to use for the button. - """ - - if bitmap_id == AUI_BUTTON_CLOSE: - if button_state == AUI_BUTTON_STATE_NORMAL: - self._active_close_bmp = bmp - self._hover_close_bmp = self._active_close_bmp - self._pressed_close_bmp = self._active_close_bmp - self._disabled_close_bmp = self._active_close_bmp - - elif button_state == AUI_BUTTON_STATE_HOVER: - self._hover_close_bmp = bmp - elif button_state == AUI_BUTTON_STATE_PRESSED: - self._pressed_close_bmp = bmp - else: - self._disabled_close_bmp = bmp - - elif bitmap_id == AUI_BUTTON_LEFT: - if button_state & AUI_BUTTON_STATE_DISABLED: - self._disabled_left_bmp = bmp - else: - self._active_left_bmp = bmp - - elif bitmap_id == AUI_BUTTON_RIGHT: - if button_state & AUI_BUTTON_STATE_DISABLED: - self._disabled_right_bmp = bmp - else: - self._active_right_bmp = bmp - - elif bitmap_id == AUI_BUTTON_WINDOWLIST: - if button_state & AUI_BUTTON_STATE_DISABLED: - self._disabled_windowlist_bmp = bmp - else: - self._active_windowlist_bmp = bmp - - - def GetIndentSize(self): - """ Returns the tabs indent size. """ - - return 5 - - - def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): - """ - Returns the tab size for the given caption, bitmap and button state. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `caption`: the tab text caption; - :param `bitmap`: the bitmap displayed on the tab; - :param `active`: whether the tab is selected or not; - :param `close_button_state`: the state of the close button on the tab; - :param `control`: a `wx.Window` instance inside a tab (or ``None``). - """ - - dc.SetFont(self._measuring_font) - measured_textx, measured_texty, dummy = dc.GetMultiLineTextExtent(caption) - - # add padding around the text - tab_width = measured_textx - tab_height = measured_texty - - # if the close button is showing, add space for it - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - tab_width += self._active_close_bmp.GetWidth() + 3 - - # if there's a bitmap, add space for it - if bitmap.IsOk(): - tab_width += bitmap.GetWidth() - tab_width += 3 # right side bitmap padding - tab_height = max(tab_height, bitmap.GetHeight()) - - # add padding - tab_width += 16 - tab_height += 10 - - agwFlags = self.GetAGWFlags() - if agwFlags & AUI_NB_TAB_FIXED_WIDTH: - tab_width = self._fixed_tab_width - - if control is not None: - tab_width += control.GetSize().GetWidth() + 4 - - x_extent = tab_width - - return (tab_width, tab_height), x_extent - - - def DrawButton(self, dc, wnd, in_rect, button, orientation): - """ - Draws a button on the tab or on the tab area, depending on the button identifier. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `in_rect`: rectangle the tab should be confined to; - :param `button`: an instance of the button class; - :param `orientation`: the tab orientation. - """ - - bitmap_id, button_state = button.id, button.cur_state - - if bitmap_id == AUI_BUTTON_CLOSE: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_close_bmp - elif button_state & AUI_BUTTON_STATE_HOVER: - bmp = self._hover_close_bmp - elif button_state & AUI_BUTTON_STATE_PRESSED: - bmp = self._pressed_close_bmp - else: - bmp = self._active_close_bmp - - elif bitmap_id == AUI_BUTTON_LEFT: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_left_bmp - else: - bmp = self._active_left_bmp - - elif bitmap_id == AUI_BUTTON_RIGHT: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_right_bmp - else: - bmp = self._active_right_bmp - - elif bitmap_id == AUI_BUTTON_WINDOWLIST: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_windowlist_bmp - else: - bmp = self._active_windowlist_bmp - - else: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = button.dis_bitmap - else: - bmp = button.bitmap - - if not bmp.IsOk(): - return - - rect = wx.Rect(*in_rect) - - if orientation == wx.LEFT: - - rect.SetX(in_rect.x) - rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)) - rect.SetWidth(bmp.GetWidth()) - rect.SetHeight(bmp.GetHeight()) - - else: - - rect = wx.Rect(in_rect.x + in_rect.width - bmp.GetWidth(), - ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), - bmp.GetWidth(), bmp.GetHeight()) - - rect = IndentPressedBitmap(rect, button_state) - dc.DrawBitmap(bmp, rect.x, rect.y, True) - - out_rect = rect - - if bitmap_id == AUI_BUTTON_RIGHT: - self._buttonRect = wx.Rect(rect.x, rect.y, 30, rect.height) - - return out_rect - - - def DrawFocusRectangle(self, dc, page, wnd, draw_text, text_offset, bitmap_offset, drawn_tab_yoff, drawn_tab_height, textx, texty): - """ - Draws the focus rectangle on a tab. - - :param `dc`: a `wx.DC` device context; - :param `page`: the page associated with the tab; - :param `wnd`: a `wx.Window` instance object; - :param `draw_text`: the text that has been drawn on the tab; - :param `text_offset`: the text offset on the tab; - :param `bitmap_offset`: the bitmap offset on the tab; - :param `drawn_tab_yoff`: the y offset of the tab text; - :param `drawn_tab_height`: the height of the tab; - :param `textx`: the x text extent; - :param `texty`: the y text extent. - """ - - if self.GetAGWFlags() & AUI_NB_NO_TAB_FOCUS: - return - - if page.active and wx.Window.FindFocus() == wnd: - - focusRectText = wx.Rect(text_offset, (drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2)), - textx, texty) - - if page.bitmap.IsOk(): - focusRectBitmap = wx.Rect(bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), - page.bitmap.GetWidth(), page.bitmap.GetHeight()) - - if page.bitmap.IsOk() and draw_text == "": - focusRect = wx.Rect(*focusRectBitmap) - elif not page.bitmap.IsOk() and draw_text != "": - focusRect = wx.Rect(*focusRectText) - elif page.bitmap.IsOk() and draw_text != "": - focusRect = focusRectText.Union(focusRectBitmap) - - focusRect.Inflate(2, 2) - - dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.SetPen(self._focusPen) - dc.DrawRoundedRectangleRect(focusRect, 2) - - - def GetBestTabCtrlSize(self, wnd, pages, required_bmp_size): - """ - Returns the best tab control size. - - :param `wnd`: a `wx.Window` instance object; - :param `pages`: the pages associated with the tabs; - :param `required_bmp_size`: the size of the bitmap on the tabs. - """ - - dc = wx.ClientDC(wnd) - dc.SetFont(self._measuring_font) - - # sometimes a standard bitmap size needs to be enforced, especially - # if some tabs have bitmaps and others don't. This is important because - # it prevents the tab control from resizing when tabs are added. - - measure_bmp = wx.NullBitmap - - if required_bmp_size.IsFullySpecified(): - measure_bmp = wx.EmptyBitmap(required_bmp_size.x, - required_bmp_size.y) - - max_y = 0 - - for page in pages: - - if measure_bmp.IsOk(): - bmp = measure_bmp - else: - bmp = page.bitmap - - # we don't use the caption text because we don't - # want tab heights to be different in the case - # of a very short piece of text on one tab and a very - # tall piece of text on another tab - s, x_ext = self.GetTabSize(dc, wnd, page.caption, bmp, True, AUI_BUTTON_STATE_HIDDEN, None) - max_y = max(max_y, s[1]) - - if page.control: - controlW, controlH = page.control.GetSize() - max_y = max(max_y, controlH+4) - - return max_y + 2 - - - def SetNormalFont(self, font): - """ - Sets the normal font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._normal_font = font - - - def SetSelectedFont(self, font): - """ - Sets the selected tab font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._selected_font = font - - - def SetMeasuringFont(self, font): - """ - Sets the font for calculating text measurements. - - :param `font`: a `wx.Font` object. - """ - - self._measuring_font = font - - - def GetNormalFont(self): - """ Returns the normal font for drawing tab labels. """ - - return self._normal_font - - - def GetSelectedFont(self): - """ Returns the selected tab font for drawing tab labels. """ - - return self._selected_font - - - def GetMeasuringFont(self): - """ Returns the font for calculating text measurements. """ - - return self._measuring_font - - - def ShowDropDown(self, wnd, pages, active_idx): - """ - Shows the drop-down window menu on the tab area. - - :param `wnd`: a `wx.Window` derived window instance; - :param `pages`: the pages associated with the tabs; - :param `active_idx`: the active tab index. - """ - - useImages = self.GetAGWFlags() & AUI_NB_USE_IMAGES_DROPDOWN - menuPopup = wx.Menu() - - longest = 0 - for i, page in enumerate(pages): - - caption = page.caption - - # if there is no caption, make it a space. This will prevent - # an assert in the menu code. - if caption == "": - caption = " " - - # Save longest caption width for calculating menu width with - width = wnd.GetTextExtent(caption)[0] - if width > longest: - longest = width - - if useImages: - menuItem = wx.MenuItem(menuPopup, 1000+i, caption) - if page.bitmap: - menuItem.SetBitmap(page.bitmap) - - menuPopup.AppendItem(menuItem) - - else: - - menuPopup.AppendCheckItem(1000+i, caption) - - menuPopup.Enable(1000+i, page.enabled) - - if active_idx != -1 and not useImages: - - menuPopup.Check(1000+active_idx, True) - - # find out the screen coordinate at the bottom of the tab ctrl - cli_rect = wnd.GetClientRect() - - # Calculate the approximate size of the popupmenu for setting the - # position of the menu when its shown. - # Account for extra padding on left/right of text on mac menus - if wx.Platform in ['__WXMAC__', '__WXMSW__']: - longest += 32 - - # Bitmap/Checkmark width + padding - longest += 20 - - if self.GetAGWFlags() & AUI_NB_CLOSE_BUTTON: - longest += 16 - - pt = wx.Point(cli_rect.x + cli_rect.GetWidth() - longest, - cli_rect.y + cli_rect.height) - - cc = AuiCommandCapture() - wnd.PushEventHandler(cc) - wnd.PopupMenu(menuPopup, pt) - command = cc.GetCommandId() - wnd.PopEventHandler(True) - - if command >= 1000: - return command - 1000 - - return -1 - - -class AuiSimpleTabArt(object): - """ A simple-looking implementation of a tab art. """ - - def __init__(self): - """ Default class constructor. """ - - self._normal_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - self._selected_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) - self._selected_font.SetWeight(wx.BOLD) - self._measuring_font = self._selected_font - - self._agwFlags = 0 - self._fixed_tab_width = 100 - - base_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) - - background_colour = base_colour - normaltab_colour = base_colour - selectedtab_colour = wx.WHITE - - self._bkbrush = wx.Brush(background_colour) - self._normal_bkbrush = wx.Brush(normaltab_colour) - self._normal_bkpen = wx.Pen(normaltab_colour) - self._selected_bkbrush = wx.Brush(selectedtab_colour) - self._selected_bkpen = wx.Pen(selectedtab_colour) - - self._active_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.BLACK) - self._disabled_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.Colour(128, 128, 128)) - - self._active_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.BLACK) - self._disabled_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.Colour(128, 128, 128)) - - self._active_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.BLACK) - self._disabled_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.Colour(128, 128, 128)) - - self._active_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.BLACK) - self._disabled_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.Colour(128, 128, 128)) - - - def Clone(self): - """ Clones the art object. """ - - art = type(self)() - art.SetNormalFont(self.GetNormalFont()) - art.SetSelectedFont(self.GetSelectedFont()) - art.SetMeasuringFont(self.GetMeasuringFont()) - - art = CopyAttributes(art, self) - return art - - - def SetAGWFlags(self, agwFlags): - """ - Sets the tab art flags. - - :param `agwFlags`: a combination of the following values: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook - ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. - ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. - ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook - ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab - ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging - ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control - ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width - ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed - ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available - ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar - ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab - ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs - ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click - ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks - ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present - ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows - ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items - ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) - ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages - ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) - ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs - ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle - ==================================== ================================== - - """ - - self._agwFlags = agwFlags - - - def GetAGWFlags(self): - """ - Returns the tab art flags. - - :see: L{SetAGWFlags} for a list of possible return values. - """ - - return self._agwFlags - - - def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): - """ - Sets the tab sizing information. - - :param `tab_ctrl_size`: the size of the tab control area; - :param `tab_count`: the number of tabs; - :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths - to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. - """ - - self._fixed_tab_width = 100 - minTabWidth, maxTabWidth = minMaxTabWidth - - tot_width = tab_ctrl_size.x - self.GetIndentSize() - 4 - - if self._agwFlags & AUI_NB_CLOSE_BUTTON: - tot_width -= self._active_close_bmp.GetWidth() - if self._agwFlags & AUI_NB_WINDOWLIST_BUTTON: - tot_width -= self._active_windowlist_bmp.GetWidth() - - if tab_count > 0: - self._fixed_tab_width = tot_width/tab_count - - if self._fixed_tab_width < 100: - self._fixed_tab_width = 100 - - if self._fixed_tab_width > tot_width/2: - self._fixed_tab_width = tot_width/2 - - if self._fixed_tab_width > 220: - self._fixed_tab_width = 220 - - if minTabWidth > -1: - self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) - if maxTabWidth > -1: - self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) - - self._tab_ctrl_height = tab_ctrl_size.y - - - def DrawBackground(self, dc, wnd, rect): - """ - Draws the tab area background. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `rect`: the tab control rectangle. - """ - - # draw background - dc.SetBrush(self._bkbrush) - dc.SetPen(wx.TRANSPARENT_PEN) - dc.DrawRectangle(-1, -1, rect.GetWidth()+2, rect.GetHeight()+2) - - # draw base line - dc.SetPen(wx.GREY_PEN) - dc.DrawLine(0, rect.GetHeight()-1, rect.GetWidth(), rect.GetHeight()-1) - - - def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): - """ - Draws a single tab. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `page`: the tab control page associated with the tab; - :param `in_rect`: rectangle the tab should be confined to; - :param `close_button_state`: the state of the close button on the tab; - :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. - """ - - # if the caption is empty, measure some temporary text - caption = page.caption - if caption == "": - caption = "Xj" - - agwFlags = self.GetAGWFlags() - - dc.SetFont(self._selected_font) - selected_textx, selected_texty, dummy = dc.GetMultiLineTextExtent(caption) - - dc.SetFont(self._normal_font) - normal_textx, normal_texty, dummy = dc.GetMultiLineTextExtent(caption) - - control = page.control - - # figure out the size of the tab - tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, - page.active, close_button_state, control) - - tab_height = tab_size[1] - tab_width = tab_size[0] - tab_x = in_rect.x - tab_y = in_rect.y + in_rect.height - tab_height - - caption = page.caption - # select pen, brush and font for the tab to be drawn - - if page.active: - - dc.SetPen(self._selected_bkpen) - dc.SetBrush(self._selected_bkbrush) - dc.SetFont(self._selected_font) - textx = selected_textx - texty = selected_texty - - else: - - dc.SetPen(self._normal_bkpen) - dc.SetBrush(self._normal_bkbrush) - dc.SetFont(self._normal_font) - textx = normal_textx - texty = normal_texty - - if not page.enabled: - dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) - else: - dc.SetTextForeground(page.text_colour) - - # -- draw line -- - - points = [wx.Point() for i in xrange(7)] - points[0].x = tab_x - points[0].y = tab_y + tab_height - 1 - points[1].x = tab_x + tab_height - 3 - points[1].y = tab_y + 2 - points[2].x = tab_x + tab_height + 3 - points[2].y = tab_y - points[3].x = tab_x + tab_width - 2 - points[3].y = tab_y - points[4].x = tab_x + tab_width - points[4].y = tab_y + 2 - points[5].x = tab_x + tab_width - points[5].y = tab_y + tab_height - 1 - points[6] = points[0] - - dc.SetClippingRect(in_rect) - dc.DrawPolygon(points) - - dc.SetPen(wx.GREY_PEN) - dc.DrawLines(points) - - close_button_width = 0 - - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - - close_button_width = self._active_close_bmp.GetWidth() - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - if control: - text_offset = tab_x + (tab_height/2) + close_button_width - (textx/2) - 2 - else: - text_offset = tab_x + (tab_height/2) + ((tab_width+close_button_width)/2) - (textx/2) - 2 - else: - if control: - text_offset = tab_x + (tab_height/2) + close_button_width - (textx/2) - else: - text_offset = tab_x + (tab_height/2) + ((tab_width-close_button_width)/2) - (textx/2) - - else: - - text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2) - if control: - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - text_offset = tab_x + (tab_height/3) - (textx/2) + close_button_width + 2 - else: - text_offset = tab_x + (tab_height/3) - (textx/2) - - # set minimum text offset - if text_offset < tab_x + tab_height: - text_offset = tab_x + tab_height - - # chop text if necessary - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x)) - else: - draw_text = ChopText(dc, caption, - tab_width - (text_offset-tab_x) - close_button_width) - - ypos = (tab_y + tab_height)/2 - (texty/2) + 1 - - if control is not None: - if control.GetPosition() != wx.Point(text_offset+1, ypos): - control.SetPosition(wx.Point(text_offset+1, ypos)) - - if not control.IsShown(): - control.Show() - - if paint_control: - bmp = TakeScreenShot(control.GetScreenRect()) - dc.DrawBitmap(bmp, text_offset+1, ypos, True) - - controlW, controlH = control.GetSize() - text_offset += controlW + 4 - - # draw tab text - rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) - dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) - - # draw focus rectangle - if page.active and wx.Window.FindFocus() == wnd and (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: - - focusRect = wx.Rect(text_offset, ((tab_y + tab_height)/2 - (texty/2) + 1), - selected_textx, selected_texty) - - focusRect.Inflate(2, 2) - # TODO: - # This should be uncommented when DrawFocusRect will become - # available in wxPython - # wx.RendererNative.Get().DrawFocusRect(wnd, dc, focusRect, 0) - - out_button_rect = wx.Rect() - # draw close button if necessary - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - - if page.active: - bmp = self._active_close_bmp - else: - bmp = self._disabled_close_bmp - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - rect = wx.Rect(tab_x + tab_height - 2, - tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, - close_button_width, tab_height - 1) - else: - rect = wx.Rect(tab_x + tab_width - close_button_width - 1, - tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, - close_button_width, tab_height - 1) - - self.DrawButtons(dc, rect, bmp, wx.WHITE, close_button_state) - out_button_rect = wx.Rect(*rect) - - out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) - dc.DestroyClippingRegion() - - return out_tab_rect, out_button_rect, x_extent - - - def DrawButtons(self, dc, _rect, bmp, bkcolour, button_state): - """ - Convenience method to draw tab buttons. - - :param `dc`: a `wx.DC` device context; - :param `_rect`: the tab rectangle; - :param `bmp`: the tab bitmap; - :param `bkcolour`: the tab background colour; - :param `button_state`: the state of the tab button. - """ - - rect = wx.Rect(*_rect) - - if button_state == AUI_BUTTON_STATE_PRESSED: - rect.x += 1 - rect.y += 1 - - if button_state in [AUI_BUTTON_STATE_HOVER, AUI_BUTTON_STATE_PRESSED]: - dc.SetBrush(wx.Brush(StepColour(bkcolour, 120))) - dc.SetPen(wx.Pen(StepColour(bkcolour, 75))) - - # draw the background behind the button - dc.DrawRectangle(rect.x, rect.y, 15, 15) - - # draw the button itself - dc.DrawBitmap(bmp, rect.x, rect.y, True) - - - def GetIndentSize(self): - """ Returns the tabs indent size. """ - - return 0 - - - def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): - """ - Returns the tab size for the given caption, bitmap and button state. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `caption`: the tab text caption; - :param `bitmap`: the bitmap displayed on the tab; - :param `active`: whether the tab is selected or not; - :param `close_button_state`: the state of the close button on the tab; - :param `control`: a `wx.Window` instance inside a tab (or ``None``). - """ - - dc.SetFont(self._measuring_font) - measured_textx, measured_texty, dummy = dc.GetMultiLineTextExtent(caption) - - tab_height = measured_texty + 4 - tab_width = measured_textx + tab_height + 5 - - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - tab_width += self._active_close_bmp.GetWidth() - - if self._agwFlags & AUI_NB_TAB_FIXED_WIDTH: - tab_width = self._fixed_tab_width - - if control is not None: - controlW, controlH = control.GetSize() - tab_width += controlW + 4 - - x_extent = tab_width - (tab_height/2) - 1 - - return (tab_width, tab_height), x_extent - - - def DrawButton(self, dc, wnd, in_rect, button, orientation): - """ - Draws a button on the tab or on the tab area, depending on the button identifier. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `in_rect`: rectangle the tab should be confined to; - :param `button`: an instance of the button class; - :param `orientation`: the tab orientation. - """ - - bitmap_id, button_state = button.id, button.cur_state - - if bitmap_id == AUI_BUTTON_CLOSE: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_close_bmp - else: - bmp = self._active_close_bmp - - elif bitmap_id == AUI_BUTTON_LEFT: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_left_bmp - else: - bmp = self._active_left_bmp - - elif bitmap_id == AUI_BUTTON_RIGHT: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_right_bmp - else: - bmp = self._active_right_bmp - - elif bitmap_id == AUI_BUTTON_WINDOWLIST: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = self._disabled_windowlist_bmp - else: - bmp = self._active_windowlist_bmp - - else: - if button_state & AUI_BUTTON_STATE_DISABLED: - bmp = button.dis_bitmap - else: - bmp = button.bitmap - - if not bmp.IsOk(): - return - - rect = wx.Rect(*in_rect) - - if orientation == wx.LEFT: - - rect.SetX(in_rect.x) - rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)) - rect.SetWidth(bmp.GetWidth()) - rect.SetHeight(bmp.GetHeight()) - - else: - - rect = wx.Rect(in_rect.x + in_rect.width - bmp.GetWidth(), - ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), - bmp.GetWidth(), bmp.GetHeight()) - - self.DrawButtons(dc, rect, bmp, wx.WHITE, button_state) - - out_rect = wx.Rect(*rect) - return out_rect - - - def ShowDropDown(self, wnd, pages, active_idx): - """ - Shows the drop-down window menu on the tab area. - - :param `wnd`: a `wx.Window` derived window instance; - :param `pages`: the pages associated with the tabs; - :param `active_idx`: the active tab index. - """ - - menuPopup = wx.Menu() - useImages = self.GetAGWFlags() & AUI_NB_USE_IMAGES_DROPDOWN - - for i, page in enumerate(pages): - - if useImages: - menuItem = wx.MenuItem(menuPopup, 1000+i, page.caption) - if page.bitmap: - menuItem.SetBitmap(page.bitmap) - - menuPopup.AppendItem(menuItem) - - else: - - menuPopup.AppendCheckItem(1000+i, page.caption) - - menuPopup.Enable(1000+i, page.enabled) - - if active_idx != -1 and not useImages: - menuPopup.Check(1000+active_idx, True) - - # find out where to put the popup menu of window - # items. Subtract 100 for now to center the menu - # a bit, until a better mechanism can be implemented - pt = wx.GetMousePosition() - pt = wnd.ScreenToClient(pt) - - if pt.x < 100: - pt.x = 0 - else: - pt.x -= 100 - - # find out the screen coordinate at the bottom of the tab ctrl - cli_rect = wnd.GetClientRect() - pt.y = cli_rect.y + cli_rect.height - - cc = AuiCommandCapture() - wnd.PushEventHandler(cc) - wnd.PopupMenu(menuPopup, pt) - command = cc.GetCommandId() - wnd.PopEventHandler(True) - - if command >= 1000: - return command-1000 - - return -1 - - - def GetBestTabCtrlSize(self, wnd, pages, required_bmp_size): - """ - Returns the best tab control size. - - :param `wnd`: a `wx.Window` instance object; - :param `pages`: the pages associated with the tabs; - :param `required_bmp_size`: the size of the bitmap on the tabs. - """ - - dc = wx.ClientDC(wnd) - dc.SetFont(self._measuring_font) - s, x_extent = self.GetTabSize(dc, wnd, "ABCDEFGHIj", wx.NullBitmap, True, - AUI_BUTTON_STATE_HIDDEN, None) - - max_y = s[1] - - for page in pages: - if page.control: - controlW, controlH = page.control.GetSize() - max_y = max(max_y, controlH+4) - - textx, texty, dummy = dc.GetMultiLineTextExtent(page.caption) - max_y = max(max_y, texty) - - return max_y + 3 - - - def SetNormalFont(self, font): - """ - Sets the normal font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._normal_font = font - - - def SetSelectedFont(self, font): - """ - Sets the selected tab font for drawing tab labels. - - :param `font`: a `wx.Font` object. - """ - - self._selected_font = font - - - def SetMeasuringFont(self, font): - """ - Sets the font for calculating text measurements. - - :param `font`: a `wx.Font` object. - """ - - self._measuring_font = font - - - def GetNormalFont(self): - """ Returns the normal font for drawing tab labels. """ - - return self._normal_font - - - def GetSelectedFont(self): - """ Returns the selected tab font for drawing tab labels. """ - - return self._selected_font - - - def GetMeasuringFont(self): - """ Returns the font for calculating text measurements. """ - - return self._measuring_font - - - def SetCustomButton(self, bitmap_id, button_state, bmp): - """ - Sets a custom bitmap for the close, left, right and window list - buttons. - - :param `bitmap_id`: the button identifier; - :param `button_state`: the button state; - :param `bmp`: the custom bitmap to use for the button. - """ - - if bitmap_id == AUI_BUTTON_CLOSE: - if button_state == AUI_BUTTON_STATE_NORMAL: - self._active_close_bmp = bmp - self._hover_close_bmp = self._active_close_bmp - self._pressed_close_bmp = self._active_close_bmp - self._disabled_close_bmp = self._active_close_bmp - - elif button_state == AUI_BUTTON_STATE_HOVER: - self._hover_close_bmp = bmp - elif button_state == AUI_BUTTON_STATE_PRESSED: - self._pressed_close_bmp = bmp - else: - self._disabled_close_bmp = bmp - - elif bitmap_id == AUI_BUTTON_LEFT: - if button_state & AUI_BUTTON_STATE_DISABLED: - self._disabled_left_bmp = bmp - else: - self._active_left_bmp = bmp - - elif bitmap_id == AUI_BUTTON_RIGHT: - if button_state & AUI_BUTTON_STATE_DISABLED: - self._disabled_right_bmp = bmp - else: - self._active_right_bmp = bmp - - elif bitmap_id == AUI_BUTTON_WINDOWLIST: - if button_state & AUI_BUTTON_STATE_DISABLED: - self._disabled_windowlist_bmp = bmp - else: - self._active_windowlist_bmp = bmp - - -class VC71TabArt(AuiDefaultTabArt): - """ A class to draw tabs using the Visual Studio 2003 (VC71) style. """ - - def __init__(self): - """ Default class constructor. """ - - AuiDefaultTabArt.__init__(self) - - - def Clone(self): - """ Clones the art object. """ - - art = type(self)() - art.SetNormalFont(self.GetNormalFont()) - art.SetSelectedFont(self.GetSelectedFont()) - art.SetMeasuringFont(self.GetMeasuringFont()) - - art = CopyAttributes(art, self) - return art - - - def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): - """ - Draws a single tab. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `page`: the tab control page associated with the tab; - :param `in_rect`: rectangle the tab should be confined to; - :param `close_button_state`: the state of the close button on the tab; - :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. - """ - - # Visual studio 7.1 style - # This code is based on the renderer included in FlatNotebook - - # figure out the size of the tab - - control = page.control - tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, - close_button_state, control) - - tab_height = self._tab_ctrl_height - 3 - tab_width = tab_size[0] - tab_x = in_rect.x - tab_y = in_rect.y + in_rect.height - tab_height - clip_width = tab_width - - if tab_x + clip_width > in_rect.x + in_rect.width - 4: - clip_width = (in_rect.x + in_rect.width) - tab_x - 4 - - dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3) - agwFlags = self.GetAGWFlags() - - if agwFlags & AUI_NB_BOTTOM: - tab_y -= 1 - - dc.SetPen((page.active and [wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DHIGHLIGHT))] or \ - [wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW))])[0]) - dc.SetBrush((page.active and [wx.Brush(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE))] or \ - [wx.TRANSPARENT_BRUSH])[0]) - - if page.active: - - tabH = tab_height - 2 - dc.DrawRectangle(tab_x, tab_y, tab_width, tabH) - - rightLineY1 = (agwFlags & AUI_NB_BOTTOM and [vertical_border_padding - 2] or \ - [vertical_border_padding - 1])[0] - rightLineY2 = tabH + 3 - dc.SetPen(wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW))) - dc.DrawLine(tab_x + tab_width - 1, rightLineY1 + 1, tab_x + tab_width - 1, rightLineY2) - - if agwFlags & AUI_NB_BOTTOM: - dc.DrawLine(tab_x + 1, rightLineY2 - 3 , tab_x + tab_width - 1, rightLineY2 - 3) - - dc.SetPen(wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW))) - dc.DrawLine(tab_x + tab_width, rightLineY1, tab_x + tab_width, rightLineY2) - - if agwFlags & AUI_NB_BOTTOM: - dc.DrawLine(tab_x, rightLineY2 - 2, tab_x + tab_width, rightLineY2 - 2) - - else: - - # We dont draw a rectangle for non selected tabs, but only - # vertical line on the right - blackLineY1 = (agwFlags & AUI_NB_BOTTOM and [vertical_border_padding + 2] or \ - [vertical_border_padding + 1])[0] - blackLineY2 = tab_height - 5 - dc.DrawLine(tab_x + tab_width, blackLineY1, tab_x + tab_width, blackLineY2) - - border_points = [0, 0] - - if agwFlags & AUI_NB_BOTTOM: - - border_points[0] = wx.Point(tab_x, tab_y) - border_points[1] = wx.Point(tab_x, tab_y + tab_height - 6) - - else: # if (agwFlags & AUI_NB_TOP) - - border_points[0] = wx.Point(tab_x, tab_y + tab_height - 4) - border_points[1] = wx.Point(tab_x, tab_y + 2) - - drawn_tab_yoff = border_points[1].y - drawn_tab_height = border_points[0].y - border_points[1].y - - text_offset = tab_x + 8 - close_button_width = 0 - - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - close_button_width = self._active_close_bmp.GetWidth() - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - text_offset += close_button_width - 5 - - if not page.enabled: - dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) - pagebitmap = page.dis_bitmap - else: - dc.SetTextForeground(page.text_colour) - pagebitmap = page.bitmap - - shift = 0 - if agwFlags & AUI_NB_BOTTOM: - shift = (page.active and [1] or [2])[0] - - bitmap_offset = 0 - if pagebitmap.IsOk(): - bitmap_offset = tab_x + 8 - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: - bitmap_offset += close_button_width - 5 - - # draw bitmap - dc.DrawBitmap(pagebitmap, bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2) + shift, - True) - - text_offset = bitmap_offset + pagebitmap.GetWidth() - text_offset += 3 # bitmap padding - - else: - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: - text_offset = tab_x + 8 - - # if the caption is empty, measure some temporary text - caption = page.caption - - if caption == "": - caption = "Xj" - - if page.active: - dc.SetFont(self._selected_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - else: - dc.SetFont(self._normal_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) - - ypos = drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1 + shift - - offset_focus = text_offset - - if control is not None: - if control.GetPosition() != wx.Point(text_offset+1, ypos): - control.SetPosition(wx.Point(text_offset+1, ypos)) - - if not control.IsShown(): - control.Show() - - if paint_control: - bmp = TakeScreenShot(control.GetScreenRect()) - dc.DrawBitmap(bmp, text_offset+1, ypos, True) - - controlW, controlH = control.GetSize() - text_offset += controlW + 4 - textx += controlW + 4 - - # draw tab text - rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) - dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) - - out_button_rect = wx.Rect() - - # draw focus rectangle - if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: - self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff+shift, - drawn_tab_height+shift, rectx, recty) - - # draw 'x' on tab (if enabled) - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - close_button_width = self._active_close_bmp.GetWidth() - - bmp = self._disabled_close_bmp - - if close_button_state == AUI_BUTTON_STATE_HOVER: - bmp = self._hover_close_bmp - elif close_button_state == AUI_BUTTON_STATE_PRESSED: - bmp = self._pressed_close_bmp - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - rect = wx.Rect(tab_x + 4, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, - close_button_width, tab_height) - else: - rect = wx.Rect(tab_x + tab_width - close_button_width - 3, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, - close_button_width, tab_height) - - # Indent the button if it is pressed down: - rect = IndentPressedBitmap(rect, close_button_state) - dc.DrawBitmap(bmp, rect.x, rect.y, True) - - out_button_rect = rect - - out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) - dc.DestroyClippingRegion() - - return out_tab_rect, out_button_rect, x_extent - - -class FF2TabArt(AuiDefaultTabArt): - """ A class to draw tabs using the Firefox 2 (FF2) style. """ - - def __init__(self): - """ Default class constructor. """ - - AuiDefaultTabArt.__init__(self) - - - def Clone(self): - """ Clones the art object. """ - - art = type(self)() - art.SetNormalFont(self.GetNormalFont()) - art.SetSelectedFont(self.GetSelectedFont()) - art.SetMeasuringFont(self.GetMeasuringFont()) - - art = CopyAttributes(art, self) - return art - - - def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control): - """ - Returns the tab size for the given caption, bitmap and button state. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `caption`: the tab text caption; - :param `bitmap`: the bitmap displayed on the tab; - :param `active`: whether the tab is selected or not; - :param `close_button_state`: the state of the close button on the tab; - :param `control`: a `wx.Window` instance inside a tab (or ``None``). - """ - - tab_size, x_extent = AuiDefaultTabArt.GetTabSize(self, dc, wnd, caption, bitmap, - active, close_button_state, control) - - tab_width, tab_height = tab_size - - # add some vertical padding - tab_height += 2 - - return (tab_width, tab_height), x_extent - - - def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): - """ - Draws a single tab. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `page`: the tab control page associated with the tab; - :param `in_rect`: rectangle the tab should be confined to; - :param `close_button_state`: the state of the close button on the tab; - :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. - """ - - # Firefox 2 style - - control = page.control - - # figure out the size of the tab - tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, - page.active, close_button_state, control) - - tab_height = self._tab_ctrl_height - 2 - tab_width = tab_size[0] - tab_x = in_rect.x - tab_y = in_rect.y + in_rect.height - tab_height - - clip_width = tab_width - if tab_x + clip_width > in_rect.x + in_rect.width - 4: - clip_width = (in_rect.x + in_rect.width) - tab_x - 4 - - dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3) - - tabPoints = [wx.Point() for i in xrange(7)] - - adjust = 0 - if not page.active: - adjust = 1 - - agwFlags = self.GetAGWFlags() - - tabPoints[0].x = tab_x + 3 - tabPoints[0].y = (agwFlags & AUI_NB_BOTTOM and [3] or [tab_height - 2])[0] - - tabPoints[1].x = tabPoints[0].x - tabPoints[1].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - (vertical_border_padding + 2) - adjust] or \ - [(vertical_border_padding + 2) + adjust])[0] - - tabPoints[2].x = tabPoints[1].x+2 - tabPoints[2].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - vertical_border_padding - adjust] or \ - [vertical_border_padding + adjust])[0] - - tabPoints[3].x = tab_x + tab_width - 2 - tabPoints[3].y = tabPoints[2].y - - tabPoints[4].x = tabPoints[3].x + 2 - tabPoints[4].y = tabPoints[1].y - - tabPoints[5].x = tabPoints[4].x - tabPoints[5].y = tabPoints[0].y - - tabPoints[6].x = tabPoints[0].x - tabPoints[6].y = tabPoints[0].y - - rr = wx.RectPP(tabPoints[2], tabPoints[5]) - self.DrawTabBackground(dc, rr, page.active, (agwFlags & AUI_NB_BOTTOM) == 0) - - dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW))) - - # Draw the tab as rounded rectangle - dc.DrawPolygon(tabPoints) - - if page.active: - dc.DrawLine(tabPoints[0].x + 1, tabPoints[0].y, tabPoints[5].x , tabPoints[0].y) - - drawn_tab_yoff = tabPoints[1].y - drawn_tab_height = tabPoints[0].y - tabPoints[2].y - - text_offset = tab_x + 8 - close_button_width = 0 - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - close_button_width = self._active_close_bmp.GetWidth() - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - text_offset += close_button_width - 4 - - if not page.enabled: - dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) - pagebitmap = page.dis_bitmap - else: - dc.SetTextForeground(page.text_colour) - pagebitmap = page.bitmap - - shift = -1 - if agwFlags & AUI_NB_BOTTOM: - shift = 2 - - bitmap_offset = 0 - if pagebitmap.IsOk(): - bitmap_offset = tab_x + 8 - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: - bitmap_offset += close_button_width - 4 - - # draw bitmap - dc.DrawBitmap(pagebitmap, bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2) + shift, - True) - - text_offset = bitmap_offset + pagebitmap.GetWidth() - text_offset += 3 # bitmap padding - - else: - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: - text_offset = tab_x + 8 - - # if the caption is empty, measure some temporary text - caption = page.caption - if caption == "": - caption = "Xj" - - if page.active: - dc.SetFont(self._selected_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - else: - dc.SetFont(self._normal_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width + 1) - else: - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) - - ypos = drawn_tab_yoff + drawn_tab_height/2 - texty/2 - 1 + shift - - offset_focus = text_offset - - if control is not None: - if control.GetPosition() != wx.Point(text_offset+1, ypos): - control.SetPosition(wx.Point(text_offset+1, ypos)) - - if not control.IsShown(): - control.Show() - - if paint_control: - bmp = TakeScreenShot(control.GetScreenRect()) - dc.DrawBitmap(bmp, text_offset+1, ypos, True) - - controlW, controlH = control.GetSize() - text_offset += controlW + 4 - textx += controlW + 4 - - # draw tab text - rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) - dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) - - # draw focus rectangle - if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: - self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff+shift, - drawn_tab_height, rectx, recty) - - out_button_rect = wx.Rect() - # draw 'x' on tab (if enabled) - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - - close_button_width = self._active_close_bmp.GetWidth() - bmp = self._disabled_close_bmp - - if close_button_state == AUI_BUTTON_STATE_HOVER: - bmp = self._hover_close_bmp - elif close_button_state == AUI_BUTTON_STATE_PRESSED: - bmp = self._pressed_close_bmp - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - rect = wx.Rect(tab_x + 5, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, - close_button_width, tab_height) - else: - rect = wx.Rect(tab_x + tab_width - close_button_width - 3, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, - close_button_width, tab_height) - - # Indent the button if it is pressed down: - rect = IndentPressedBitmap(rect, close_button_state) - dc.DrawBitmap(bmp, rect.x, rect.y, True) - out_button_rect = rect - - out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) - dc.DestroyClippingRegion() - - return out_tab_rect, out_button_rect, x_extent - - - def DrawTabBackground(self, dc, rect, focus, upperTabs): - """ - Draws the tab background for the Firefox 2 style. - This is more consistent with L{FlatNotebook} than before. - - :param `dc`: a `wx.DC` device context; - :param `rect`: rectangle the tab should be confined to; - :param `focus`: whether the tab has focus or not; - :param `upperTabs`: whether the style is ``AUI_NB_TOP`` or ``AUI_NB_BOTTOM``. - """ - - # Define the rounded rectangle base on the given rect - # we need an array of 9 points for it - regPts = [wx.Point() for indx in xrange(9)] - - if focus: - if upperTabs: - leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*8) - rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*8) - else: - leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*5) - rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*5) - else: - leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) - rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 2)) - - # Define the top region - top = wx.RectPP(rect.GetTopLeft(), rightPt) - bottom = wx.RectPP(leftPt, rect.GetBottomRight()) - - topStartColour = wx.WHITE - - if not focus: - topStartColour = LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 50) - - topEndColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) - bottomStartColour = topEndColour - bottomEndColour = topEndColour - - # Incase we use bottom tabs, switch the colours - if upperTabs: - if focus: - dc.GradientFillLinear(top, topStartColour, topEndColour, wx.SOUTH) - dc.GradientFillLinear(bottom, bottomStartColour, bottomEndColour, wx.SOUTH) - else: - dc.GradientFillLinear(top, topEndColour , topStartColour, wx.SOUTH) - dc.GradientFillLinear(bottom, bottomStartColour, bottomEndColour, wx.SOUTH) - - else: - if focus: - dc.GradientFillLinear(bottom, topEndColour, bottomEndColour, wx.SOUTH) - dc.GradientFillLinear(top, topStartColour, topStartColour, wx.SOUTH) - else: - dc.GradientFillLinear(bottom, bottomStartColour, bottomEndColour, wx.SOUTH) - dc.GradientFillLinear(top, topEndColour, topStartColour, wx.SOUTH) - - dc.SetBrush(wx.TRANSPARENT_BRUSH) - - -class VC8TabArt(AuiDefaultTabArt): - """ A class to draw tabs using the Visual Studio 2005 (VC8) style. """ - - def __init__(self): - """ Default class constructor. """ - - AuiDefaultTabArt.__init__(self) - - - def Clone(self): - """ Clones the art object. """ - - art = type(self)() - art.SetNormalFont(self.GetNormalFont()) - art.SetSelectedFont(self.GetSelectedFont()) - art.SetMeasuringFont(self.GetMeasuringFont()) - - art = CopyAttributes(art, self) - return art - - - def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): - """ - Sets the tab sizing information. - - :param `tab_ctrl_size`: the size of the tab control area; - :param `tab_count`: the number of tabs; - :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths - to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. - """ - - AuiDefaultTabArt.SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth) - - minTabWidth, maxTabWidth = minMaxTabWidth - if minTabWidth > -1: - self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) - if maxTabWidth > -1: - self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) - - self._fixed_tab_width -= 5 - - - def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): - """ - Returns the tab size for the given caption, bitmap and button state. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `caption`: the tab text caption; - :param `bitmap`: the bitmap displayed on the tab; - :param `active`: whether the tab is selected or not; - :param `close_button_state`: the state of the close button on the tab; - :param `control`: a `wx.Window` instance inside a tab (or ``None``). - """ - - tab_size, x_extent = AuiDefaultTabArt.GetTabSize(self, dc, wnd, caption, bitmap, - active, close_button_state, control) - - tab_width, tab_height = tab_size - - # add some padding - tab_width += 10 - tab_height += 2 - - return (tab_width, tab_height), x_extent - - - def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): - """ - Draws a single tab. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `page`: the tab control page associated with the tab; - :param `in_rect`: rectangle the tab should be confined to; - :param `close_button_state`: the state of the close button on the tab; - :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. - """ - - # Visual Studio 8 style - - control = page.control - - # figure out the size of the tab - tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, - page.active, close_button_state, control) - - tab_height = self._tab_ctrl_height - 1 - tab_width = tab_size[0] - tab_x = in_rect.x - tab_y = in_rect.y + in_rect.height - tab_height - - clip_width = tab_width + 3 - if tab_x + clip_width > in_rect.x + in_rect.width - 4: - clip_width = (in_rect.x + in_rect.width) - tab_x - 4 - - tabPoints = [wx.Point() for i in xrange(8)] - - # If we draw the first tab or the active tab, - # we draw a full tab, else we draw a truncated tab - # - # X(2) X(3) - # X(1) X(4) - # - # X(5) - # - # X(0),(7) X(6) - # - # - - adjust = 0 - if not page.active: - adjust = 1 - - agwFlags = self.GetAGWFlags() - tabPoints[0].x = (agwFlags & AUI_NB_BOTTOM and [tab_x] or [tab_x + adjust])[0] - tabPoints[0].y = (agwFlags & AUI_NB_BOTTOM and [2] or [tab_height - 3])[0] - - tabPoints[1].x = tabPoints[0].x + tab_height - vertical_border_padding - 3 - adjust - tabPoints[1].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - (vertical_border_padding+2)] or \ - [(vertical_border_padding+2)])[0] - - tabPoints[2].x = tabPoints[1].x + 4 - tabPoints[2].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - vertical_border_padding] or \ - [vertical_border_padding])[0] - - tabPoints[3].x = tabPoints[2].x + tab_width - tab_height + vertical_border_padding - tabPoints[3].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - vertical_border_padding] or \ - [vertical_border_padding])[0] - - tabPoints[4].x = tabPoints[3].x + 1 - tabPoints[4].y = (agwFlags & AUI_NB_BOTTOM and [tabPoints[3].y - 1] or [tabPoints[3].y + 1])[0] - - tabPoints[5].x = tabPoints[4].x + 1 - tabPoints[5].y = (agwFlags & AUI_NB_BOTTOM and [(tabPoints[4].y - 1)] or [tabPoints[4].y + 1])[0] - - tabPoints[6].x = tabPoints[2].x + tab_width - tab_height + 2 + vertical_border_padding - tabPoints[6].y = tabPoints[0].y - - tabPoints[7].x = tabPoints[0].x - tabPoints[7].y = tabPoints[0].y - - self.FillVC8GradientColour(dc, tabPoints, page.active) - - dc.SetBrush(wx.TRANSPARENT_BRUSH) - - dc.SetPen(wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNSHADOW))) - dc.DrawPolygon(tabPoints) - - if page.active: - # Delete the bottom line (or the upper one, incase we use wxBOTTOM) - dc.SetPen(wx.WHITE_PEN) - dc.DrawLine(tabPoints[0].x, tabPoints[0].y, tabPoints[6].x, tabPoints[6].y) - - dc.SetClippingRegion(tab_x, tab_y, clip_width + 2, tab_height - 3) - - drawn_tab_yoff = tabPoints[1].y - drawn_tab_height = tabPoints[0].y - tabPoints[2].y - - text_offset = tab_x + 20 - close_button_width = 0 - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - close_button_width = self._active_close_bmp.GetWidth() - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - text_offset += close_button_width - - if not page.enabled: - dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) - pagebitmap = page.dis_bitmap - else: - dc.SetTextForeground(page.text_colour) - pagebitmap = page.bitmap - - shift = 0 - if agwFlags & AUI_NB_BOTTOM: - shift = (page.active and [1] or [2])[0] - - bitmap_offset = 0 - if pagebitmap.IsOk(): - bitmap_offset = tab_x + 20 - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: - bitmap_offset += close_button_width - - # draw bitmap - dc.DrawBitmap(pagebitmap, bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2) + shift, - True) - - text_offset = bitmap_offset + pagebitmap.GetWidth() - text_offset += 3 # bitmap padding - - else: - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: - text_offset = tab_x + tab_height - - # if the caption is empty, measure some temporary text - caption = page.caption - if caption == "": - caption = "Xj" - - if page.active: - dc.SetFont(self._selected_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - else: - dc.SetFont(self._normal_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x)) - else: - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) - - ypos = drawn_tab_yoff + drawn_tab_height/2 - texty/2 - 1 + shift - - offset_focus = text_offset - - if control is not None: - if control.GetPosition() != wx.Point(text_offset+1, ypos): - control.SetPosition(wx.Point(text_offset+1, ypos)) - - if not control.IsShown(): - control.Show() - - if paint_control: - bmp = TakeScreenShot(control.GetScreenRect()) - dc.DrawBitmap(bmp, text_offset+1, ypos, True) - - controlW, controlH = control.GetSize() - text_offset += controlW + 4 - textx += controlW + 4 - - # draw tab text - rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) - dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) - - # draw focus rectangle - if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: - self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff+shift, - drawn_tab_height+shift, rectx, recty) - - out_button_rect = wx.Rect() - # draw 'x' on tab (if enabled) - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - - close_button_width = self._active_close_bmp.GetWidth() - bmp = self._disabled_close_bmp - - if close_button_state == AUI_BUTTON_STATE_HOVER: - bmp = self._hover_close_bmp - elif close_button_state == AUI_BUTTON_STATE_PRESSED: - bmp = self._pressed_close_bmp - - if page.active: - xpos = tab_x + tab_width - close_button_width + 3 - else: - xpos = tab_x + tab_width - close_button_width - 5 - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - rect = wx.Rect(tab_x + 20, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, - close_button_width, tab_height) - else: - rect = wx.Rect(xpos, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, - close_button_width, tab_height) - - # Indent the button if it is pressed down: - rect = IndentPressedBitmap(rect, close_button_state) - dc.DrawBitmap(bmp, rect.x, rect.y, True) - out_button_rect = rect - - out_tab_rect = wx.Rect(tab_x, tab_y, x_extent, tab_height) - dc.DestroyClippingRegion() - - return out_tab_rect, out_button_rect, x_extent - - - def FillVC8GradientColour(self, dc, tabPoints, active): - """ - Fills the tab with the Visual Studio 2005 gradient background. - - :param `dc`: a `wx.DC` device context; - :param `tabPoints`: a list of `wx.Point` objects describing the tab shape; - :param `active`: whether the tab is selected or not. - """ - - xList = [pt.x for pt in tabPoints] - yList = [pt.y for pt in tabPoints] - - minx, maxx = min(xList), max(xList) - miny, maxy = min(yList), max(yList) - - rect = wx.Rect(minx, maxy, maxx-minx, miny-maxy+1) - region = wx.RegionFromPoints(tabPoints) - - if self._buttonRect.width > 0: - buttonRegion = wx.Region(*self._buttonRect) - region.XorRegion(buttonRegion) - - dc.SetClippingRegionAsRegion(region) - - if active: - bottom_colour = top_colour = wx.WHITE - else: - bottom_colour = StepColour(self._base_colour, 90) - top_colour = StepColour(self._base_colour, 170) - - dc.GradientFillLinear(rect, top_colour, bottom_colour, wx.SOUTH) - dc.DestroyClippingRegion() - - -class ChromeTabArt(AuiDefaultTabArt): - """ - A class to draw tabs using the Google Chrome browser style. - It uses custom bitmap to render the tabs, so that the look and feel is as close - as possible to the Chrome style. - """ - - def __init__(self): - """ Default class constructor. """ - - AuiDefaultTabArt.__init__(self) - - self.SetBitmaps(mirror=False) - - closeBmp = tab_close.GetBitmap() - closeHBmp = tab_close_h.GetBitmap() - closePBmp = tab_close_p.GetBitmap() - - self.SetCustomButton(AUI_BUTTON_CLOSE, AUI_BUTTON_STATE_NORMAL, closeBmp) - self.SetCustomButton(AUI_BUTTON_CLOSE, AUI_BUTTON_STATE_HOVER, closeHBmp) - self.SetCustomButton(AUI_BUTTON_CLOSE, AUI_BUTTON_STATE_PRESSED, closePBmp) - - - def SetAGWFlags(self, agwFlags): - """ - Sets the tab art flags. - - :param `agwFlags`: a combination of the following values: - - ==================================== ================================== - Flag name Description - ==================================== ================================== - ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook - ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. - ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. - ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook - ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab - ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging - ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control - ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width - ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed - ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available - ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar - ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab - ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs - ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click - ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks - ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present - ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows - ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items - ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) - ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages - ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) - ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs - ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle - ==================================== ================================== - - :note: Overridden from L{AuiDefaultTabArt}. - """ - - if agwFlags & AUI_NB_TOP: - self.SetBitmaps(mirror=False) - elif agwFlags & AUI_NB_BOTTOM: - self.SetBitmaps(mirror=True) - - AuiDefaultTabArt.SetAGWFlags(self, agwFlags) - - - def SetBitmaps(self, mirror): - """ - Assigns the tab custom bitmaps - - :param `mirror`: whether to vertically mirror the bitmap or not. - """ - - bmps = [tab_active_left.GetBitmap(), tab_active_center.GetBitmap(), - tab_active_right.GetBitmap(), tab_inactive_left.GetBitmap(), - tab_inactive_center.GetBitmap(), tab_inactive_right.GetBitmap()] - - if mirror: - for indx, bmp in enumerate(bmps): - img = bmp.ConvertToImage() - img = img.Mirror(horizontally=False) - bmps[indx] = img.ConvertToBitmap() - - self._leftActiveBmp = bmps[0] - self._centerActiveBmp = bmps[1] - self._rightActiveBmp = bmps[2] - self._leftInactiveBmp = bmps[3] - self._centerInactiveBmp = bmps[4] - self._rightInactiveBmp = bmps[5] - - - def Clone(self): - """ Clones the art object. """ - - art = type(self)() - art.SetNormalFont(self.GetNormalFont()) - art.SetSelectedFont(self.GetSelectedFont()) - art.SetMeasuringFont(self.GetMeasuringFont()) - - art = CopyAttributes(art, self) - return art - - - def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): - """ - Sets the tab sizing information. - - :param `tab_ctrl_size`: the size of the tab control area; - :param `tab_count`: the number of tabs; - :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths - to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. - """ - - AuiDefaultTabArt.SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth) - - minTabWidth, maxTabWidth = minMaxTabWidth - if minTabWidth > -1: - self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) - if maxTabWidth > -1: - self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) - - self._fixed_tab_width -= 5 - - - def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): - """ - Returns the tab size for the given caption, bitmap and button state. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `caption`: the tab text caption; - :param `bitmap`: the bitmap displayed on the tab; - :param `active`: whether the tab is selected or not; - :param `close_button_state`: the state of the close button on the tab; - :param `control`: a `wx.Window` instance inside a tab (or ``None``). - """ - - tab_size, x_extent = AuiDefaultTabArt.GetTabSize(self, dc, wnd, caption, bitmap, - active, close_button_state, control) - - tab_width, tab_height = tab_size - - # add some padding - tab_width += self._leftActiveBmp.GetWidth() - tab_height += 2 - - tab_height = max(tab_height, self._centerActiveBmp.GetHeight()) - - return (tab_width, tab_height), x_extent - - - def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): - """ - Draws a single tab. - - :param `dc`: a `wx.DC` device context; - :param `wnd`: a `wx.Window` instance object; - :param `page`: the tab control page associated with the tab; - :param `in_rect`: rectangle the tab should be confined to; - :param `close_button_state`: the state of the close button on the tab; - :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. - """ - - # Chrome tab style - - control = page.control - # figure out the size of the tab - tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, - close_button_state, control) - - agwFlags = self.GetAGWFlags() - - tab_height = self._tab_ctrl_height - 1 - tab_width = tab_size[0] - tab_x = in_rect.x - tab_y = in_rect.y + in_rect.height - tab_height - clip_width = tab_width - - if tab_x + clip_width > in_rect.x + in_rect.width - 4: - clip_width = (in_rect.x + in_rect.width) - tab_x - 4 - - dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3) - drawn_tab_yoff = 1 - - if page.active: - left = self._leftActiveBmp - center = self._centerActiveBmp - right = self._rightActiveBmp - else: - left = self._leftInactiveBmp - center = self._centerInactiveBmp - right = self._rightInactiveBmp - - dc.DrawBitmap(left, tab_x, tab_y) - leftw = left.GetWidth() - centerw = center.GetWidth() - rightw = right.GetWidth() - - available = tab_x + tab_width - rightw - posx = tab_x + leftw - - while 1: - if posx >= available: - break - dc.DrawBitmap(center, posx, tab_y) - posx += centerw - - dc.DrawBitmap(right, posx, tab_y) - - drawn_tab_height = center.GetHeight() - text_offset = tab_x + leftw - - close_button_width = 0 - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - close_button_width = self._active_close_bmp.GetWidth() - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - text_offset += close_button_width - - if not page.enabled: - dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) - pagebitmap = page.dis_bitmap - else: - dc.SetTextForeground(page.text_colour) - pagebitmap = page.bitmap - - bitmap_offset = 0 - if pagebitmap.IsOk(): - bitmap_offset = tab_x + leftw - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: - bitmap_offset += close_button_width - - # draw bitmap - dc.DrawBitmap(pagebitmap, bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2), - True) - - text_offset = bitmap_offset + pagebitmap.GetWidth() - text_offset += 3 # bitmap padding - - else: - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: - text_offset = tab_x + leftw - - # if the caption is empty, measure some temporary text - caption = page.caption - if caption == "": - caption = "Xj" - - if page.active: - dc.SetFont(self._selected_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - else: - dc.SetFont(self._normal_font) - textx, texty, dummy = dc.GetMultiLineTextExtent(caption) - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - leftw) - else: - draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width - leftw) - - ypos = drawn_tab_yoff + drawn_tab_height/2 - texty/2 - 1 - - if control is not None: - if control.GetPosition() != wx.Point(text_offset+1, ypos): - control.SetPosition(wx.Point(text_offset+1, ypos)) - - if not control.IsShown(): - control.Show() - - if paint_control: - bmp = TakeScreenShot(control.GetScreenRect()) - dc.DrawBitmap(bmp, text_offset+1, ypos, True) - - controlW, controlH = control.GetSize() - text_offset += controlW + 4 - - # draw tab text - rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) - dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) - - out_button_rect = wx.Rect() - # draw 'x' on tab (if enabled) - if close_button_state != AUI_BUTTON_STATE_HIDDEN: - - close_button_width = self._active_close_bmp.GetWidth() - bmp = self._disabled_close_bmp - - if close_button_state == AUI_BUTTON_STATE_HOVER: - bmp = self._hover_close_bmp - elif close_button_state == AUI_BUTTON_STATE_PRESSED: - bmp = self._pressed_close_bmp - - if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: - rect = wx.Rect(tab_x + leftw - 2, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + 1, - close_button_width, tab_height) - else: - rect = wx.Rect(tab_x + tab_width - close_button_width - rightw + 2, - drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + 1, - close_button_width, tab_height) - - if agwFlags & AUI_NB_BOTTOM: - rect.y -= 1 - - # Indent the button if it is pressed down: - rect = IndentPressedBitmap(rect, close_button_state) - dc.DrawBitmap(bmp, rect.x, rect.y, True) - out_button_rect = rect - - out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) - dc.DestroyClippingRegion() - - return out_tab_rect, out_button_rect, x_extent - - diff --git a/aui/tabmdi.py b/aui/tabmdi.py deleted file mode 100644 index ef09e9f..0000000 --- a/aui/tabmdi.py +++ /dev/null @@ -1,666 +0,0 @@ -__author__ = "Andrea Gavana " -__date__ = "31 March 2009" - - -import wx - -import auibook -from aui_constants import * - -_ = wx.GetTranslation - -#----------------------------------------------------------------------------- -# AuiMDIParentFrame -#----------------------------------------------------------------------------- - -class AuiMDIParentFrame(wx.Frame): - - def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, - size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE|wx.VSCROLL|wx.HSCROLL, - name="AuiMDIParentFrame"): - - wx.Frame.__init__(self, parent, id, title, pos, size, style, name=name) - self.Init() - - self.Bind(wx.EVT_MENU, self.DoHandleMenu, id=wx.ID_ANY) - - # this style can be used to prevent a window from having the standard MDI - # "Window" menu - if not style & wx.FRAME_NO_WINDOW_MENU: - - self._pWindowMenu = wx.Menu() - self._pWindowMenu.Append(wxWINDOWCLOSE, _("Cl&ose")) - self._pWindowMenu.Append(wxWINDOWCLOSEALL, _("Close All")) - self._pWindowMenu.AppendSeparator() - self._pWindowMenu.Append(wxWINDOWNEXT, _("&Next")) - self._pWindowMenu.Append(wxWINDOWPREV, _("&Previous")) - - self._pClientWindow = self.OnCreateClient() - - - def SetArtProvider(self, provider): - - if self._pClientWindow: - self._pClientWindow.SetArtProvider(provider) - - - def GetArtProvider(self): - - if not self._pClientWindow: - return None - - return self._pClientWindow.GetArtProvider() - - - def GetNotebook(self): - - return self._pClientWindow - - - def SetWindowMenu(self, pMenu): - - # Replace the window menu from the currently loaded menu bar. - pMenuBar = self.GetMenuBar() - - if self._pWindowMenu: - self.RemoveWindowMenu(pMenuBar) - del self._pWindowMenu - self._pWindowMenu = None - - if pMenu: - self._pWindowMenu = pMenu - self.AddWindowMenu(pMenuBar) - - - def GetWindowMenu(self): - - return self._pWindowMenu - - - def SetMenuBar(self, pMenuBar): - - # Remove the Window menu from the old menu bar - self.RemoveWindowMenu(self.GetMenuBar()) - - # Add the Window menu to the new menu bar. - self.AddWindowMenu(pMenuBar) - - wx.Frame.SetMenuBar(self, pMenuBar) - - - def SetChildMenuBar(self, pChild): - - if not pChild: - - # No Child, set Our menu bar back. - if self._pMyMenuBar: - self.SetMenuBar(self._pMyMenuBar) - else: - self.SetMenuBar(self.GetMenuBar()) - - # Make sure we know our menu bar is in use - self._pMyMenuBar = None - - else: - - if pChild.GetMenuBar() == None: - return - - # Do we need to save the current bar? - if self._pMyMenuBar == None: - self._pMyMenuBar = self.GetMenuBar() - - self.SetMenuBar(pChild.GetMenuBar()) - - - def ProcessEvent(self, event): - - # stops the same event being processed repeatedly - if self._pLastEvt == event: - return False - - self._pLastEvt = event - - # let the active child (if any) process the event first. - res = False - if self._pActiveChild and event.IsCommandEvent() and \ - event.GetEventObject() != self._pClientWindow and \ - event.GetEventType() not in [wx.wxEVT_ACTIVATE, wx.wxEVT_SET_FOCUS, - wx.wxEVT_KILL_FOCUS, wx.wxEVT_CHILD_FOCUS, - wx.wxEVT_COMMAND_SET_FOCUS, wx.wxEVT_COMMAND_KILL_FOCUS]: - - res = self._pActiveChild.GetEventHandler().ProcessEvent(event) - - if not res: - - # if the event was not handled this frame will handle it, - # which is why we need the protection code at the beginning - # of this method - res = self.GetEventHandler().ProcessEvent(event) - - self._pLastEvt = None - - return res - - - def GetActiveChild(self): - - return self._pActiveChild - - - def SetActiveChild(self, pChildFrame): - - self._pActiveChild = pChildFrame - - - def GetClientWindow(self): - - return self._pClientWindow - - - def OnCreateClient(self): - - return AuiMDIClientWindow(self) - - - def ActivateNext(self): - - if self._pClientWindow and self._pClientWindow.GetSelection() != wx.NOT_FOUND: - - active = self._pClientWindow.GetSelection() + 1 - if active >= self._pClientWindow.GetPageCount(): - active = 0 - - self._pClientWindow.SetSelection(active) - - - def ActivatePrevious(self): - - if self._pClientWindow and self._pClientWindow.GetSelection() != wx.NOT_FOUND: - - active = self._pClientWindow.GetSelection() - 1 - if active < 0: - active = self._pClientWindow.GetPageCount() - 1 - - self._pClientWindow.SetSelection(active) - - - def Init(self): - - self._pLastEvt = None - - self._pClientWindow = None - self._pActiveChild = None - self._pWindowMenu = None - self._pMyMenuBar = None - - - def RemoveWindowMenu(self, pMenuBar): - - if pMenuBar and self._pWindowMenu: - - # Remove old window menu - pos = pMenuBar.FindMenu(_("&Window")) - if pos != wx.NOT_FOUND: - pMenuBar.Remove(pos) - - - def AddWindowMenu(self, pMenuBar): - - if pMenuBar and self._pWindowMenu: - - pos = pMenuBar.FindMenu(wx.GetStockLabel(wx.ID_HELP, wx.STOCK_NOFLAGS)) - if pos == wx.NOT_FOUND: - pMenuBar.Append(self._pWindowMenu, _("&Window")) - else: - pMenuBar.Insert(pos, self._pWindowMenu, _("&Window")) - - - def DoHandleMenu(self, event): - - evId = event.GetId() - - if evId == wxWINDOWCLOSE: - if self._pActiveChild: - self._pActiveChild.Close() - - elif evId == wxWINDOWCLOSEALL: - - while self._pActiveChild: - if not self._pActiveChild.Close(): - return # failure - - elif evId == wxWINDOWNEXT: - self.ActivateNext() - - elif evId == wxWINDOWPREV: - self.ActivatePrevious() - - else: - event.Skip() - - - def Tile(self, orient=wx.HORIZONTAL): - - client_window = self.GetClientWindow() - if not client_window: - raise Exception("Missing MDI Client Window") - - cur_idx = client_window.GetSelection() - if cur_idx == -1: - return - - if orient == wx.VERTICAL: - - client_window.Split(cur_idx, wx.LEFT) - - elif orient == wx.HORIZONTAL: - - client_window.Split(cur_idx, wx.TOP) - - -#----------------------------------------------------------------------------- -# AuiMDIChildFrame -#----------------------------------------------------------------------------- - -class AuiMDIChildFrame(wx.PyPanel): - - def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, - size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, name="AuiMDIChildFrame"): - - pClientWindow = parent.GetClientWindow() - if pClientWindow is None: - raise Exception("Missing MDI client window.") - - self.Init() - - # see comment in constructor - if style & wx.MINIMIZE: - self._activate_on_create = False - - cli_size = pClientWindow.GetClientSize() - - # create the window off-screen to prevent flicker - wx.PyPanel.__init__(self, pClientWindow, id, wx.Point(cli_size.x+1, cli_size.y+1), - size, wx.NO_BORDER, name=name) - - self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) - self.Show(False) - self.SetMDIParentFrame(parent) - - # this is the currently active child - parent.SetActiveChild(self) - self._title = title - - pClientWindow.AddPage(self, title, self._activate_on_create) - pClientWindow.Refresh() - - self.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.OnMenuHighlight) - self.Bind(wx.EVT_ACTIVATE, self.OnActivate) - self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) - - - def Init(self): - - # There are two ways to create an tabbed mdi child fram without - # making it the active document. Either Show(False) can be called - # before Create() (as is customary on some ports with wxFrame-type - # windows), or wx.MINIMIZE can be passed in the style flags. Note that - # AuiMDIChildFrame is not really derived from wxFrame, as MDIChildFrame - # is, but those are the expected symantics. No style flag is passed - # onto the panel underneath. - - self._activate_on_create = True - - self._pMDIParentFrame = None - self._pMenuBar = None - - self._mdi_currect = None - self._mdi_newrect = wx.Rect() - self._icon = None - self._icon_bundle = None - - - def Destroy(self): - - pParentFrame = self.GetMDIParentFrame() - if not pParentFrame: - raise Exception("Missing MDI Parent Frame") - - pClientWindow = pParentFrame.GetClientWindow() - if not pClientWindow: - raise Exception("Missing MDI Client Window") - - if pParentFrame.GetActiveChild() == self: - - # deactivate ourself - event = wx.ActivateEvent(wx.wxEVT_ACTIVATE, False, self.GetId()) - event.SetEventObject(self) - self.GetEventHandler().ProcessEvent(event) - - pParentFrame.SetActiveChild(None) - pParentFrame.SetChildMenuBar(None) - - for pos in xrange(pClientWindow.GetPageCount()): - if pClientWindow.GetPage(pos) == self: - return pClientWindow.DeletePage(pos) - - return False - - - def SetMenuBar(self, menu_bar): - - pOldMenuBar = self._pMenuBar - self._pMenuBar = menu_bar - - if self._pMenuBar: - - pParentFrame = self.GetMDIParentFrame() - if not pParentFrame: - raise Exception("Missing MDI Parent Frame") - - self._pMenuBar.Reparent(pParentFrame) - if pParentFrame.GetActiveChild() == self: - - # replace current menu bars - if pOldMenuBar: - pParentFrame.SetChildMenuBar(None) - - pParentFrame.SetChildMenuBar(self) - - - def GetMenuBar(self): - - return self._pMenuBar - - - def SetTitle(self, title): - - self._title = title - - pParentFrame = self.GetMDIParentFrame() - if not pParentFrame: - raise Exception("Missing MDI Parent Frame") - - pClientWindow = pParentFrame.GetClientWindow() - if pClientWindow is not None: - - for pos in xrange(pClientWindow.GetPageCount()): - if pClientWindow.GetPage(pos) == self: - pClientWindow.SetPageText(pos, self._title) - break - - - def GetTitle(self): - - return self._title - - - def SetIcons(self, icons): - - # get icon with the system icon size - self.SetIcon(icons.GetIcon(-1)) - self._icon_bundle = icons - - - def GetIcons(self): - - return self._icon_bundle - - - def SetIcon(self, icon): - - pParentFrame = self.GetMDIParentFrame() - if not pParentFrame: - raise Exception("Missing MDI Parent Frame") - - self._icon = icon - - bmp = wx.BitmapFromIcon(self._icon) - - pClientWindow = pParentFrame.GetClientWindow() - if pClientWindow is not None: - idx = pClientWindow.GetPageIndex(self) - if idx != -1: - pClientWindow.SetPageBitmap(idx, bmp) - - - def GetIcon(self): - - return self._icon - - - def Activate(self): - - pParentFrame = self.GetMDIParentFrame() - if not pParentFrame: - raise Exception("Missing MDI Parent Frame") - - pClientWindow = pParentFrame.GetClientWindow() - if pClientWindow is not None: - - for pos in xrange(pClientWindow.GetPageCount()): - if pClientWindow.GetPage(pos) == self: - pClientWindow.SetSelection(pos) - break - - - def OnMenuHighlight(self, event): - - if self._pMDIParentFrame: - - # we don't have any help text for this item, - # but may be the MDI frame does? - self._pMDIParentFrame.OnMenuHighlight(event) - - - def OnActivate(self, event): - - # do nothing - pass - - - def OnCloseWindow(self, event): - - pParentFrame = self.GetMDIParentFrame() - if pParentFrame: - if pParentFrame.GetActiveChild() == self: - - pParentFrame.SetActiveChild(None) - pParentFrame.SetChildMenuBar(None) - - pClientWindow = pParentFrame.GetClientWindow() - idx = pClientWindow.GetPageIndex(self) - - if idx != wx.NOT_FOUND: - pClientWindow.RemovePage(idx) - - self.Destroy() - - - def SetMDIParentFrame(self, parentFrame): - - self._pMDIParentFrame = parentFrame - - - def GetMDIParentFrame(self): - - return self._pMDIParentFrame - - - def CreateStatusBar(self, number=1, style=1, winid=1, name=""): - - return None - - - def GetStatusBar(self): - - return None - - - def SetStatusText(self, text, number=0): - - pass - - - def SetStatusWidths(self, widths_field): - - pass - - - # no toolbar bars - def CreateToolBar(self, style=1, winid=-1, name=""): - - return None - - - def GetToolBar(self): - - return None - - - # no maximize etc - def Maximize(self, maximize=True): - - pass - - - def Restore(self): - - pass - - - def Iconize(self, iconize=True): - - pass - - - def IsMaximized(self): - - return True - - - def IsIconized(self): - - return False - - - def ShowFullScreen(self, show=True, style=0): - - return False - - - def IsFullScreen(self): - - return False - - - def IsTopLevel(self): - - return False - - - # renamed from Show(). - def ActivateOnCreate(self, activate_on_create): - - self._activate_on_create = activate_on_create - return True - - - def Show(self, show=True): - - wx.PyPanel.Show(self, show) - - - def ApplyMDIChildFrameRect(self): - - if self._mdi_currect != self._mdi_newrect: - self.SetDimensions(*self._mdi_newrect) - self._mdi_currect = wx.Rect(*self._mdi_newrect) - - -#----------------------------------------------------------------------------- -# AuiMDIClientWindow -#----------------------------------------------------------------------------- - -class AuiMDIClientWindow(auibook.AuiNotebook): - - def __init__(self, parent, agwStyle=0): - - auibook.AuiNotebook.__init__(self, parent, wx.ID_ANY, wx.Point(0, 0), wx.Size(100, 100), - agwStyle=AUI_NB_DEFAULT_STYLE|wx.NO_BORDER) - - caption_icon_size = wx.Size(wx.SystemSettings.GetMetric(wx.SYS_SMALLICON_X), - wx.SystemSettings.GetMetric(wx.SYS_SMALLICON_Y)) - self.SetUniformBitmapSize(caption_icon_size) - - bkcolour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_APPWORKSPACE) - self.SetOwnBackgroundColour(bkcolour) - - self._mgr.GetArtProvider().SetColour(AUI_DOCKART_BACKGROUND_COLOUR, bkcolour) - - self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged) - self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnPageClose) - self.Bind(wx.EVT_SIZE, self.OnSize) - - - def SetSelection(self, nPage): - - return auibook.AuiNotebook.SetSelection(self, nPage) - - - def PageChanged(self, old_selection, new_selection): - - # don't do anything if the page doesn't actually change - if old_selection == new_selection: - return - - # notify old active child that it has been deactivated - if old_selection != -1 and old_selection < self.GetPageCount(): - - old_child = self.GetPage(old_selection) - if not old_child: - raise Exception("AuiMDIClientWindow.PageChanged - null page pointer") - - event = wx.ActivateEvent(wx.wxEVT_ACTIVATE, False, old_child.GetId()) - event.SetEventObject(old_child) - old_child.GetEventHandler().ProcessEvent(event) - - # notify new active child that it has been activated - if new_selection != -1: - - active_child = self.GetPage(new_selection) - if not active_child: - raise Exception("AuiMDIClientWindow.PageChanged - null page pointer") - - event = wx.ActivateEvent(wx.wxEVT_ACTIVATE, True, active_child.GetId()) - event.SetEventObject(active_child) - active_child.GetEventHandler().ProcessEvent(event) - - if active_child.GetMDIParentFrame(): - active_child.GetMDIParentFrame().SetActiveChild(active_child) - active_child.GetMDIParentFrame().SetChildMenuBar(active_child) - - - def OnPageClose(self, event): - - wnd = self.GetPage(event.GetSelection()) - wnd.Close() - - # regardless of the result of wnd.Close(), we've - # already taken care of the close operations, so - # suppress further processing - event.Veto() - - - def OnPageChanged(self, event): - - self.PageChanged(event.GetOldSelection(), event.GetSelection()) - - - def OnSize(self, event): - - auibook.AuiNotebook.OnSize(self, event) - - for pos in xrange(self.GetPageCount()): - self.GetPage(pos).ApplyMDIChildFrameRect() diff --git a/autres/CHD.R.old b/autres/CHD.R.old new file mode 100644 index 0000000..f81e346 --- /dev/null +++ b/autres/CHD.R.old @@ -0,0 +1,245 @@ +#library(ca) +#library(MASS) +#source('/home/pierre/workspace/iramuteq/Rscripts/afc.R') +#data<-read.table('output/corpus_bin.csv',header=TRUE,sep='\t') +source('/home/pierre/workspace/iramuteq/Rscripts/anacor.R') + +CHD<-function(data,x=9){ + dataori=data + dtable=data + listcol<-list() + listmere<-list() + a<-0 + print('vire colonnes vides en entree')#FIXME : il ne doit pas y avoir de colonnes vides en entree !! + for (m in 1:length(dtable)) { + if (sum(dtable[m-a])==0) { + print('colonne vide') + dtable<-dtable[,-(m-a)] + a<-a+1 + } + } + for (i in 1:x) { + clnb<-(i*2) + listmere[[clnb]]<-i + listmere[[clnb+1]]<-i + listcol[[clnb]]<-vector() + listcol[[clnb+1]]<-vector() + #extraction du premier facteur de l'afc + print('afc') + #afc<-ca(dtable,nd=1) + #afc<-corresp(dtable,nd=1) + #afc<-fca(dtable) + afc<-boostana(dtable,nd=1) + #coordonnees des colonnes sur le premier facteur + #coordrow=afc$rowcoord + #coordrow=as.matrix(afc$rscore) + #coordrow<-as.matrix(afc$rproj[,1]) + coordrow<-as.matrix(afc$row.scores) + #row.names(coordrow)<-afc$rownames + row.names(coordrow)<-rownames(dtable) + #classement en fonction de la position sur le premier facteur + #listclasse<-ifelse(coordrow<0,paste('CLASSE',clnb,sep=''),paste('CLASSE',clnb+1,sep='')) + + print('deb recherche meilleur partition') + coordrow<-as.matrix(coordrow[order(coordrow[,1]),]) + #print(rownames(coordrow)) + zeropoint<-which.min(abs(coordrow)) + print(zeropoint) + g<-length(coordrow[coordrow[,1]coordrow[zeropoint]]) + prct<-1 + g<-round(g*prct) + d<-round(d*prct) + print(g) + print(d) + temptable<-as.matrix(coordrow[(zeropoint-g):(zeropoint+d)]) + row.names(temptable)<-rownames(coordrow)[(zeropoint-g):(zeropoint+d)] + #print(temptable) + missing<-zeropoint-g + listchi<-vector() + chtable<-matrix(0,2,(ncol(dtable))) + totforme<-chtable[1,] + for (forme in 1:(ncol(dtable))) { + totforme[forme]<-sum(dtable[,forme]) + } + chtable[2,]<-totforme + for (l in 1:length(temptable)) { + # print(rownames(temptable)[l]) + linetoswitch=as.matrix(dtable[rownames(temptable)[l],]) + # print(linetoswitch) + chtable[1,]<-chtable[1,]+linetoswitch + chtable[2,]<-chtable[2,]-linetoswitch + valchi<-chisq.test(chtable)$statistic + if (is.na(valchi)){ + valchi<-0 + } + listchi<-append(listchi,valchi) + } + #listchi<-listchi[!is.na(listchi)] + maxchi<-which(listchi==max(listchi)) + print(max(listchi)) + print(maxchi) + maxchi<-maxchi+missing + #print(listchi) + #listclasse + print('liste classe') + print(coordrow[(maxchi)]) + listclasse<-ifelse(coordrow<=coordrow[(maxchi)],clnb,clnb+1) +# listclasse<-ifelse(coordrow<0,clnb,clnb+1) + listchi<-as.matrix(listchi) + listchi<-cbind(listchi,temptable) + filename<-paste('graphechi',as.character(i)) + filename<-paste(filename,'.jpeg') + jpeg(filename) + plot(listchi[,1]~listchi[,2]) + abline(v=0) + print(coordrow[zeropoint-g]) + abline(v=coordrow[zeropoint-g]) + abline(v=coordrow[zeropoint+d]) + abline(v=coordrow[(maxchi)]) + dev.off() + + #ajout du classement au tableau + dtable<-transform(dtable,cl1=listclasse) + + #calcul de la specificite des colonnes + t1<-dtable[dtable$cl1==clnb,] + t2<-dtable[dtable$cl1==clnb+1,] + + for (k in 1:(ncol(dtable)-1)) { + t<-matrix(0,2,2) + t[1,1]<-sum(t1[,k]) + t[1,2]<-sum(t2[,k]) + t[2,1]<-nrow(t1)-t[1,1] + t[2,2]<-nrow(t2)-t[1,2] + chi<-chisq.test(t) + if (chi$statistic>6){#FIXME : valeur a mettre en option base :2.7 + if (chi$expected[1,1]1) { + plusgrand<-plusgrand[1] + } + #???????????????????????????????????? + + #constuction du prochain tableau a analyser + print('construction tableau suivant') + classe<-classes[plusgrand] + dtable<-dataori[dataori[length(dataori)]==classe,] + dtable<-dtable[,1:(length(dtable)-i)] + + + listcolelim<-listcol[[as.integer(classe)]] + mother<-listmere[[as.integer(classe)]] + while (mother!=1) { + listcolelim<-append(listcolelim,listcol[[mother]]) + print(listcolelim) + mother<-listmere[[mother]] + } + + listcolelim<-sort(unique(listcolelim)) + print(listcolelim) + print('avant') + print(ncol(dtable)) + if (!is.logical(listcolelim)){ + print('elimination colonne') + a<-0 + for (col in listcolelim){ + dtable<-dtable[,-(col-a)] + a<-a+1 + } + } + print('apres') + print(ncol(dtable)) + #elimination des colonnes ne contenant que des 0 + print('vire colonne vide dans boucle') + a<-0 + for (m in 1:ncol(dtable)) { + if (sum(dtable[,m-a])==0) { + dtable<-dtable[,-(m-a)] + a<-a+1 + } + } + #elimination des lignes ne contenant que des 0 +# print('vire ligne vide dans boucle') +# a<-0 +# for (m in 1:nrow(dtable)) { +# if (sum(dtable[m-a,])==0) { +# print('ligne vide') +# dtable<-dtable[-(m-a),] +# a<-a+1 +# } +# } + } + dataori[(length(dataori)-x+1):length(dataori)] +} + +#dataout<-CHD(data,9) + +#library(cluster) +#dissmat<-daisy(dataout, metric = 'gower', stand = FALSE) +#chd<-diana(dissmat,diss=TRUE,) + + +#pour tester le type, passer chaque colonne en matice et faire mode(colonne) +#for (i in 1:13) {tmp<-as.matrix(data[i]);print(mode(tmp))} diff --git a/autres/INSTALL_WINDOWS b/autres/INSTALL_WINDOWS new file mode 100644 index 0000000..b95c9c5 --- /dev/null +++ b/autres/INSTALL_WINDOWS @@ -0,0 +1,28 @@ +dépendances : +R 2.13.2 +http://cran.cict.fr/bin/windows/ + +python 2.7 +http://www.python.org/ + +Numpy +http://surfnet.dl.sourceforge.net/sourceforge/numpy/ + +wxpython (2.8) +http://surfnet.dl.sourceforge.net/sourceforge/wxpython/ + +xlrd : +http://pypi.python.org/pypi/xlrd + +package de R : +rgl +ca +gee +ape +igraph +proxy +textometry + + +pour gui2exe : +mettre le manifeste directement dans Constants.py diff --git a/autres/Rlib/textometrieR/DESCRIPTION b/autres/Rlib/textometrieR/DESCRIPTION new file mode 100644 index 0000000..817e7d0 --- /dev/null +++ b/autres/Rlib/textometrieR/DESCRIPTION @@ -0,0 +1,14 @@ +Package: textometrieR +Type: Package +Title: Statistical exploration of textual corpora +Version: 0.5 +Date: 2009-01-18 +Author: Sylvain Loiseau, Vaudor Lise, Matthieu Decorde +Maintainer: Matthieu Decorde +Description: Statistical exploration of textual corpora using several methods + from french 'lexiometrie' and french 'Data Analysis' schools. It includes + methods for exploring irregularity of distribution of lexicon (or other + features) accross parts of texts; multidimensionnal exploration ('Analyse + des correspondances'), etc. +License: GPLv3 +Depends: R (>= 2.5.0) diff --git a/autres/Rlib/textometrieR/NAMESPACE b/autres/Rlib/textometrieR/NAMESPACE new file mode 100644 index 0000000..2bf07cc --- /dev/null +++ b/autres/Rlib/textometrieR/NAMESPACE @@ -0,0 +1,7 @@ +import("grDevices") + +# file "R/specificites.R" +export(pareto, specificites, specificites.probabilities, specificites.lexicon, specificites.lexicon.probabilities, cooccurrences, specificites.lexicon.new) + +# file "R/repartition.R" +export(printrepartition) diff --git a/autres/Rlib/textometrieR/Read-and-delete-me b/autres/Rlib/textometrieR/Read-and-delete-me new file mode 100644 index 0000000..d04323a --- /dev/null +++ b/autres/Rlib/textometrieR/Read-and-delete-me @@ -0,0 +1,9 @@ +* Edit the help file skeletons in 'man', possibly combining help files + for multiple functions. +* Put any C/C++/Fortran code in 'src'. +* If you have compiled code, add a .First.lib() function in 'R' to load + the shared library. +* Run R CMD build to build the package tarball. +* Run R CMD check to check the package tarball. + +Read "Writing R Extensions" for more information. diff --git a/autres/Rlib/textometrieR/cgt75.R b/autres/Rlib/textometrieR/cgt75.R new file mode 100644 index 0000000..a478386 --- /dev/null +++ b/autres/Rlib/textometrieR/cgt75.R @@ -0,0 +1,4 @@ +f <- file(description = "cgt75.splitted.txt", open = "r", blocking = TRUE, encoding = "latin1"); +cgt75 <- readLines(f, n = -1, ok = TRUE, warn = TRUE); +# i <- grep("\\.", cgt75); +# get.contexts(factor(cgt75, "."); diff --git a/autres/Rlib/textometrieR/cgt75.splitted.txt b/autres/Rlib/textometrieR/cgt75.splitted.txt new file mode 100644 index 0000000..0ba097e --- /dev/null +++ b/autres/Rlib/textometrieR/cgt75.splitted.txt @@ -0,0 +1,39240 @@ +< +S00 += +02 +> +< +S01 += +003 +> +< +S02 += +001 +> +< +S03 += +001 +> +< +Sda += +1975 +> +< +Sdm += +06 +> +< +Sat += +0 +> +< +S10 += +1 +> +document +d +' +orientation +de +la +CGT +. +. +< +S10 += +0 +> +§ +deux +données +essentielles +caractérisent +la +situation +, +déterminent +le +comportement +des +diverses +forces +sociales +et +politiques +et +situent +par +conséquent +les +conditions +de +l +' +action +syndicale +$ +: +_ +l +' +aggravation +de +la +crise +qui +affecte +l +' +économie +et +la +vie +du +pays +; +_ +la +montée +de +la +volonté +de +changement +et +les +perspectives +qu +' +offre +l +' +union +de +la +gauche +sur +la +base +de +son +* +programme +commun +de +gouvernement +. +§ +dans +sa +manifestation +la +plus +immédiate +et +la +plus +sensible +aux +travailleurs +la +crise +se +traduit +par +de +sérieuses +atteintes +au +pouvoir +d +' +achat +de +leurs +salaires +, +retraites +et +prestations +sociales +, +par +la +montée +du +chômage +, +l +' +aggravation +de +leurs +conditions +de +travail +et +d +' +existence +. +§ +mais +la +dimension +de +cette +crise +est +plus +vaste +. +elle +affecte +_ +les +précédents +* +congrès +de +la +CGT +l +' +ont +déjà +souligné +_ +l +' +ensemble +de +la +vie +du +pays +, +sous +tous +ses +aspects +essentiels +$ +: +économique +, +social +, +politique +, +culturel +, +moral +. +§ +elle +met +en +cause +les +fondements +de +la +société +capitaliste +et +pose +la +nécessité +de +transformations +profondes +touchant +aux +structures +économiques +et +sociales +de +la +société +. +§ +c +' +est +dans +ce +contexte +de +crise +profonde +et +durable +de +l +' +ensemble +des +grands +pays +capitalistes +que +se +situe +l +' +aggravation +de +la +situation +économique +. +elle +se +manifeste +par +une +poussée +beaucoup +plus +forte +d +' +une +inflation +depuis +longtemps +permanente +. +cette +inflation +se +combine +avec +une +montée +considérable +du +chômage +et +un +déclin +du +développement +économique +. +il +est +faux +d +' +attribuer +cette +situation +au +prix +du +pétrole +et +des +matières +premières +. +§ +la +récession +de +1974 +- +1975 +est +la +plus +forte +que +les +économies +capitalistes +aient +connu +depuis +la +deuxième +guerre +mondiale +. +§ +il +ne +s +' +agit +pas +seulement +d +' +une +période +défavorable +accentuée +, +mais +d +' +un +dérèglement +durable +en +profondeur +de +l +' +économie +capitaliste +qui +est +le +fond +de +la +crise +. +§ +le +dérèglement +en +profondeur +de +l +' +économie +capitaliste +mondiale +est +à +la +base +de +la +crise +. +il +résulte +de +l +' +exploitationet +de +la +course +au +profit +poussées +jusqu +' +à +leurs +limites +dans +tous +les +pays +où +l +' +* +état +est +l +' +instrument +des +grandes +sociétés +capitalistes +. +parmi +ces +pays +, +les +Etats +- +Unis +occupent +une +position +dominante +, +et +l +' +économie +américaine +pèse +d +' +un +poids +déterminant +. +§ +l +' +accumulation +des +profits +extraordinaires +réalisés +par +les +grandes +sociétés +, +les +moyens +employés +pour +maintenir +ces +profits +et +les +accroître +, +même +au +prix +d +' +énormes +gaspillages +, +la +militarisation +de +l +' +économie +, +en +particulier +aux +USA +, +sont +à +l +' +origine +de +l +' +inflation +, +de +la +crise +du +système +monétaire +et +des +relations +économiques +des +pays +capitalistes +ainsi +que +de +tous +les +désordres +économiques +qui +les +accompagnent +. +§ +la +place +prépondérante +des +sociétés +multinationales +dans +l +' +ensemble +du +monde +capitaliste +et +dans +les +pays +en +voie +de +développement +, +leurs +dimensions +, +la +nature +de +leurs +activités +en +font +l +' +un +des +principaux +facteurs +des +perturbations +économiques +, +un +danger +pour +les +travailleurs +, +pour +l +' +indépendance +des +peuples +et +les +droits +des +* +états +. +§ +cette +malfaisance +s +' +exerce +également +en +Europe +occidentale +et +particulièrement +au +sein +du +marché +commun +. +l +' +ensemble +des +phénomènes +de +crise +s +' +y +manifestent +. +les +sociétés +multinationales +y +sont +pour +les +deux +tiers +sous +la +domination +des +groupes +financiers +et +industriels +américains +, +en +particulier +dans +les +secteurs +de +pointe +. +§ +elles +assoient +leur +emprise +avec +l +' +appui +des +gouvernements +qui +facilitent +l +' +interpénétration +des +capitaux +publics +et +privés +au +profit +de +ces +derniers +. +§ +les +contradictions +s +' +aiguisent +au +sein +du +* +marché +commun +alors +que +le +capital +ouest +- +allemand +y +joue +le +rôle +principal +et +que +se +renforce +la +dépendance +à +l +' +égard +des +USA +. +§ +les +abandons +de +souveraineté +opérés +par +le +* +pouvoir +portent +gravement +préjudice +à +l +' +indépendance +nationale +de +la +France +menacée +par +les +projets +de +supranationalité +et +replacée +pratiquement +dans +le +giron +atlantique +. +la +volonté +d +' +unification +des +politiques +économiques +et +sociales +vise +à +renforcer +le +front +des +patrons +et +des +gouvernements +contre +les +travailleurs +de +ces +pays +. +§ +en +France +, +la +crise +a +les +mêmes +causes +profondes +que +dans +les +autres +pays +capitalistes +. +l +' +économie +est +dominée +par +un +petit +nombre +de +groupes +financiers +géants +qui +augmentent +leurs +richesses +et +leur +puissance +au +détriment +des +travailleurs +et +du +pays +. +la +politique +menée +depuis +des +années +, +avec +pour +but +essentiel +leurs +profits +et +le +renforcement +de +leurs +positions +à +l +' +échelle +nationale +et +internationale +, +a +plongé +le +pays +dans +la +crise +. +§ +la +politique +d +' +austérité +imposée +par +le +gouvernement +sous +prétexte +d +' +endiguer +la +crise +ne +s +' +attaque +pas +à +l +' +inflation +qui +est +source +de +profits +accrus +. +elle +l +' +entretientet +augmente +le +chômage +. +§ +les +promesses +gouvernementales +d +' +amélioration +de +la +situation +économique +sont +contredites +par +la +réalité +. +§ +les +milliards +distribués +sous +prétexte +de +relance +gonflent +les +profits +et +alimentent +l +' +inflation +. +§ +l +' +orientation +prévue +pour +le +* +7ème +plan +est +une +prolongation +de +la +politique +d +' +austérité +. +elle +ne +peut +assurer +le +taux +de +croissance +mensongèrement +affiché +. +elle +vise +à +diminuer +brutalement +le +pouvoir +d +' +achat +par +une +politique +des +revenus +. +le +nombre +de +chômeurs +, +déjà +égal +à +1200000 +au +début +de +1975 +, +risque +sérieusement +d +' +augmenter +encore +dans +une +forte +proportion +. +§ +le +* +pouvoir +des +féodalités +capitalistes +ne +peut +combattre +efficacement +ni +l +' +inflation +, +ni +le +chômage +. +loin +de +s +' +attaquerà +leurs +causes +réelles +, +il +veut +faire +supporter +les +frais +de +la +crise +aux +travailleurs +et +saisir +cette +occasion +pour +accélérer +la +concentration +capitaliste +, +l +' +élimination +d +' +entreprises +petites +, +moyennes +et +parfois +grandes +. +le +" +redéploiement +de +l +' +industrie +" +consiste +principalement +à +mettre +les +ressources +du +pays +et +les +moyens +de +financement +et +d +' +action +économiques +de +l +' +* +état +à +la +disposition +des +groupes +industriels +et +financiers +susceptibles +d +' +atteindre +la +dimension +multinationale +. +§ +le +budget +, +la +fiscalité +, +la +politique +du +crédit +, +la +politique +des +prix +, +la +politique +de +tarifs +et +de +transferts +d +' +activités +bénéficiaires +des +services +publics +et +des +entreprises +nationalisées +vers +le +secteur +privé +, +tous +les +moyens +sont +mis +en +oeuvre +par +le +* +pouvoir +pour +répondre +aux +exigences +des +principaux +groupes +capitalistes +. +§ +le +* +pouvoir +giscardien +pousse +plus +avant +l +' +interpénétration +et +la +conjonction +des +moyens +de +l +' +* +état +et +des +monopoles +, +au +service +de +ces +derniers +, +c +' +est +- +à +- +dire +le +capitalisme +monopoliste +d +' +* +état +. +§ +pour +cette +raison +il +ne +peut +qu +' +aggraver +la +crise +qui +mine +la +société +française +. +§ +la +confiscation +, +par +une +minorité +toujours +plus +restreinte +et +plus +puissante +des +richesses +du +travail +du +plus +grand +nombre +et +des +moyens +de +la +direction +de +l +' +économie +conduit +aux +aberrations +les +plus +choquantes +$ +: +la +baisse +du +niveau +de +vie +des +travailleurs +et +le +chômage +, +l +' +énormité +des +gaspillages +des +forces +humaines +et +matérielles +, +le +sacrifice +des +équipements +collectifs +, +les +injustices +de +toutes +sortes +. +§ +face +au +bilan +désastreux +d +' +un +système +condamné +, +une +puissante +force +de +transformation +a +grandi +et +s +' +est +mise +en +mouvement +. +la +résistance +des +travailleurs +s +' +est +renforcée +, +leur +pression +revendicative +s +' +est +exprimée +par +la +montée +des +luttes +sociales +. +la +signature +du +* +programme +commun +de +gouvernement +entre +le +* +parti +communiste +, +le +* +parti +socialiste +et +le +* +mouvement +des +radicaux +de +gauche +, +avec +le +soutien +de +la +CGT +a +constitué +un +tournant +. +§ +en +se +prononçant +pour +la +réalisation +de +ce +programme +, +lors +de +l +' +élection +présidentielle +de +mai +1974 +, +plus +de +49 +% +des +électeurs +ont +démontré +que +le +changement +véritable +, +fondé +sur +des +réformes +profondes +est +possible +, +qu +' +il +peut +devenir +la +volonté +majoritaire +du +peuple +. +§ +cette +situation +crée +un +nouveau +rapport +de +force +dans +le +pays +. +§ +les +travailleurs +y +puisent +un +grand +espoir +, +une +plus +grande +confiance +en +leurs +forces +. +§ +ils +y +trouvent +des +conditions +plus +favorables +pour +leurs +luttes +revendicatives +, +pour +défendre +avec +succès +leurs +intérêts +les +plus +urgents +, +obtenir +certains +résultats +, +mettre +en +échec +certaines +mesures +antisociales +. +le +* +pouvoir +et +le +* +patronat +doivent +en +tenir +compte +. +§ +dans +cette +situation +des +possibilités +nouvelles +existent +pour +gagner +de +nouvelles +forces +, +de +nouvelles +couches +aux +luttes +immédiates +et +à +l +' +idée +des +changements +qui +seuls +sont +de +nature +à +permettre +la +solution +effective +et +durable +des +grands +problèmes +posés +à +la +société +. +§ +mais +leur +attitude +est +également +dictée +par +l +' +étroitesse +de +la +marge +d +' +action +dont +ils +disposent +. +§ +d +' +une +part +, +le +maintien +et +l +' +accroissement +des +profits +des +grandes +sociétés +dans +le +contexte +de +la +crise +économique +exigent +une +politique +aux +conséquences +sociales +aggravées +. +d +' +autrepart +, +toute +concession +aux +revendications +démontre +qu +' +il +est +possible +de +les +satisfaire +et +qu +' +une +autre +politique +peut +être +mise +en +oeuvre +. +§ +* +pouvoir +et +* +patronat +s +' +efforcent +donc +, +dans +ces +nouvelles +conditions +, +de +s +' +adapter +pour +maintenir +une +résistance +acharnée +aux +revendications +, +poursuivre +et +aggraver +leur +politique +. +ils +s +' +efforcent +également +de +contrarier +par +tous +les +moyens +l +' +évolution +des +masses +populaires +vers +l +' +idée +du +changement +. +§ +c +' +est +dans +cet +ensemble +de +circonstances +qu +' +il +convient +de +définir +les +positions +, +les +tâches +et +l +' +action +de +la +CGT +. +< +S10 += +1 +> +l +' +action +revendicative +et +l +' +unité +d +' +action +syndicale +. +. +< +S10 += +0 +> +§ +le +* +patronat +et +le +* +gouvernement +giscardien +s +' +efforcent +de +mettre +à +profit +la +situation +économique +dont +ils +sont +responsables +pour +comprimer +le +pouvoir +d +' +achat +des +salaires +, +faire +admettre +le +chômage +, +les +fermetures +d +' +entreprises +, +les +licenciements +, +pour +aggraver +les +conditions +de +travail +, +alourdir +les +impôts +payés +par +les +salariés +, +déprécier +les +prestations +sociales +et +familiales +, +renforcer +l +' +exploitationdes +travailleurs +français +et +immigrés +. +§ +pour +y +parvenir +ils +usent +de +tous +les +moyens +dont +ils +peuvent +disposer +$ +: +_ +l +' +intransigeance +globale +dans +toutes +les +négociations +et +le +détournement +d +' +une +véritable +politique +contractuelle +par +la +conclusion +avec +des +organisations +minoritaires +, +d +' +accords +de +collaboration +à +la +politique +d +' +austérité +; +_ +la +démagogie +sous +ses +diverses +variantes +, +plus +ou +moins +renouvelées +en +dernier +lieu +le +thème +de +la +" +réforme +de +l +' +entreprise +" +, +pour +tenter +inlassablement +de +détourner +les +travailleurs +des +réalités +sociales +et +de +la +défense +de +leurs +intérêts +de +classe +; +_ +la +tentative +de +domestiquer +toute +l +' +information +et +la +mise +en +oeuvre +des +moyens +énormes +de +pression +idéologique +pour +faire +admettre +l +' +inéluctabilité +de +la +crise +et +de +l +' +austérité +, +jouer +de +l +' +inquiétude +pour +l +' +emploi +, +et +dénaturer +la +lutte +de +la +CGT +et +de +toutes +les +forces +démocratiques +; +_ +l +' +extension +des +méthodes +plus +perfectionnées +d +' +exploitation +sous +couvert +d +' +une +prétendue +participation +ou +d +' +une +organisation +différente +du +travail +; +_ +la +division +entre +travailleurs +de +diverses +catégories +; +_ +la +tentative +de +mettre +en +selle +la +collaboration +de +classe +comme +une +institution +permanente +( +accords +séparés +, +collusion +dans +les +organismes +paritaires +, +concertation +avec +le +gouvernement +, +utilisation +abusive +de +l +' +information +officielle +et +de +la +formation +professionnelle +) +; +_ +l +' +attaque +généralisée +contre +les +libertés +syndicales +et +le +droit +de +grève +, +les +mesures +de +répression +arbitraires +et +illégales +, +l +' +emploi +de +la +force +policière +, +des +milices +privées +armées +, +contre +les +grévistes +dans +les +entreprises +. +§ +c +' +est +aussi +dans +ce +cadre +qu +' +il +faut +placer +le +recours +par +certains +patrons +, +avec +la +complicité +et +le +soutien +direct +du +pouvoir +, +à +des +syndicats +maison +, +des +officines +patronales +comme +la +CFT +, +des +entreprises +de +louage +d +' +hommes +de +main +employant +des +méthodes +fascistes +. +§ +loin +d +' +être +un +signe +de +force +, +ces +pratiques +sont +un +signe +des +difficultés +de +la +bourgeoisie +. +§ +elles +constituent +néanmoins +un +grave +danger +pour +les +libertés +. +elles +s +' +inscrivent +dans +un +processus +de +renforcement +du +système +autoritaire +. +c +' +est +pourquoi +elles +doivent +recevoir +les +ripostes +immédiates +et +énergiques +qui +s +' +imposent +, +et +susciter +un +grand +mouvement +de +lutte +pour +la +démocratie +. +§ +c +' +est +dans +ce +cadre +qu +' +il +faut +placer +le +recours +, +pour +une +partie +du +patronat +avec +la +complicité +et +parfois +le +soutien +direct +des +milieux +du +* +pouvoir +, +aux +syndicats +maison +CFT +dont +le +caractère +d +' +officine +patronale +et +les +méthodes +ont +été +dévoilés +par +la +CGT +. +§ +mais +ils +font +un +mauvais +calcul +en +misant +sur +une +quelconque +résignation +des +travailleurs +. +ils +ne +tiennent +pas +compte +du +mécontentement +accumulé +ni +de +l +' +état +d +' +esprit +né +du +progrès +des +forces +de +gauche +, +ni +des +conséquences +que +tirent +les +travailleurs +de +toutes +les +injustices +, +de +tout +ce +qui +témoigne +de +l +' +incapacité +du +système +à +résoudre +les +problèmes +sociaux +les +plus +élémentaires +. +§ +les +luttes +syndicales +ont +connu +, +en +plusieurs +occasions +, +des +périodes +particulièrement +intenses +. +elles +ont +mis +en +avant +des +revendications +d +' +une +ampleur +et +d +' +une +portée +nouvelles +. +§ +depuis +l +' +aggravation +de +la +crise +, +bien +des +actions +et +des +grèves +d +' +envergure +ont +témoigné +, +d +' +une +combativité +parmi +l +' +ensemble +des +travailleurs +et +particulièrement +dans +la +jeunesse +, +qu +' +il +faut +considérer +comme +l +' +indice +d +' +un +état +d +' +esprit +significatif +du +monde +du +travail +. +§ +toutes +les +manoeuvres +, +tous +les +procédés +employés +pour +détourner +les +salariés +de +la +lutte +sont +voués +à +l +' +échec +, +inadaptés +aux +conditions +nouvelles +, +à +condition +de +recevoir +la +riposte +appropriée +. +§ +car +il +n +' +est +pas +vrai +que +la +crise +, +le +chômage +, +l +' +inflation +soient +une +fatalité +$ +: +ils +sont +un +produit +du +système +capitaliste +et +de +la +domination +des +monopoles +. +§ +il +n +' +est +pas +vrai +, +que +l +' +austérité +pour +les +travailleurs +soit +inévitable +. +§ +il +n +' +est +pas +vrai +, +que +le +gouvernement +s +' +attaque +aux +inégalités +sociales +. +§ +il +n +' +est +pas +vrai +, +que +les +mesures +patronales +et +giscardiennes +soient +les +seules +possibles +. +§ +au +contraire +, +même +dans +les +conditions +actuelles +, +il +est +possible +d +' +imposer +d +' +autres +mesures +pour +combattre +l +' +inflation +et +le +chômage +et +d +' +engager +l +' +action +avec +l +' +immense +majorité +des +travailleurs +. +§ +c +' +est +parce +qu +' +ils +le +ressentent +que +les +travailleurs +n +' +ont +cessé +de +mener +des +luttes +importantes +. +mieux +ils +en +auront +conscience +et +plus +énergiquement +encore +ils +défendront +leurs +intérêts +, +avec +succès +. +§ +le +programme +d +' +action +soumis +au +39ème +* +congrès +précise +l +' +ensemble +des +objectifs +revendicatifs +essentiels +de +la +CGT +pour +la +période +à +venir +. +§ +parmi +ces +objectifs +, +il +en +est +un +certain +nombre +qui +ont +un +caractère +d +' +urgence +et +une +portée +générale +qui +sont +à +la +base +des +luttes +actuelles +. +§ +dans +le +contexte +de +la +crise +économique +, +la +défense +des +conditions +de +vie +et +de +travail +par +les +revendications +syndicales +est +étroitement +liée +à +l +' +action +pour +des +mesures +économiques +capables +de +combattre +la +crise +et +de +s +' +attaquer +à +ses +causes +afin +d +' +assainir +l +' +économie +et +d +' +assurer +son +développement +. +§ +les +revendications +concernent +en +particulier +: +< +S10 += +1 +> +les +salaires +. +. +< +S10 += +0 +> +_ +garantie +du +pouvoir +d +' +achat +pour +tous +par +l +' +échelle +mobile +et +progression +avec +des +différenciations +allant +dans +le +sens +d +' +une +remise +en +ordre +des +systèmes +de +rémunération +; +_ +SMIC +à +1700F +par +mois +pour +40 +heures +hebdomadaires +; +_ +relèvement +des +prestations +sociales +et +familiales +, +des +pensions +et +retraites +et +allocations +de +chômage +total +ou +partiel +. +< +S10 += +1 +> +l +' +emploi +. +. +< +S10 += +0 +> +_ +une +politique +de +développement +économique +créatrice +d +' +emplois +; +_ +le +droit +et +les +moyens +de +discuter +du +bien +fondé +des +décisions +de +licenciements +et +de +fermetures +d +' +entreprises +avec +la +possibilité +d +' +instances +de +recours +avec +effet +suspensif +; +_ +l +' +interdiction +de +tout +licenciement +sans +reclassement +préalable +équivalent +. +§ +dans +les +conditions +présentes +, +deux +mesures +longtemps +refusées +prennent +une +importance +et +une +urgence +particulières +$ +: +_ +le +droit +à +une +retraite +pleine +à +60 +ans +pour +les +hommes +et +à +55 +ans +pour +les +femmes +, +avec +75 +% +des +éléments +du +salaire +; +_ +la +semaine +de +40 +heures +en +5 +jours +partout +, +sans +réduction +de +salaire +et +dans +les +plus +brefs +délais +. +< +S10 += +1 +> +les +conditions +de +travail +< +S10 += +0 +> +exigent +un +ensemble +de +mesures +pour +$ +: +_ +limiter +les +cadences +, +embaucher +en +nombre +suffisant +, +_ +protéger +la +santé +et +la +vie +des +travailleurs +, +_ +élever +l +' +intérêt +, +la +responsabilité +, +la +qualification +du +travail +avec +des +classifications +et +des +salaires +correspondants +, +_ +assurer +des +garanties +d +' +accès +à +la +formation +et +à +la +promotion +professionnelles +. +< +S10 += +1 +> +les +libertés +syndicales +. +. +< +S10 += +0 +> +cessation +immédiate +des +atteintes +aux +libertés +syndicales +et +au +droit +de +grève +et +garanties +légales +contre +ces +pratiques +; +_ +sanctions +judiciaires +contre +toutes +les +violations +de +ces +libertés +et +contre +l +' +emploi +de +la +force +contre +les +travailleurs +; +_ +extension +des +libertés +syndicales +, +des +droits +démocratiques +des +travailleurs +et +des +moyens +attribués +pour +leur +exercice +dans +les +entreprises +et +dans +la +vie +publique +. +< +S10 += +1 +> +les +discriminations +de +toutes +sortes +< +S10 += +0 +> +doivent +être +supprimées +et +toutes +tentatives +de +les +maintenir +sanctionnées +. +< +S10 += +1 +> +une +véritable +réforme +de +la +fiscalité +< +S10 += +0 +> +allégeant +la +charge +des +salariés +et +frappant +le +* +capital +. +< +S10 += +1 +> +la +sécurité +sociale +< +S10 += +0 +> +doit +être +rendue +aux +travailleurs +et +les +mesures +consécutives +à +la +politique +de +démantèlement +poursuivie +par +le +* +pouvoir +et +le +* +patronat +doivent +être +abrogées +. +§ +l +' +indexation +des +allocations +, +rentes +et +pensions +sur +la +base +d +' +un +indice +de +prix +négocié +par +les +organisations +syndicales +. +§ +les +mesures +économiques +immédiatement +nécessaires +visent +principalement +à +assurer +un +développement +suffisant +et +équilibré +de +la +production +, +combattre +l +' +inflation +et +la +vie +chère +, +sauvegarder +l +' +emploi +et +rééquilibrer +les +échanges +. +c +' +est +pour +atteindre +ces +buts +qu +' +elles +doivent +s +' +attaquer +aux +privilèges +, +aux +profits +et +aux +moyens +de +domination +des +grandes +sociétés +capitalistes +. +§ +énoncées +précisément +dans +le +programme +d +' +action +du +39ème +* +congrès +, +elles +comportent +: +§ +contre +l +' +inflation +et +la +vie +chère +$ +: +_ +des +réductions +de +TVA +, +le +blocage +temporaire +de +certains +prix +et +tarifs +publics +, +la +réduction +et +le +contrôle +des +bénéfices +ainsi +que +la +limitation +du +crédit +pour +les +grandes +sociétés +, +la +défense +de +l +' +épargne +populaire +. +§ +pour +l +' +emploi +$ +: +_ +une +politique +de +développement +créatrice +d +' +emplois +fondée +sur +un +solide +marché +intérieur +développé +, +notamment +par +l +' +amélioration +du +pouvoir +d +' +achat +, +une +politique +industrielle +s +' +appuyant +sur +le +secteur +public +, +un +développement +des +équipements +collectifs +améliorant +les +conditions +d +' +existence +, +un +développement +régional +réel +. +§ +pour +l +' +équilibre +des +échanges +extérieurs +$ +: +_ +un +développement +diversifié +, +vers +tous +les +pays +et +notamment +les +pays +socialistes +et +du +Tiers +- +Monde +, +des +échanges +commerciaux +et +de +la +coopération +technique +et +scientifique +en +les +fondant +sur +l +' +intérêt +mutuel +, +le +contrôle +des +mouvements +de +capitaux +et +des +investissements +étrangers +en +France +. +§ +pour +assurer +les +besoins +en +énergie +$ +: +_ +des +contrats +de +type +nouveau +avec +les +pays +producteurs +de +pétrole +, +l +' +arrêt +immédiat +des +fermetures +de +puits +de +mine +et +un +plan +d +' +augmentation +de +la +production +charbonnière +, +l +' +utilisation +de +l +' +énergie +hydraulique +, +marémotrice +, +géothermique +, +la +maîtrise +technologique +, +la +protection +de +l +' +environnement +et +la +garantie +de +l +' +approvisionnement +en +combustible +pour +les +centrales +nucléaires +, +la +suppression +des +privilèges +des +sociétés +pétrolières +et +la +nationalisation +immédiate +des +groupes +pétroliers +français +, +le +développement +de +la +recherche +sur +les +sources +de +l +' +avenir +. +§ +ces +revendications +correspondent +à +des +besoins +impérieux +et +justifiés +. +elles +constituent +des +éléments +importants +de +réponse +aux +problèmes +économiques +et +sociaux +actuels +en +favorisant +l +' +emploi +et +la +lutte +contre +l +' +inflation +. +elles +répondent +à +l +' +intérêt +national +. +§ +si +le +* +pouvoir +et +le +* +patronat +en +tenaient +compte +, +des +difficultés +pourraient +être +atténuées +. +§ +mais +il +faut +s +' +attendre +pour +l +' +essentiel +à +une +résistance +acharnée +de +leur +part +, +car +telle +est +leur +nature +de +classe +et +telles +sont +les +exigences +des +intérêts +du +grand +capital +monopoliste +. +§ +l +' +action +revendicative +de +masse +est +et +sera +nécessaire +pour +obtenir +chaque +amélioration +. +§ +la +réduction +du +pouvoir +d +' +achat +des +salaires +, +les +pertes +dues +à +la +réduction +d +' +activité +, +le +chômage +total +et +partiel +, +la +misère +qui +gagne +un +grand +nombre +de +foyers +de +travailleurs +, +loin +d +' +engendrer +la +résignation +, +se +traduisent +par +le +mécontentement +et +la +colère +, +et +une +conscience +plus +élevée +de +la +responsabilité +de +la +politique +du +pouvoir +. +§ +le +patronat +et +le +gouvernement +poussent +chaque +conflit +à +l +' +extrême +tension +. +§ +mais +la +tendance +principale +est +constituée +par +la +combativité +, +l +' +endurance +exceptionnelle +des +travailleurs +, +le +nombre +et +la +durée +des +grèves +en +même +temps +que +par +la +recherche +des +méthodes +d +' +action +les +plus +efficaces +, +les +mieux +adaptées +. +§ +il +est +possible +, +par +l +' +action +, +d +' +imposer +des +succès +marquants +comme +maints +exemples +l +' +ont +déjà +démontré +. +§ +l +' +intransigeance +gouvernementale +et +patronale +conduit +à +une +montée +des +luttes +sociales +, +susceptibles +d +' +atteindre +une +grande +envergure +. +§ +faire +échec +à +la +politique +d +' +austérité +pour +les +travailleurs +, +de +privations +pour +beaucoup +, +implique +une +grande +ténacité +dans +la +lutte +. +§ +il +s +' +agit +d +' +une +bataille +de +longue +haleine +et +d +' +envergure +dans +laquelle +s +' +allient +les +actions +multiformes +et +incessantes +dans +les +entreprises +et +des +mouvements +coordonnés +de +divers +types +$ +: +au +plan +professionnel +ou +au +plan +interprofessionnel +selon +la +nature +des +revendications +essentielles +; +parfois +au +niveau +local +ou +départemental +, +parfois +par +de +grandes +initiatives +d +' +ampleur +nationale +. +§ +dans +tous +les +cas +, +parmi +les +conditions +nécessaires +à +la +conduite +des +luttes +, +l +' +information +de +l +' +opinion +publique +et +la +recherche +de +son +soutien +sont +indispensables +. +§ +ce +sont +les +circonstances +, +les +situations +concrètes +qui +conduisent +à +adopter +les +initiatives +qui +conviennent +le +mieux +dans +chaque +cas +. +§ +et +c +' +est +l +' +ensemble +de +ces +luttes +aux +aspects +diversifiés +, +souvent +très +décentralisées +et +parfois +puissamment +regroupées +qui +constitue +un +mouvement +revendicatif +rassemblant +, +sur +toute +une +période +, +des +forces +de +plus +en +plus +grandes +capables +d +' +imposer +non +seulement +des +reculs +dans +telle +ou +telle +entreprise +ou +branche +mais +au +patronat +et +au +gouvernement +pour +les +objectifs +communs +à +l +' +ensemble +des +travailleurs +. +§ +les +orientations +du +38ème +* +congrès +confédéral +définissant +les +principes +d +' +une +action +efficace +et +responsable +se +sont +pleinement +vérifiées +. +§ +l +' +essentiel +dans +la +conduite +de +la +bataille +présente +est +, +avec +la +persévérance +, +le +souci +plus +indispensable +que +jamais +de +la +plus +large +démocratie +$ +: +démocratie +avec +les +syndiqués +qui +doivent +jouer +leur +rôle +, +démocratie +avec +l +' +ensemble +des +travailleurs +, +pour +tenir +le +plus +grand +compte +de +leurs +besoins +, +de +leur +état +d +' +esprit +, +définir +avec +eux +à +toutes +les +étapes +de +la +lutte +et +rechercher +la +convergence +dans +les +objectifs +et +les +méthodes +d +' +action +. +§ +les +militants +et +les +organisations +de +la +CGT +ont +à +faire +preuve +d +' +audace +pour +se +placer +, +de +la +sorte +, +résolument +à +la +tête +des +luttes +avec +esprit +d +' +initiative +, +de +décision +et +d +' +unité +. +§ +c +' +est +dans +cet +esprit +que +la +CGT +et +la +CFDT +ont +pris +, +dans +toute +la +dernière +période +des +initiatives +d +' +action +et +animé +le +développement +des +luttes +. +§ +l +' +accord +conclu +le +26 +juin +1974 +entre +les +deux +centrales +sur +les +objectifs +communs +, +les +méthodes +de +l +' +action +et +le +renforcement +de +l +' +unité +d +' +action +a +représenté +un +progrès +considérable +dans +les +relations +confédérales +. +il +a +permis +d +' +éliminer +un +grand +nombre +d +' +obstacles +et +a +favorisé +une +amélioration +à +différents +niveaux +quoique +subsistent +bien +des +inégalités +de +situations +. +§ +la +pratique +a +prouvé +$ +: +_ +que +les +divergences +existant +sur +les +questions +fondamentales +de +l +' +avenir +de +la +société +ne +sont +pas +un +obstacle +insurmontable +à +l +' +unité +d +' +action +pour +les +revendications +communes +et +urgentes +pour +les +travailleurs +; +_ +que +les +divergences +sur +les +revendications +et +les +méthodes +de +l +' +action +, +lorsqu +' +elles +existent +, +sont +plus +facilement +surmontées +lorsqu +' +elles +sont +discutées +clairement +et +franchement +avec +les +travailleurs +dont +l +' +appui +est +décisif +; +_ +que +la +pratique +de +l +' +unité +d +' +action +sur +des +bases +claires +favorise +l +' +établissement +de +rapports +fraternels +et +loyaux +, +qu +' +elle +contribue +à +aborder +dans +de +meilleures +conditions +la +discussion +des +divergences +plus +fondamentales +pour +tenter +de +les +réduire +. +tout +progrès +dans +ce +sens +facilite +réciproquement +l +' +unité +d +' +action +; +_ +qu +' +une +bonne +et +saine +unité +suppose +la +vitalité +, +l +' +activité +et +l +' +esprit +d +' +initiative +des +organisations +de +la +CGT +en +tant +que +telles +. +§ +la +CGT +persiste +à +souhaiter +que +l +' +unité +d +' +action +qui +se +développe +avec +la +CFDT +s +' +étende +à +la +FEN +et +à +Force +Ouvrière +. +§ +mais +la +direction +de +la +FEN +en +dépit +des +intentions +qu +' +elle +affirme +est +délibérément +retournée +à +la +collaboration +avec +le +gouvernement +en +signant +un +nouvel +accord +salarial +qui +s +' +inscrit +dans +la +politique +d +' +austérité +. +la +pratique +de +l +' +unité +d +' +action +avec +de +nombreuses +organisations +de +la +FEN +est +fondée +sur +la +défense +des +intérêts +de +classe +des +travailleurs +, +la +lutte +contre +la +crise +et +ses +conséquences +, +pour +faire +reculer +le +pouvoir +et +le +patronat +. +§ +la +CGT +lutte +pour +l +' +unité +avec +la +FEN +en +combattant +les +positions +de +collaboration +de +classe +dans +la +fonction +publique +. +§ +la +direction +confédérale +de +FO +est +devenue +l +' +agent +officiel +et +le +symbole +de +la +collaboration +de +classe +. +elle +s +' +attaque +directement +aux +travailleurs +en +grève +et +apporte +systématiquement +la +caution +de +son +organisation +au +patronat +et +au +gouvernement +. +§ +la +CGT +ne +peut +qu +' +espérer +un +sursaut +contre +cette +dégradation +parmi +les +militants +et +les +organisations +de +Force +Ouvrière +et +la +réalisation +de +l +' +unité +d +' +action +sur +des +bases +de +classe +avec +les +organisations +FO +qui +y +sont +prêtes +. +§ +le +* +congrès +souligne +que +cela +ne +peut +être +possible +que +si +cette +organisation +adopte +enfin +une +attitude +combative +de +défense +des +intérêts +des +travailleurs +. +§ +le +renforcement +et +l +' +élargissement +de +l +' +unité +d +' +action +pour +les +revendications +communes +est +toujours +la +question +actuelle +, +la +tâche +urgente +en +matière +d +' +unité +. +la +CGT +s +' +y +emploie +sans +relâche +. +simultanément +, +elle +ne +s +' +est +jamais +résignée +à +la +division +syndicale +et +maintient +plus +que +jamais +son +objectif +de +réunification +syndicale +. +elle +entend +travailler +à +en +créer +les +conditions +. +§ +dans +cette +perspective +, +elle +a +défini +ses +propres +conceptions +fondées +sur +le +contenu +de +classe +de +son +action +, +le +caractère +de +masse +de +ses +activités +et +la +démocratie +syndicale +assurant +la +véritable +indépendance +d +' +une +organisation +groupant +l +' +ensemble +des +salariés +dans +la +diversité +des +opinions +. +§ +elle +est +prête +à +en +discuter +, +certaine +d +' +aller +au +devant +du +désir +de +la +masse +des +travailleurs +et +particulièrement +des +jeunes +. +< +S10 += +1 +> +rassemblement +des +forces +populaires +pour +la +victoire +du +programme +commun +. +. +< +S10 += +0 +> +§ +des +millions +de +travailleurs +se +persuadent +, +à +l +' +expérience +et +par +l +' +effort +de +conviction +de +la +CGT +, +que +si +l +' +indispensable +action +revendicative +permet +de +résister +à +l +' +agression +permanente +contre +le +niveau +de +vie +, +rien +d +' +essentiel +ni +de +durable +ne +pourra +être +fait +sans +des +changements +profonds +dans +la +société +. +§ +la +crise +étale +toute +la +malfaisance +, +les +tares +et +les +absurdités +d +' +un +système +qui +ne +répond +pas +aux +besoins +du +développement +de +l +' +humanité +et +qui +s +' +avère +incapable +de +résoudre +aucun +des +problèmes +posés +par +notre +époque +. +§ +c +' +est +le +socialisme +qui +représente +l +' +avenir +de +la +société +. +cette +idée +continue +à +progresser +dans +l +' +esprit +des +travailleurs +. +la +CGT +qui +s +' +est +fixée +pour +but +cette +transformation +décisive +conduisant +à +l +' +émancipation +des +travailleurs +, +a +clairement +exposé +ses +conceptions +à +cet +égard +. +son +38ème +* +congrès +les +a +confirmées +. +elle +est +disponible +pour +la +poursuite +de +la +réflexion +et +de +la +discussion +avec +les +travailleurs +et +toutes +les +forces +intéressées +à +ce +but +. +§ +c +' +est +en +poursuivant +cet +objectif +et +en +militant +pour +y +gagner +toujours +plus +de +travailleurs +que +la +CGT +a +engagé +toutes +ses +forces +dans +la +lutte +pour +la +démocratie +économique +et +politique +, +pour +les +changements +profonds +qu +' +il +faut +d +' +urgence +apporter +à +la +société +. +§ +la +conclusion +du +* +programme +commun +de +gouvernement +entre +le +* +parti +communiste +, +le +* +parti +socialiste +et +le +* +mouvement +des +radicaux +de +gauche +en +a +ouvert +la +perspective +. +§ +le +soutien +massif +à +cette +alliance +et +à +ce +programme +lors +de +l +' +élection +présidentielle +a +créé +une +situation +nouvelle +. +§ +la +possibilité +de +faire +parvenir +la +* +gauche +au +pouvoir +pour +appliquer +son +programme +soulève +un +grand +espoir +parmi +les +travailleurs +. +§ +cet +espoir +, +pour +être +pleinement +justifié +, +doit +s +' +accompagner +d +' +une +vue +lucide +des +conditions +de +la +lutte +pour +y +parvenir +. +§ +car +cette +même +perspective +provoque +la +profonde +inquiétude +des +milieux +dirigeants +de +la +haute +bourgeoisie +et +de +toutes +les +forces +de +réaction +qui +ne +restent +pas +passifs +. +§ +le +* +pouvoir +regroupe +toutes +les +forces +de +conservation +sociale +quelle +que +soit +leur +étiquette +. +il +précipite +son +alignement +atlantique +. +il +renforce +le +caractère +personnel +, +autoritaire +du +système +et +en +particulier +sa +mainmise +sur +les +principaux +moyens +d +' +information +. +§ +tout +en +s +' +efforçant +de +maintenir +ainsi +le +pouvoir +qui +lui +convient +le +mieux +, +la +bourgeoisie +multiplie +et +multipliera +constamment +les +manoeuvres +pour +s +' +efforcer +de +dissocier +l +' +alliance +de +la +* +gauche +et +surtout +pour +tenter +de +la +vider +de +son +contenu +. +§ +à +cet +effet +, +le +pouvoir +tente +d +' +entraîner +des +forces +de +la +gauche +à +un +comportement +de +collaboration +de +classe +. +les +campagnes +anticommunistes +sont +destinées +à +diviser +et +à +affaiblir +la +gauche +. +c +' +est +pourquoi +il +est +du +devoir +de +l +' +ensembledes +forces +de +gauche +, +syndicales +et +politiques +, +de +les +combattre +. +§ +car +ce +qui +inquiète +le +plus +le +grand +patronat +dans +l +' +union +de +la +* +gauche +, +ce +sont +ses +objectifs +et +le +contenu +social +et +économique +avancé +de +son +programme +. +§ +c +' +est +aussi +ce +qui +importe +le +plus +aux +travailleurs +et +à +la +CGT +. +§ +la +CGT +a +constamment +défini +, +dans +ses +* +congrès +et +instances +responsables +, +à +partir +de +ses +préoccupations +syndicales +, +ses +positions +indépendantes +quant +aux +perspectives +de +transformation +de +la +société +. +§ +cette +indépendance +, +conforme +aux +intérêts +des +travailleurs +, +ne +peut +pas +se +détacher +des +principes +de +classe +et +, +par +conséquent +, +ne +saurait +être +confondue +avec +une +quelconque +neutralité +. +§ +pendant +de +longues +années +la +CGT +a +lutté +pour +que +se +réalise +l +' +alliance +des +forces +de +gauche +sur +la +base +d +' +un +* +programme +commun +au +contenu +fermement +dirigé +contre +la +domination +des +monopoles +. +§ +elle +a +défini +, +pour +sa +part +, +les +objectifs +qu +' +elle +jugeait +essentiels +dans +ce +but +. +ces +objectifs +figurent +toujours +dans +son +programme +confédéral +. +§ +lorsque +fut +conclu +le +* +programme +commun +de +la +gauche +, +la +CGT +a +fondé +son +soutien +sans +défaillance +sur +le +fait +qu +' +elle +y +retrouvait +l +' +essentiel +de +ses +propres +objectifs +. +§ +c +' +est +avec +ces +mêmes +préoccupations +que +la +CGT +poursuit +son +action +. +§ +l +' +essentiel +, +du +point +de +vue +des +intérêts +de +classe +des +travailleurs +_ +et +par +conséquent +du +point +de +vue +de +la +CGT +_ +est +dans +l +' +application +des +mesures +prévues +par +le +* +programme +commun +$ +: +_ +pour +retirer +aux +monopoles +les +moyens +de +leur +puissance +et +remettre +à +la +* +nation +les +leviers +de +commande +essentiels +de +l +' +économie +, +c +' +est +- +à +- +dire +la +nationalisation +des +secteurs +clés +et +leur +gestion +démocratique +dans +le +cadre +d +' +une +planification +également +démocratique +; +_ +pour +mettre +en +oeuvre +des +mesures +sociales +hardies +répondant +aux +revendications +des +travailleurs +; +_ +pour +développer +, +en +démocratisant +l +' +économie +, +l +' +intervention +active +et +la +participation +de +la +masse +des +travailleurs +à +la +gestion +et +à +la +planification +. +§ +les +mises +au +point +et +ajustements +nécessaires +du +programme +, +qui +doivent +intervenir +en +temps +opportun +pour +tenir +compte +de +la +conjoncture +et +des +conditions +concrètes +devant +lesquelles +sera +placée +la +* +gauche +, +ne +sauraient +en +affecter +les +dispositions +fondamentales +, +celles +qui +sont +destinées +à +donner +les +moyens +du +changement +réel +. +§ +loin +d +' +être +dépassé +, +comme +le +prétendent +ses +détracteurs +, +le +* +programme +commun +est +plus +actuel +et +urgent +que +jamais +, +dans +son +fond +. +§ +non +, +la +crise +n +' +est +pas +fatale +, +l +' +austérité +pour +les +travailleurs +n +' +est +pas +inévitable +et +ne +constitue +pas +une +solution +. +§ +contre +le +pouvoir +actuel +et +les +féodalités +capitalistes +qu +' +il +s +' +agit +d +' +éliminer +, +seules +les +réformes +profondes +contenues +dans +le +* +programme +commun +permettront +de +sortir +le +pays +de +la +crise +, +d +' +assurer +son +développement +et +de +résoudre +d +' +une +manière +neuve +et +efficace +les +problèmes +essentiels +posés +à +la +société +moderne +et +d +' +abord +ceux +qui +importent +le +plus +aux +travailleurs +pour +améliorer +leur +situation +, +leurs +conditions +de +vie +et +de +travail +. +§ +pour +qu +' +elle +devienne +majoritaire +, +l +' +union +de +la +gauche +implique +$ +: +_ +l +' +action +concrète +contre +le +pouvoir +pour +assurer +la +défense +des +intérêts +des +travailleurs +et +la +défense +des +libertés +; +_ +le +rassemblement +et +l +' +union +de +tous +pour +la +mise +en +échec +de +toutes +les +tentatives +de +collaboration +de +classe +; +_ +des +initiatives +multiples +afin +de +gagner +aux +idées +décisives +du +* +programme +commun +des +millions +de +consciences +nouvelles +et +notamment +parmi +les +salariés +et +de +contribuer +au +renforcement +de +leur +détermination +pour +de +véritables +changements +. +§ +c +' +est +dans +cet +esprit +et +pour +ces +objectifs +communs +que +la +CGT +souhaite +voir +se +renforcer +l +' +* +union +de +la +gauche +. +§ +elle +travaillera +pour +sa +part +, +sur +la +base +de +ses +positions +de +classe +, +à +gagner +à +ces +conceptions +et +aux +solutions +fondamentales +du +* +programme +commun +, +la +masse +des +travailleurs +. +elle +impulsera +l +' +action +commune +pour +des +buts +concrets +. +elle +contribuera +ainsi +au +renforcement +de +l +' +* +union +de +la +gauche +et +à +la +réalisation +du +rassemblement +majoritaire +qui +assurera +sa +victoire +et +l +' +application +de +son +programme +. +< +S10 += +1 +> +dans +l +' +intérêt +des +travailleurs +$ +: +puissance +, +capacité +d +' +organisation +, +d +' +initiative +et +d +' +influence +de +la +CGT +. +. +< +S10 += +0 +> +§ +défendre +les +intérêts +des +travailleurs +dans +une +situation +aussi +complexe +, +quand +la +lutte +de +classe +atteint +un +tel +degré +; +les +aider +à +s +' +orienter +, +à +s +' +organiser +pour +intervenir +eux +- +mêmes +efficacement +; +les +rassembler +par +millions +dans +la +lutte +pour +les +transformations +sociales +indispensables +$ +: +il +est +impossible +d +' +accomplir +ces +tâches +sans +un +renforcement +considérable +de +la +CGT +, +en +quantité +comme +en +qualité +. +§ +les +travailleurs +de +toutes +catégories +et +de +toutes +professions +ne +peuvent +se +passer +d +' +une +CGT +active +, +vivante +, +présente +partout +, +capable +de +faire +face +à +ses +responsabilités +en +toutes +circonstances +, +ce +qui +suppose +à +la +fois +le +recrutement +systématique +de +nouveaux +adhérents +, +l +' +exercice +d +' +une +large +démocratie +syndicale +et +la +diffusion +des +idées +de +la +CGT +$ +: +trois +conditions +indispensables +au +syndicalisme +de +masse +et +donc +à +l +' +efficacité +de +l +' +action +syndicale +. +< +S10 += +1 +> +syndiquer +massivement +les +travailleurs +. +. +< +S10 += +0 +> +§ +c +' +est +à +partir +de +ces +préoccupations +que +l +' +année +1974 +a +marqué +une +ouverture +dans +la +voie +d +' +un +recrutement +important +et +permanent +et +de +la +création +d +' +un +grand +nombre +d +' +organisations +là +où +elles +n +' +existaient +pas +. +§ +les +résultats +obtenus +en +1974 +, +avec +308000 +adhésions +et +3400 +bases +nouvelles +, +sont +encourageants +mais +ils +ne +représentent +que +le +début +d +' +une +attitude +nouvelle +pour +placer +les +forces +organisées +de +la +CGT +en +concordance +avec +son +influence +et +ses +responsabilités +. +§ +il +s +' +agit +, +chaque +année +, +de +progresser +au +rythme +de +nombreuses +centaines +de +milliers +d +' +adhérents +et +de +milliers +d +' +organisations +nouvelles +. +§ +ce +résultat +ne +peut +être +atteint +que +par +une +activitéde +masse +s +' +appuyant +sur +une +prise +de +conscience +générale +de +tous +les +militants +, +de +tous +les +syndiqués +et +un +travail +systématique +, +organisé +, +dirigé +par +les +directions +syndicales +aux +différents +niveaux +. +§ +le +renforcement +numérique +doit +s +' +accompagner +d +' +un +perfectionnement +général +du +travail +des +organisations +de +la +CGT +$ +: +direction +collective +pour +assurer +entièrement +nos +responsabilités +dans +tous +les +domaines +. +promotion +de +forces +militantes +nouvelles +représentatives +de +la +diversité +de +la +CGT +aux +responsabilités +et +tout +particulièrement +les +femmes +qui +prennent +une +place +de +plus +en +plus +grande +dans +l +' +action +et +la +vie +syndicale +et +des +jeunes +gens +et +jeunes +filles +; +formation +de +centaines +de +milliers +de +militants +de +toutes +responsabilités +. +§ +donner +à +la +CGT +un +caractère +de +masse +dans +toute +sa +vie +et +son +action +exige +également +de +veiller +aux +intérêts +de +chaque +catégorie +de +travailleurs +, +de +comprendre +leurs +besoins +, +leurs +préoccupations +. +cela +exige +de +déployer +un +travail +d +' +organisation +et +une +activité +spécifique +qui +tiennent +compte +de +leurs +revendications +particulières +, +de +leur +sensibilité +propre +à +l +' +égard +des +revendications +générales +et +des +problèmes +d +' +ensemble +de +tous +les +travailleurs +. +§ +ce +travail +spécifique +, +pour +être +efficace +, +doit +s +' +appuyer +sur +l +' +activité +de +l +' +ensemble +des +organisations +de +la +CGT +. +§ +cet +ensemble +de +préoccupations +qui +concernent +toutes +les +organisations +de +la +CGT +à +tous +les +échelons +s +' +impose +particulièrement +dans +les +grandes +entreprises +en +raison +de +leur +place +dans +la +vie +économique +et +sociale +, +dans +les +luttes +. +< +S10 += +1 +> +développer +et +perfectionner +la +démocratie +syndicale +. +. +< +S10 += +0 +> +§ +c +' +est +pour +des +raisons +importantes +que +la +CGT +poursuit +avec +insistance +une +campagne +intérieure +pour +le +développement +de +la +démocratie +syndicale +$ +: +c +' +est +la +clé +du +perfectionnement +des +organisations +de +la +CGT +ainsi +que +la +solution +de +nombreux +problèmes +qui +s +' +y +rapportent +, +l +' +état +actuel +de +sa +pratique +au +sein +de +nos +organisations +réclame +qu +' +on +poursuive +avec +une +plus +grande +attention +les +efforts +entrepris +. +§ +la +démocratie +syndicale +consiste +principalement +à +assurer +la +participation +active +des +syndiqués +à +la +vie +de +l +' +organisation +, +à +la +détermination +de +son +orientation +et +de +ses +décisions +. +§ +elle +suppose +la +plus +large +expression +des +syndiqués +, +l +' +information +et +la +circulation +des +idées +. +§ +le +38ème +* +congrès +a +défini +les +principales +conditions +nécessaires +à +la +démocratie +syndicale +. +§ +plus +est +grande +la +participation +des +adhérents +à +la +vie +de +l +' +organisation +, +meilleures +sont +les +décisions +, +plus +étroits +sont +les +liens +du +syndicat +avec +les +travailleurs +par +l +' +intermédiaire +de +ses +adhérents +mieux +informés +, +plus +nombreux +les +syndiqués +qui +prennent +une +part +même +modeste +, +au +travail +syndical +, +plus +nombreux +enfin +ceux +qui +deviennent +des +militants +. +§ +par +là +, +le +syndicat +décuple +son +efficacité +dans +son +orientation +, +dans +la +mise +en +activité +des +forces +indispensables +pour +faire +face +à +toutes +ces +obligations +, +dans +les +moyens +d +' +un +plus +grand +recrutement +, +d +' +une +meilleure +promotion +de +cadres +. +§ +par +là +, +il +donne +pleinement +l +' +image +, +à +tous +les +échelons +, +de +la +grande +organisation +de +masse +qu +' +est +la +CGT +et +qu +' +elle +veut +être +toujours +mieux +, +pour +être +" +la +CGT +partout +et +pour +tous +" +. +§ +lorsque +les +militants +responsables +sont +animés +par +ces +préoccupations +et +en +assimilent +la +portée +, +ils +trouvent +plus +aisément +les +solutions +pour +y +parvenir +, +les +mesures +d +' +organisation +et +le +style +de +direction +. +< +S10 += +1 +> +porter +la +bataille +des +idées +à +la +mesure +de +nos +responsabilités +. +. +< +S10 += +0 +> +§ +c +' +est +à +partir +de +la +même +préoccupation +$ +: +le +caractère +de +masse +de +toute +l +' +activité +syndicale +, +qu +' +il +convient +d +' +envisager +la +bataille +des +idées +. +§ +le +38ème +* +congrès +a +lancé +le +mot +d +' +ordre +$ +: +" +gagner +des +millions +de +consciences +" +car +telle +est +l +' +envergure +de +la +bataille +sociale +. +§ +c +' +est +à +des +millions +de +travailleurs +qu +' +il +faut +apporter +constamment +les +idées +, +les +réponses +, +les +réflexions +, +les +propositions +de +la +CGT +pour +qu +' +ils +puissent +se +déterminer +, +trouver +leur +voie +en +dépit +du +martèlement +des +idées +du +* +capital +qui +dispose +de +tous +les +moyens +essentiels +d +' +information +. +§ +c +' +est +une +condition +absolue +de +l +' +efficacité +de +l +' +action +revendicative +comme +de +la +lutte +pour +les +changements +plus +fondamentaux +et +de +l +' +accomplissement +de +toutes +les +tâches +de +la +CGT +. +§ +la +mettre +en +mesure +de +faire +face +à +ses +responsabilités +, +c +' +est +à +la +fois +la +doter +de +l +' +organisation +correspondant +aux +exigences +de +la +lutte +gigantesque +de +notre +époque +et +assurer +un +rayonnement +permanent +et +infiniment +plus +large +à +ses +idées +. +§ +tout +l +' +ensemble +de +l +' +activité +d +' +information +et +de +propagande +de +la +CGT +et +de +ses +organisations +doit +être +adapté +à +cette +responsabilité +, +à +cette +obligation +d +' +information +, +d +' +explication +et +d +' +éducation +de +masse +; +c +' +est +dire +qu +' +il +convient +de +donner +à +la +propagande +syndicale +les +moyens +, +l +' +efficacité +, +la +diversité +qui +correspondent +à +ces +exigences +en +adoptant +les +méthodes +modernes +et +en +consacrant +les +forces +nécessaires +pour +y +parvenir +. +§ +et +d +' +abord +l +' +effort +de +diffusion +de +toute +la +presse +confédérale +et +principalement +du +moyen +central +et +permanent +d +' +expression +de +la +CGT +auprès +de +l +' +ensemble +des +travailleurs +: +" +la +Vie +- +Ouvrière +" +. +§ +ce +qui +vaut +pour +la +conception +du +recrutement +qui +doit +prévaloir +vaut +pour +celle +de +la +diffusion +de +" +la +Vie +- +Ouvrière +" +. +car +l +' +organisation +en +masse +des +travailleurs +dans +la +CGT +doit +aller +de +pair +avec +leur +connaissance +, +en +masse +des +idées +de +la +CGT +et +par +conséquent +avec +la +lecture +régulière +de +son +hebdomadaire +de +masse +. +< +S10 += +1 +> +la +solidarité +ouvrière +internationale +et +l +' +unité +d +' +action +syndicale +en +Europe +. +. +< +S10 += +0 +> +§ +les +progrès +de +la +détente +_ +fait +principal +de +la +situation +internationale +_ +sont +un +succès +pour +les +travailleurs +, +les +peuples +, +toutes +les +forces +de +progrès +. +ils +traduisent +le +recul +des +positions +de +l +' +impérialisme +dans +le +monde +; +les +résultats +, +dans +leur +édification +, +des +pays +socialistes +, +qui +ne +connaissent +ni +crise +, +ni +inflation +, +ni +chômage +, +le +renforcement +des +luttes +de +classe +des +travailleurs +dans +les +grands +pays +capitalistes +, +les +nouveaux +succès +du +mouvement +de +libération +nationale +caractérisés +par +la +victoire +historique +des +travailleurs +et +des +peuples +du +Viêt +- +Nam +et +du +Cambodge +contre +l +' +impérialisme +américain +, +le +renforcement +de +l +' +indépendance +économique +et +politique +contre +le +néocolonialisme +de +différents +pays +libérés +. +§ +à +cet +égard +, +la +CGT +considère +parfaitement +légitimes +les +mesures +prises +par +les +pays +producteurs +de +pétrole +et +d +' +autres +matières +premières +pour +obtenir +des +prix +normaux +. +elle +exprime +sa +solidarité +à +ceux +qui +sont +engagés +dans +une +voie +démocratique +et +anticapitaliste +. +§ +elle +agit +pour +la +sauvegarde +de +la +paix +, +la +sécurité +en +Europe +et +dans +le +monde +, +la +coopération +internationale +. +§ +elle +exige +du +gouvernement +une +politique +active +de +paix +et +d +' +indépendance +nationale +. +§ +le +courant +pour +la +démocratie +se +renforce +. +il +s +' +est +manifesté +en +particulier +par +le +renversement +de +la +dictature +fasciste +au +Portugal +et +en +Grèce +. +§ +contraint +au +recul +, +l +' +impérialisme +s +' +acharne +pourtant +à +préserver +sa +domination +par +tous +les +moyens +lorsqu +' +il +en +a +la +possibilité +$ +: +la +bestialité +des +généraux +putschistes +au +Chili +en +est +l +' +illustration +et +les +menaces +d +' +intervention +militaire +contre +les +pays +producteurs +de +pétrole +. +§ +la +CGT +renforcera +son +action +de +solidarité +avec +les +travailleurs +, +les +syndicats +, +les +démocrates +du +Chili +, +d +' +Espagne +et +tous +ceux +qui +subissent +la +répression +, +le +joug +fasciste +, +le +racisme +à +travers +le +monde +. +§ +la +CGT +poursuivra +son +action +avec +les +autres +forces +progressistes +de +France +pour +la +solidarité +aux +peuples +du +Viêt +- +Nam +et +du +Cambodge +. +§ +elle +se +prononce +pour +un +règlement +des +problèmes +du +Moyen +- +Orient +qui +, +mettant +fin +à +la +politique +agressive +des +dirigeants +d +' +Israël +, +restitue +leurs +territoires +aux +pays +arabes +, +rétablisse +, +conformément +aux +décisions +de +l +' +ONU +, +le +peuple +palestinien +dans +ses +droits +nationaux +et +assure +le +droit +à +l +' +existence +et +la +sécurité +de +tous +les +* +états +de +cette +région +, +y +compris +l +' +* +état +d +' +Israël +. +§ +affirmant +la +permanence +de +son +attitude +anticolonialiste +et +antinéocolonialiste +, +la +CGT +salue +les +victoires +remportées +par +les +peuples +d +' +Angola +, +du +Mozambique +et +de +Guinée +- +Bissau +, +et +se +déclare +solidaire +des +peuples +d +' +Afrique +en +lutte +pour +conquérir +ou +consolider +leur +indépendance +économique +. +§ +elle +appuie +la +lutte +des +travailleurs +et +des +peuples +des +* +départements +d +' +Outre +- +Mer +et +des +* +territoires +d +' +Outre +- +Mer +pour +la +liquidation +du +colonialisme +français +et +l +' +octroi +aux +DOM +du +statut +d +' +autonomie +réclamé +par +les +populations +de +ces +pays +. +§ +des +changements +importants +et +positifs +se +produisent +dans +le +mouvement +syndical +à +travers +le +monde +. +§ +dans +les +pays +capitalistes +, +frappés +par +la +crise +et +où +sévissent +les +sociétés +multinationales +, +les +travailleurs +en +subissent +les +mêmes +conséquences +$ +: +inflation +, +chômage +, +attaques +contre +leur +niveau +de +vie +et +leurs +droits +. +§ +les +luttes +de +classe +s +' +y +aiguisent +partout +et +elles +trouvent +leur +reflet +au +sein +même +d +' +organisation +dont +l +' +orientation +est +traditionnellement +axée +vers +la +collaboration +de +classe +et +où +l +' +on +constate +la +progression +des +idées +et +de +la +pratique +d +' +une +attitude +plus +combative +dans +la +défense +des +intérêts +de +classe +des +travailleurs +. +§ +sur +cette +base +, +ainsi +qu +' +en +conséquence +de +l +' +évolution +internationale +, +se +développe +un +mouvement +favorable +au +rapprochement +entre +organisations +syndicales +de +différentes +affiliations +internationales +et +entre +les +centrales +internationales +elles +- +mêmes +. +§ +la +CGT +contribue +, +par +ses +initiatives +directes +et +par +sa +participation +active +à +l +' +action +de +la +FSM +, +à +favoriser +cette +évolution +, +pour +aboutir +à +un +vaste +développement +de +l +' +unité +d +' +action +internationale +pour +des +objectifs +concrets +communs +répondant +aux +intérêts +des +travailleurs +, +de +la +démocratie +et +de +la +paix +et +par +des +actions +effectives +. +§ +elle +attache +la +plus +grande +importance +au +renforcement +de +l +' +influence +de +la +FSM +dont +le +rôle +et +le +prestige +international +grandissent +en +raison +de +son +action +et +des +idées +de +lutte +conséquente +qu +' +elle +représente +. +la +CGT +renforcera +en +particulier +son +soutien +aux +UIS +de +la +FSM +dont +le +rôle +est +capital +pour +l +' +organisation +concrète +de +la +défense +internationale +effective +des +intérêts +des +travailleurs +contre +les +sociétés +multinationales +. +§ +la +CGT +qui +entretient +de +longue +date +une +coopération +fraternelle +avec +les +syndicats +des +pays +socialistes +, +entend +la +développer +encore +et +contribuer +à +faire +connaître +avec +objectivité +la +réalité +et +les +résultats +des +pays +socialistes +qui +intéressent +au +plus +haut +point +les +travailleurs +français +. +§ +c +' +est +naturellement +en +Europe +que +les +responsabilités +de +la +CGT +sont +les +plus +grandes +. +c +' +est +aussi +sur +notre +continent +que +l +' +on +assiste +à +des +évolutions +parmi +les +plus +importantes +dans +le +mouvement +syndical +. +§ +une +première +rencontre +unitaire +des +centrales +syndicales +de +tous +les +pays +d +' +Europe +, +capitalistes +et +socialistes +, +sans +considération +d +' +affiliation +internationale +s +' +est +tenue +en +janvier +1974 +. +§ +une +deuxième +rencontre +de +toutes +ces +centrales +a +eu +lieu +en +février +- +mars +1975 +. +des +perspectives +concrètes +existent +pour +que +s +' +instaurent +au +- +delà +des +relations +bilatérales +, +des +relations +multilatérales +, +collectives +, +sans +discrimination +pour +étudier +des +problèmes +syndicaux +, +économiques +et +sociaux +d +' +intérêt +commun +. +§ +la +CGT +y +attache +une +très +grande +importance +et +entend +y +coopérer +de +son +mieux +, +dans +un +esprit +constructif +de +compréhension +mutuelle +. +elle +considère +qu +' +il +est +nécessaire +et +possible +d +' +établir +des +rapports +et +une +coopération +suivis +entre +toutes +les +centrales +des +pays +d +' +Europe +, +quel +que +soit +leur +régime +économique +et +social +. +§ +en +Europe +occidentale +il +est +urgent +d +' +aller +de +l +' +avant +. +dans +tous +ces +pays +, +les +travailleurs +se +heurtent +à +la +même +situation +économique +, +à +des +politiques +gouvernementales +et +patronales +similaires +et +subissent +le +poids +des +sociétés +multinationales +. +§ +au +sein +de +la +CEE +, +qui +s +' +est +avérée +incapable +de +promouvoir +une +véritable +politique +sociale +malgré +les +promesses +réitérées +, +les +travailleurs +sont +appelés +au +" +partage +des +sacrifices +" +et +subissent +les +mêmes +méthodes +d +' +austérité +. +ils +se +heurtent +à +l +' +emprise +accrue +des +grandes +féodalités +financières +et +industrielles +de +chaque +pays +et +internationales +, +notamment +américaines +. +§ +la +coopération +syndicale +est +urgente +, +pour +des +initiatives +communes +dans +les +institutions +de +la +CEE +, +pour +démocratiser +ces +institutions +. +cette +coopération +est +nécessaire +pour +promouvoir +une +Europe +antimonopoliste +, +démocratique +et +pacifique +. +§ +au +- +delà +des +problèmes +propres +aux +pays +membres +de +la +CEE +, +se +pose +avec +acuité +la +recherche +de +l +' +unité +d +' +actionentre +les +syndicats +de +tous +les +pays +d +' +Europe +occidentale +. +§ +la +constitution +de +la +CES +a +représenté +un +événement +nouveau +. +son +ouverture +aux +centrales +affiliées +à +la +CMT +( +dont +la +CFDT +) +puis +à +la +CGIL +marque +un +progrès +. +§ +si +l +' +évolution +unitaire +est +le +trait +dominant +, +il +n +' +en +reste +pas +moins +que +demeurent +encore +dans +certaines +centrales +des +attitudes +héritées +de +la +guerre +froide +qui +maintiennent +des +blocages +artificiels +. +§ +la +CGT +souhaite +participer +à +la +CES +dans +un +esprit +constructif +et +réaliste +. +elle +ne +saurait +évidemment +admettre +des +conditions +discriminatoires +d +' +aucune +sorte +. +§ +de +la +même +manière +qu +' +elle +trouve +naturel +que +les +organisations +affiliées +à +la +CISL +ou +à +la +CMT +aient +conservé +leur +affiliation +internationale +, +elle +entend +conserver +librement +son +affiliation +à +la +FSM +, +sans +aucune +espèce +de +" +distance +" +. +la +CGT +entend +être +un +partenaire +syndical +loyal +, +sérieux +mais +égal +en +tous +points +. +§ +des +tâches +urgentes +et +communes +sollicitent +les +organisations +syndicales +en +Europe +occidentale +. +les +revendications +essentielles +de +défense +des +intérêts +des +travailleurs +sont +communes +. +sous +une +forme +ou +sous +une +autre +, +il +faut +faire +face +ensemble +avec +tout +l +' +esprit +de +compréhension +nécessaire +. +il +faut +développer +des +initiatives +d +' +action +unitaires +; +le +plus +tôt +sera +le +mieux +. +< +S10 += +1 +> +conclusion +. +. +< +S10 += +0 +> +§ +l +' +année +1975 +est +celle +du +80ème +anniversaire +de +la +* +confédération +générale +du +travail +. +§ +dès +sa +création +, +la +CGT +a +inscrit +dans +ses +statuts +les +orientations +essentielles +qui +guident +aujourdhui +sa +vie +et +son +action +. +§ +organisation +de +masse +ouverte +à +tous +les +salariés +, +elle +affirmait +en +1895 +la +nécessité +de +la +lutte +pour +défendre +leurs +intérêts +de +classe +et +son +but +$ +: +la +suppression +de +l +' +exploitation +des +salariés +par +les +patrons +. +§ +depuis +cette +période +, +la +CGT +a +été +au +coeur +des +luttes +et +de +l +' +histoire +du +mouvement +ouvrier +, +du +mouvement +syndical +, +et +de +l +' +histoire +de +la +France +tout +particulièrement +lors +du +* +front +populaire +, +pendant +la +* +résistance +à +l +' +occupant +nazi +, +et +dans +les +années +qui +ont +suivi +la +* +libération +. +§ +les +connaissances +, +la +conscience +, +l +' +expérience +historique +acquises +dans +les +luttes +de +classe +, +dans +la +vie +nationale +, +dans +la +solidarité +internationale +et +les +rapports +avec +le +mouvement +syndical +du +monde +entier +ont +profondément +transformé +la +CGT +en +conservant +le +meilleur +de +ses +orientations +initiales +. +§ +au +cours +des +trente +années +qui +ont +suivi +la +deuxième +guerre +mondiale +, +la +CGT +a +connu +les +épreuves +de +la +scission +et +de +la +guerre +froide +, +la +lutte +contre +le +colonialisme +français +, +le +combat +entrepris +dès +le +début +contre +la +mainmise +des +monopoles +sur +l +' +* +état +et +contre +le +pouvoir +personnel +en +France +. +§ +des +éléments +historiques +nouveaux +sont +apparus +dans +ce +combat +. +§ +l +' +unité +d +' +action +entre +la +CGT +et +la +CFDT +est +devenue +un +élément +important +de +la +vie +et +des +luttes +syndicales +. +§ +mai +1968 +a +été +le +premier +grand +affrontement +à +l +' +échelle +nationale +entre +les +travailleurs +et +le +pouvoir +des +grandes +sociétés +capitalistes +. +mouvement +revendicatif +, +il +posait +par +sa +dimension +même +le +problème +d +' +un +changement +radical +de +politique +et +de +transformations +profondes +dans +la +société +. +il +a +servi +de +révélateur +de +la +crise +. +depuis +, +l +' +approfondissement +de +celle +- +ci +fait +apparaître +davantage +que +c +' +est +tout +le +système +actuel +, +le +capitalisme +monopoliste +d +' +* +état +, +qui +est +en +cause +. +§ +l +' +* +union +de +la +gauche +sur +le +* +programme +commun +, +voulue +par +la +CGT +et +les +succès +considérables +qu +' +elle +a +remportés +offrent +aux +travailleurs +et +à +la +France +la +perspective +proche +de +profondes +réformes +démocratiques +et +d +' +un +progrès +économique +et +social +qui +peuvent +, +si +la +réussite +de +cette +expérience +est +réalisée +, +gagner +la +grande +majorité +des +travailleurs +et +du +pays +à +l +' +idée +de +la +transformation +socialiste +de +la +société +. +§ +cette +perspective +se +situe +dans +un +monde +en +pleine +évolution +et +transformation +, +et +ce +contexte +contribue +à +la +rendre +possible +. +§ +le +capitalisme +est +, +au +sein +même +des +grands +pays +les +plus +développés +, +dans +une +crise +profonde +qui +durera +; +le +socialisme +progresse +et +se +construit +, +le +colonialisme +direct +est +en +voie +de +liquidation +complète +, +et +les +pays +du +Tiers +- +Monde +luttent +pour +leur +indépendance +économique +. +plusieurs +régimes +fascistes +sont +tombés +et +l +' +impérialisme +est +en +recul +. +§ +cette +évolution +est +le +résultat +d +' +une +lutte +longue +et +difficile +menée +par +les +travailleurs +, +les +forces +progressistes +et +les +peuples +du +monde +entier +. +la +classe +ouvrière +, +dans +chaque +pays +et +à +l +' +échelle +internationale +a +toujours +été +l +' +élément +le +plus +solide +et +le +plus +résolu +dans +le +combat +pour +la +démocratie +, +la +paix +, +l +' +indépendance +des +peuples +et +le +progrès +. +dans +les +heures +les +plus +difficiles +elle +n +' +abandonne +pas +la +lutte +. +§ +la +CGT +est +consciente +d +' +avoir +, +pour +sa +part +syndicale +et +nationale +, +contribué +à +ce +mouvement +historique +dans +le +monde +entier +, +au +long +des +80 +ans +de +sa +propre +histoire +. +elle +reste +et +restera +fidèle +à +sa +mission +, +conforme +aux +intérêts +et +au +rôle +de +la +classe +ouvrière +et +de +l +' +ensemble +des +travailleurs +. +< +S00 += +02 +> +< +S01 += +003 +> +< +S02 += +001 +> +< +S03 += +002 +> +< +Sda += +1975 +> +< +Sdm += +06 +> +< +Sat += +0 +> +< +S10 += +1 +> +programme +d +' +action +. +. +l +' +action +pour +la +satisfaction +des +grands +objectifs +revendicatifs +. +. +< +S10 += +0 +> +§ +dans +une +période +marquée +par +la +crise +profonde +du +système +capitaliste +et +la +volonté +du +pouvoir +de +renforcer +par +tous +les +moyens +la +puissance +des +groupes +financiers +et +industriels +les +plus +importants +, +la +politique +du +gouvernement +et +du +patronat +est +fondée +sur +une +accentuation +de +l +' +exploitation +capitaliste +. +l +' +inflation +constitue +un +moyen +d +' +accentuer +et +de +généraliser +cette +exploitation +. +§ +peser +sur +le +pouvoir +d +' +achat +, +limiter +sa +progression +, +constitue +l +' +objectif +avoué +du +patronat +et +de +l +' +* +état +patron +. +< +S10 += +1 +> +pouvoir +d +' +achat +. +. +salaires +. +. +< +S10 += +0 +> +§ +dans +ces +conditions +, +le +problème +des +salaires +et +du +pouvoir +d +' +achat +est +plus +que +jamais +la +préoccupation +première +et +permanente +des +travailleurs +et +du +mouvement +syndical +, +parce +qu +' +il +détermine +, +dans +une +mesure +décisive +, +le +niveau +de +vie +du +salarié +et +qu +' +il +est +l +' +enjeu +de +la +lutte +quotidienne +avec +le +capital +. +la +progression +du +pouvoir +d +' +achat +représente +un +moyen +efficace +pour +assurer +le +plein +emploi +et +le +développement +de +l +' +économie +. +§ +la +CGT +développe +son +action +conjointement +pour +$ +: +_ +l +' +augmentation +des +salaires +compte +tenu +, +tout +à +la +fois +, +de +leur +niveau +scandaleusement +insuffisant +pour +certaines +catégories +et +dans +certains +secteurs +professionnels +et +de +l +' +écart +qui +s +' +est +creusé +, +en +général +, +entre +les +salaires +et +les +prix +; +_ +la +garantie +du +pouvoir +d +' +achat +s +' +appliquant +aux +salaires +ainsi +revalorisés +; +_ +la +progression +du +pouvoir +d +' +achat +; +_ +la +remise +en +ordre +des +salaires +et +systèmes +de +rémunération +. +< +S10 += +1 +> +garantie +du +pouvoir +d +' +achat +des +salaires +. +. +< +S10 += +0 +> +§ +la +poussée +inflationniste +que +l +' +on +observe +dans +notre +pays +conduit +naturellement +les +travailleurs +à +revendiquer +des +mesures +de +protection +de +leur +pouvoir +d +' +achat +. +§ +la +garantie +effective +du +pouvoir +d +' +achat +des +salaires +, +pour +tous +les +salariés +, +suppose +l +' +établissement +d +' +un +véritable +système +national +et +interprofessionnel +d +' +échellemobile +, +assurant +périodiquement +et +à +intervalles +rapprochés +le +relèvement +automatique +des +salaires +et +traitements +, +en +fonction +des +hausses +des +prix +intervenues +, +avec +compensation +pour +les +pertes +subies +dans +la +période +antérieure +. +§ +elle +suppose +aussi +la +suppression +dans +la +législation +des +interdictions +ou +limitation +des +clauses +d +' +indexation +. +§ +l +' +évolution +du +coût +de +la +vie +doit +être +établie +par +un +nouvel +indice +reflétant +la +réalité +des +prix +, +qui +doit +être +élaboré +en +accord +avec +les +organisations +syndicales +et +familiales +. +< +S10 += +1 +> +progression +du +pouvoir +d +' +achat +des +salaires +. +. +< +S10 += +0 +> +§ +la +progression +du +pouvoir +d +' +achat +doit +permettre +la +satisfaction +des +besoins +nouveaux +qui +apparaissent +comme +des +exigences +de +la +vie +à +l +' +étape +actuelle +de +la +société +, +pour +toutes +les +catégories +de +travailleurs +. +§ +elle +est +un +impératif +du +développement +économique +et +social +de +la +* +nation +et +contribue +à +assainir +la +situation +de +l +' +emploi +. +§ +cette +progression +se +justifie +pleinement +par +l +' +ampleur +des +profits +capitalistes +, +le +développement +du +revenu +national +, +les +progrès +de +l +' +économie +et +l +' +accroissement +considérable +de +la +productivité +du +travail +; +elle +doit +être +assurée +quelle +que +soit +l +' +évolution +de +la +situation +économique +. +§ +le +pouvoir +d +' +achat +des +salaires +de +tous +les +travailleurs +doit +progresser +. +§ +cette +progression +, +plus +importante +pour +les +bas +et +moyens +salaires +, +donc +différenciée +, +doit +être +négociée +au +niveau +des +branches +professionnelles +et +des +entreprises +, +et +pour +tous +les +secteurs +d +' +activité +, +public +et +privé +. +§ +cette +progression +différenciée +doit +s +' +inscrire +dans +une +politique +de +remise +en +ordre +des +systèmes +de +rémunérations +, +ramenant +les +classifications +et +coefficients +à +un +nombre +raisonnable +avec +, +entre +deux +coefficients +successifs +, +des +écarts +significatifs +, +revalorisant +la +hiérarchie +des +catégories +ouvriers +employés +et +techniciens +et +tendant +à +réduire +l +' +écart +hiérarchique +réel +par +un +resserrement +vers +le +haut +. +< +S10 += +1 +> +remise +en +ordre +des +salaires +et +des +systèmes +de +rémunérations +. +. +< +S10 += +0 +> +§ +cette +remise +en +ordre +, +qui +s +' +inscrit +dans +notre +objectif +de +statut +unique +du +manoeuvre +à +l +' +ingénieur +, +doit +être +établie +en +fonction +des +principes +suivants +$ +: +_ +établissement +, +dans +chaque +branche +, +d +' +une +grille +nationale +unique +de +classifications +et +de +salaires +garantis +, +couvrant +toutes +les +catégories +de +salariés +, +du +manoeuvre +au +cadre +, +et +s +' +appliquant +à +tous +, +sans +discrimination +d +' +aucune +sorte +. +_ +ces +grilles +uniques +, +nationales +et +professionnelles +, +devront +comporter +une +définition +des +classifications +, +tenant +compte +des +changements +intervenus +dans +tous +les +domaines +( +scientifiques +, +techniques +, +technologiques +) +des +diplômes +, +de +la +place +et +du +rôle +des +hommes +dans +le +processus +de +production +. +ces +définitions +se +référeront +aux +connaissances +acquises +par +le +travailleur +, +qu +' +elles +soient +sanctionnées +ou +non +par +un +diplôme +, +à +l +' +expérience +qu +' +il +possède +, +aux +initiatives +qu +' +il +peut +prendre +et +aux +responsabilités +qui +lui +incombent +. +_ +les +barèmes +nationaux +de +salaires +garantis +seront +calculés +, +pour +chaque +classification +et +coefficient +correspondant +par +rapport +à +une +valeur +de +point +unique +, +affectée +au +coefficient +100 +. +ces +salaires +garantis +par +conventions +collectives +et +accords +devront +exclure +toutes +les +primes +et +représenter +l +' +essentiel +de +la +rémunération +. +§ +la +réalisation +de +ces +dispositions +essentielles +suppose +$ +: +_ +la +suppression +de +tous +les +systèmes +de +rémunération +basés +sur +les +études +de +postes +; +_ +l +' +intégration +dans +le +salaire +garanti +des +primes +aléatoires +ayant +le +caractère +de +fait +d +' +un +complément +de +salaire +ou +portant +atteinte +à +la +dignité +des +travailleurs +; +_ +l +' +élimination +des +disparités +existantes +entre +des +salariés +de +même +qualification +; +_ +la +suppression +des +abattements +de +zones +et +des +disparités +régionales +; +_ +la +suppression +de +toute +discrimination +basée +sur +l +' +âge +, +le +sexe +ou +la +nationalité +; +_ +la +limitation +des +éléments +de +la +rémunération +liés +au +rendement +par +leur +intégration +partielle +dans +le +salaire +garanti +; +leur +suppression +, +par +voie +contractuelle +, +dans +les +branches +et +les +entreprises +où +les +conditions +existent +pour +les +intégrer +en +totalité +dans +le +salaire +garanti +; +_ +la +garantie +de +la +classification +et +du +salaire +, +en +cas +de +mutation +ou +de +changement +de +poste +de +travail +; +_ +la +suppression +de +la +rémunération +au +rendement +pour +les +femmes +enceintes +, +leur +classification +et +leur +salaire +antérieur +leur +étant +garantis +. +§ +lorsqu +' +une +partie +du +salaire +restera +liée +au +rendement +, +la +partie +mobile +du +salaire +venant +s +' +ajouter +au +salaire +garanti +devra +être +calculée +à +partir +de +celui +- +ci +, +d +' +une +manière +contrôlable +et +claire +pour +les +travailleurs +concernés +, +et +assurer +obligatoirement +une +rémunération +supérieure +au +salaire +garanti +dans +la +catégorie +. +< +S10 += +1 +> +salaire +minimum +interprofessionnel +. +. +< +S10 += +0 +> +§ +la +CGT +estime +qu +' +il +est +indispensable +de +donner +au +salaire +minimum +interprofessionnel +de +croissance +( +SMIC +) +une +valeur +telle +qu +' +elle +constitue +une +véritable +garantie +permettant +une +vie +décente +aux +salariés +dont +les +rémunérations +sont +les +plus +faibles +. +c +' +est +pourquoi +, +elle +demande +que +le +SMIC +soit +porté +à +1700 +francs +par +mois +( +valeur +mai +75 +) +qu +' +il +soit +mensualisé +sur +la +base +de +la +durée +légale +du +travail +( +40 +heures +par +semaine +) +, +que +cette +garantie +mensuelle +soit +assurée +à +tous +les +salariés +, +en +cas +de +réduction +d +' +horaire +au +- +dessous +de +40 +heures +, +et +que +son +pouvoir +d +' +achat +soit +garanti +par +référence +à +un +indice +des +prix +rénové +et +établi +par +voie +de +négociation +. +§ +cette +garantie +minimale +mensuelle +devra +s +' +appliquer +à +l +' +ensemble +des +salariés +et +servir +de +référence +à +l +' +évolution +des +retraites +et +pensions +, +ainsi +que +des +diverses +allocations +sociales +. +cette +dernière +mesure +suppose +la +suppression +du +minimum +garanti +, +qui +sert +d +' +indexation +à +plusieurs +indemnités +et +ne +cesse +de +se +dévaloriser +depuis +1970 +. +§ +la +CGT +demande +que +la +loi +du +2 +janvier +1970 +, +portant +réforme +du +salaire +minimum +interprofessionnel +, +soit +modifiée +pour +que +la +commission +supérieure +des +conventions +collectives +procède +, +deux +fois +par +an +, +à +une +véritable +discussion +sur +la +progression +du +SMIC +, +dont +le +taux +doit +être +fixé +en +tenant +compte +de +l +' +avis +émis +par +la +commission +. +§ +la +CGT +estime +, +en +outre +, +qu +' +il +convient +de +rendre +au +SMIC +le +sens +qu +' +il +avait +à +son +origine +, +c +' +est +- +à +- +dire +qu +' +il +devrait +être +fixé +net +de +toutes +primes +ou +majorations +de +quelque +nature +que +ce +soit +. +§ +par +ailleurs +, +la +loi +doit +interdire +la +fixation +dans +les +conventions +collectives +de +salaires +garantis +inférieurs +au +SMIC +. +< +S10 += +1 +> +mensualisation +et +statut +unique +. +. +< +S10 += +0 +> +§ +la +CGT +considère +que +la +mensualisation +des +ouvriers +, +qui +ne +se +limite +pas +au +seul +paiement +au +mois +du +salaire +, +n +' +est +pas +encore +réalisée +. +§ +pour +que +cette +mensualisation +soit +réelle +, +elle +doit +apporter +les +mêmes +garanties +à +toutes +les +catégories +de +salariés +, +et +permettre +aux +ouvriers +de +chaque +branche +professionnelle +de +bénéficier +de +tous +les +droits +et +avantages +dont +ils +sont +encore +exclus +. +§ +cette +généralisation +sans +restriction +des +droits +, +leurs +améliorations +, +doivent +se +traduire +, +dans +chacun +des +secteurs +professionnels +, +par +l +' +élaboration +d +' +un +statut +unique +national +, +comportant +des +avantages +substantiels +, +applicable +à +toutes +les +catégories +de +travailleurs +et +trouver +place +dans +les +* +conventions +collectives +. +< +S10 += +1 +> +prestations +, +allocations +, +rentes +, +pensions +. +. +< +S10 += +0 +> +§ +la +politique +de +démantèlement +de +la +* +sécurité +sociale +engagée +par +le +* +pouvoir +et +le +* +patronat +particulièrement +depuis +1958 +se +poursuit +sans +relâche +. +après +les +* +ordonnances +de +1967 +la +loi +sur +la +compensation +et +l +' +harmonisation +des +régimes +de +* +sécurité +sociale +constitue +une +nouvelle +et +grave +atteinte +à +la +* +sécurité +sociale +. +le +plan +de +démantèlement +de +cette +institution +, +fondamentale +pour +les +travailleurs +, +est +progressivement +réalisé +. +§ +cette +politique +a +pour +conséquence +une +dévalorisation +continue +des +prestations +et +des +services +rendus +aux +assurés +, +allocataires +et +pensionnés +. +compte +tenu +de +l +' +inflation +ceux +- +ci +connaissent +une +dégradation +constante +de +leur +pouvoir +d +' +achat +. +§ +face +à +cette +situation +, +la +CGT +revendique +en +tout +premier +lieu +le +relèvement +automatique +et +périodique +des +allocations +, +rentes +, +pensions +et +retraites +, +en +fonction +de +la +hausse +des +prix +enregistrée +par +un +nouvel +indice +élaboré +en +accord +avec +les +organisations +syndicales +et +familiales +. +§ +la +CGT +exige +$ +: +pour +les +prestations +sociales +et +les +rentes +$ +: +_ +le +remboursement +à +80 +et +100 +% +des +dépenses +de +santé +, +y +compris +celles +résultant +de +l +' +interruption +de +grossesse +, +remboursement +garanti +par +une +* +convention +médicale +issue +d +' +une +véritable +négociation +entre +les +médecins +et +les +représentants +des +assurés +sociaux +; +_ +l +' +exonération +totale +du +ticket +modérateur +pour +la +longue +maladie +, +les +personnes +âgées +et +les +enfants +de +moins +de +six +ans +, +première +étape +vers +la +gratuité +des +soins +; +_ +l +' +extension +du +tiers +payant +supprimant +l +' +avance +d +' +argent +pour +l +' +hospitalisation +, +la +pharmacie +, +les +soins +dentaires +, +les +analyses +et +examens +de +laboratoire +; +_ +la +fixation +de +l +' +indemnité +journalière +maladie +et +de +la +pension +d +' +invalidité +2ème +catégorie +à +75 +% +du +salaire +avec +un +minimum +égal +à +80 +% +du +SMIC +. +s +' +agissant +de +l +' +indemnité +journalière +versée +à +la +suite +d +' +un +accident +du +travail +ou +d +' +une +maladie +professionnelle +, +elle +devrait +être +portée +à +100 +% +du +salaire +; +_ +l +' +établissement +d +' +un +minimum +de +ressources +égal +au +SMIC +pour +les +handicapés +qui +travaillent +et +à +80 +% +du +SMIC +pour +ceux +dans +l +' +incapacité +de +travailler +. +pour +les +prestations +familiales +$ +: +_ +afin +de +rattraper +les +retards +accumulés +par +les +* +allocations +familiales +, +la +CGT +demande +qu +' +elles +soient +revalorisées +immédiatement +de +30 +% +et +que +leur +progression +soit +assurée +en +fonction +de +l +' +évolution +des +salaires +; +_ +elle +exige +leur +versement +aux +travailleurs +immigrés +dans +les +mêmes +conditions +que +celles +requises +pour +les +nationaux +, +quel +que +soit +le +pays +de +résidence +des +familles +; +_ +elle +se +prononce +pour +une +refonte +du +système +des +prestations +familiales +, +notamment +par +$ +: +_ +la +fusion +du +salaire +unique +et +des +allocations +familiales +, +_ +l +' +attribution +de +la +prestation +dès +le +premier +enfant +sans +aucune +discrimination +et +sans +conditions +de +ressources +; +_ +elle +revendique +l +' +attribution +aux +femmes +salariés +d +' +une +indemnité +de +garde +pour +les +enfants +de +moins +de +trois +ans +quel +que +soit +le +mode +de +garde +adopté +. +§ +pour +les +pensions +et +retraites +$ +: +les +travailleurs +retraités +connaissent +des +conditions +de +vie +très +difficiles +résultant +du +trop +faible +niveau +des +retraites +et +de +leur +insuffisante +progression +face +à +l +' +évolution +du +coût +de +la +vie +. +pour +ces +raisons +et +aussi +parce +que +pour +la +CGT +il +est +fondamental +de +reconnaître +le +droit +à +la +retraite +dans +des +conditions +permettant +de +vivre +décemment +, +elle +exige +$ +: +_ +une +retraite +égale +à +75 +% +de +tous +les +éléments +de +la +rémunération +, +avec +un +montant +minimum +égal +au +SMIC +, +à +60 +ans +pour +les +hommes +et +55 +ans +pour +les +femmes +et +les +salariés +effectuant +des +travaux +pénibles +ou +insalubres +; +_ +une +pension +de +reversion +fixée +, +pour +tous +les +secteurs +, +à +75 +% +de +la +pension +principale +; +_ +la +suppression +des +restrictions +interdisant +le +cumul +d +' +une +pension +propre +et +d +' +une +pension +de +reversion +; +_ +la +revalorisation +des +pensions +et +retraites +en +fonction +de +l +' +évolution +réelle +du +coût +de +la +vie +et +de +la +progression +des +salaires +; +_ +le +paiement +mensuel +et +d +' +avance +des +pensions +et +retraites +; +_ +la +reconnaissance +pour +les +travailleurs +immigrés +de +droits +identiques +à +ceux +des +travailleurs +français +, +quels +que +soient +leur +origine +et +le +pays +de +résidence +des +familles +. +§ +l +' +amélioration +de +la +situation +des +retraités +passe +également +pour +un +très +grand +nombre +d +' +entre +eux +par +une +juste +progression +des +retraites +complémentaires +, +progression +qui +doit +tenir +compte +, +elle +aussi +, +de +l +' +évolution +du +coût +de +la +vie +et +de +celle +des +salaires +. +§ +la +satisfaction +de +ces +revendications +essentielles +qui +doit +permettre +d +' +accorder +à +tous +les +salariés +en +activité +ou +retraités +, +un +meilleur +système +de +protection +sociale +, +ne +peut +résulter +de +transferts +financiers +entre +catégories +. +elle +suppose +que +le +problème +du +financement +de +la +* +sécurité +sociale +fasse +l +' +objet +d +' +un +réexamen +d +' +ensemble +dans +le +respect +de +ce +principe +et +dans +le +cadre +d +' +une +négociation +avec +les +organisations +syndicales +. +la +réforme +du +financement +comporte +notamment +pour +la +CGT +$ +: +_ +la +suppression +des +charges +indues +et +des +transferts +effectués +au +détriment +de +la +sécurité +sociale +; +_ +le +déplafonnement +progressif +des +cotisations +; +_ +la +nationalisation +de +l +' +industrie +pharmaceutique +qui +permettrait +de +réduire +les +coûts +et +les +dépenses +de +l +' +assurancemaladie +en +supprimant +les +gaspillages +et +en +réduisant +le +nombre +des +produits +; +_ +la +suppression +et +la +réduction +du +taux +de +la +TVA +sur +les +biens +et +services +de +santé +ouvrant +droit +aux +prestations +de +* +sécurité +sociale +. +§ +de +telles +dispositions +doivent +s +' +inscrire +dans +le +cadre +d +' +une +véritable +réforme +démocratique +de +la +* +sécurité +sociale +restituant +aux +représentants +élus +des +assurés +la +gestion +de +leur +régime +, +fixant +de +façon +satisfaisante +la +participation +budgétaire +de +l +' +* +état +et +créant +les +conditions +d +' +une +harmonisation +concertée +des +différents +régimes +dans +l +' +intérêt +de +leurs +bénéficiaires +. +§ +s +' +agissant +des +retraites +complémentaires +, +la +CGT +réclame +$ +: +_ +un +réexamen +du +financement +des +régimes +permettant +à +ceux +- +ci +, +au +moyen +notamment +d +' +une +meilleure +participation +patronale +, +de +faire +face +aux +impératifs +d +' +évolution +des +retraites +en +liaison +avec +celle +du +coût +de +la +vie +et +aussi +de +l +' +abaissement +de +l +' +âge +de +la +retraite +; +_ +l +' +harmonisation +des +règlements +, +la +coordination +entre +les +différents +systèmes +en +vue +de +rendre +possible +leur +unification +dans +le +respect +intégral +des +droits +individuels +et +des +droits +collectifs +acquis +; +_ +la +démocratisation +des +* +institutions +de +retraites +complémentaires +à +la +gestion +desquelles +les +retraités +doivent +être +associés +. +< +S10 += +1 +> +la +fiscalité +. +. +< +S10 += +0 +> +§ +le +système +fiscal +actuel +représente +par +son +caractère +de +classe +une +des +injustices +les +plus +flagrantes +du +régime +. +les +exonérations +et +avantages +substantiels +, +accordés +au +cours +des +dix +dernières +années +aux +grandes +sociétés +et +aux +gros +porteurs +de +capitaux +, +ont +été +compensés +par +un +alourdissement +de +la +charge +fiscale +supportée +par +les +salariés +. +§ +très +durement +frappés +par +la +TVA +et +les +impôts +indirects +qui +atteignent +fréquemment +l +' +intégralité +des +ressources +familiales +, +converties +en +dépense +de +consommation +, +les +ménages +de +salariés +en +activité +ou +retraités +sont +en +nombre +croissant +assujettis +à +l +' +impôt +sur +le +revenu +, +celui +- +ci +évoluant +plus +rapidement +que +les +salaires +. +ainsi +, +les +foyers +d +' +ouvriers +et +de +retraités +sont +de +plus +en +plus +nombreux +à +acquitter +cet +impôt +. +les +familles +de +cadres +moyens +ou +supérieurs +, +et +plus +généralement +celles +où +les +femmes +travaillent +, +supportent +, +du +fait +de +sa +forte +augmentation +, +une +charge +fiscale +très +lourde +. +pour +une +grande +partie +des +salariés +, +le +poids +de +la +charge +fiscale +, +liée +à +la +stagnation +, +voire +à +la +diminution +, +des +prestations +familiales +et +sociales +, +aboutit +à +une +régression +de +leur +pouvoir +d +' +achat +global +. +§ +pour +ces +raisons +, +la +CGT +se +prononce +en +faveur +d +' +une +refonte +démocratique +de +l +' +ensemble +du +système +fiscal +. +cette +refonte +devrait +reposer +sur +quelques +grands +principes +essentiels +$ +: +_ +une +répartition +différente +entre +les +différents +impôts +afin +notamment +de +réduire +la +part +résultant +de +la +TVA +, +d +' +assurer +un +meilleur +rendement +de +l +' +impôt +sur +les +sociétés +et +une +imposition +du +capital +; +_ +une +plus +juste +connaissance +des +revenus +de +toutes +les +catégories +de +contribuables +; +_ +des +conditions +d +' +imposition +différentes +pour +les +revenus +du +travail +, +les +revenus +du +capital +et +les +revenus +mixtes +, +la +rémunération +de +la +force +de +travail +ne +pouvant +par +exemple +être +comparée +aux +revenus +du +patrimoine +foncier +acquis +sans +effort +. +§ +dans +ce +cadre +la +CGT +se +prononce +pour +substituer +au +système +du +quotient +familial +un +dispositif +de +réduction +fixe +étudié +de +manière +à +tenir +compte +des +charges +réelles +de +famille +. +§ +dans +l +' +immédiat +la +CGT +exige +l +' +adoption +des +mesures +qui +suivent +: +< +S10 += +1 +> +impôt +sur +la +consommation +$ +: +< +S10 += +0 +> +_ +la +réduction +ou +la +suppression +sur +les +produits +alimentaires +et +pharmaceutiques +, +les +biens +et +services +d +' +intérêt +social +. +la +répercussion +intégrale +dans +les +prix +de +ces +dispositions +fiscales +doit +être +assurée +par +des +mesures +de +contrôle +. +< +S10 += +1 +> +impôt +sur +le +revenu +$ +: +< +S10 += +0 +> +_ +une +refonte +complète +du +barème +assurant +l +' +exonération +des +revenus +inférieurs +au +SMIC +et +allégeant +l +' +imposition +pour +les +petits +et +moyens +salariés +; +_ +la +révision +annuelle +du +barème +en +fonction +de +l +' +indice +des +prix +reconnu +par +les +organisations +syndicales +; +_ +le +relèvement +de +la +déduction +pour +frais +professionnels +de +10 +à +15 +% +avec +plafonnement +. +cette +mesure +étant +justifiée +par +l +' +aggravation +et +la +multiplication +de +ces +frais +. +l +' +indexation +du +plancher +de +déduction +des +frais +professionnels +sur +les +prix +; +_ +l +' +institution +d +' +une +réduction +spéciale +de +15 +% +sur +les +revenus +des +retraités +avec +établissement +d +' +un +plafonnement +; +_ +dans +l +' +attente +de +l +' +attribution +aux +femmes +salariées +d +' +une +indemnité +, +prenant +en +compte +les +frais +résultant +de +la +garde +des +enfants +en +bas +âge +, +la +déduction +des +frais +des +revenus +imposables +; +_ +pour +les +jeunes +salariés +effectuant +leur +année +de +service +militaire +, +exonération +de +l +' +impôt +sur +les +revenus +de +l +' +année +précédant +celui +- +ci +; +possibilité +de +reporter +le +paiement +des +impôts +et +des +tiers +provisionnels +dûs +pour +l +' +année +suivant +le +service +militaire +; +possibilité +d +' +étalement +du +paiement +de +l +' +impôt +pour +certains +salariés +ayant +des +revenus +irréguliers +ou +intermittents +. +§ +la +CGT +rappelle +son +opposition +au +paiement +de +l +' +impôt +sur +le +revenu +par +le +système +de +la +retenue +à +la +source +, +que +le +* +gouvernement +essaie +d +' +introduire +en +partant +du +paiement +mensuel +de +l +' +impôt +. +ce +système +en +effet +, +ne +réglant +aucun +des +véritables +problèmes +( +poids +et +répartition +de +l +' +impôt +) +favoriserait +en +outre +de +nouveaux +transferts +de +charge +au +détriment +des +salariés +. +< +S10 += +1 +> +impôts +locaux +. +. +< +S10 += +0 +> +§ +la +fiscalité +locale +ne +cesse +de +s +' +alourdir +et +elle +frappe +de +plus +en +plus +durement +les +foyers +de +travailleurs +, +même +ceux +ne +disposant +que +de +ressources +modiques +. +§ +les +modifications +actuellement +en +cours +dans +ce +domaine +, +que +le +gouvernement +présente +comme +une +amélioration +, +se +traduisent +au +contraire +par +une +aggravation +des +impôts +payés +par +les +ménages +. +§ +il +est +nécessaire +de +limiter +la +pression +des +impôts +locaux +sur +les +ménages +par +une +réforme +démocratique +se +situant +dans +le +cadre +d +' +une +refonte +des +finances +locales +et +entrainant +une +répartition +plus +juste +, +notamment +entre +les +entreprises +et +les +particuliers +. +§ +en +contrepartie +des +allégements +demandés +, +la +CGT +propose +dans +le +but +d +' +aboutir +à +une +répartition +plus +équitable +de +la +charge +fiscale +et +d +' +assurer +des +recettes +nouvelles +, +les +mesures +suivantes +: +§ +imposition +des +sociétés +et +actionnaires +$ +: +_ +élargissement +de +la +base +de +l +' +impôt +sur +les +sociétés +par +l +' +abrogation +des +régimes +de +faveur +( +amortissements +dégressifs +, +provisions +injustifiées +, +régimes +spéciaux +d +' +imposition +$ +. +. +. +) +; +_ +abrogation +des +mesures +bénéficiant +aux +revenus +du +capital +( +suppression +du +prélèvement +libératoire +, +de +l +' +avoir +fiscal +, +de +l +' +abattement +, +applicable +aux +revenus +fixes +$ +. +. +. +) +. +§ +imposition +du +capital +$ +: +_ +création +d +' +un +impôt +progressif +sur +le +capital +et +l +' +actif +net +des +grandes +sociétés +. +§ +lutte +contre +la +fraude +fiscale +$ +: +la +CGT +demande +de +véritables +mesures +de +nature +à +mettre +fin +à +la +fraude +fiscale +qui +se +situe +essentiellement +au +niveau +des +grandes +sociétés +, +de +leurs +actionnaires +et +de +leurs +dirigeants +. +le +problème +déterminant +étant +celui +de +la +connaissance +exacte +des +revenus +de +toute +nature +, +il +est +indispensable +( +indépendamment +des +mesures +de +publicité +de +l +' +impôt +) +que +l +' +* +administration +dispose +de +moyens +suffisants +pour +exercer +sa +mission +de +contrôle +contre +la +véritable +fraude +. +< +S10 += +1 +> +le +droit +au +travail +le +droit +à +l +' +emploi +, +sa +garantie +, +l +' +indemnisation +du +chômage +. +. +le +droit +à +l +' +emploi +. +. +< +S10 += +0 +> +§ +la +politique +économique +et +sociale +actuelle +aggrave +l +' +insécurité +de +l +' +emploi +et +le +chômage +. +§ +les +moyens +fondamentaux +de +renverser +cette +tendance +sont +contenus +dans +l +' +ensemble +du +présent +programme +. +§ +dans +l +' +immédiat +, +la +CGT +se +prononce +à +nouveau +en +faveur +de +mesures +générales +efficaces +permettant +d +' +améliorer +sensiblement +la +situation +de +l +' +emploi +$ +: +_ +progression +du +pouvoir +d +' +achat +( +stimulant +pour +l +' +économie +) +; +_ +avancement +de +l +' +âge +ouvrant +droit +à +la +retraite +; +_ +réduction +du +temps +de +travail +sans +diminution +de +salaire +et +allègement +de +la +charge +de +travail +individuelle +devant +entraîner +l +' +embauche +d +' +effectifs +supplémentaires +. +§ +ces +mesures +sont +indissociables +de +la +mise +en +oeuvre +d +' +unevéritable +politique +de +développement +économique +qui +offrirait +les +débouchés +nécessaires +à +toutes +les +personnes +désirant +occuper +un +emploi +notamment +aux +jeunes +et +aux +femmes +. +§ +_ +les +textes +légaux +et +contractuels +sont +susceptibles +d +' +apporter +certaines +protections +appréciables +mais +ne +résolvent +pas +le +problème +décisif +de +la +garantie +de +l +' +emploi +et +ne +règlent +que +partiellement +celui +des +garanties +de +ressources +dont +de +nombreux +salariés +sont +exclus +. +§ +pour +atteindre +ces +deux +objectifs +, +la +CGT +formule +les +revendications +suivantes +, +pour +l +' +ensemble +des +salariés +des +secteurs +public +, +nationalisé +et +privé +, +quels +que +soient +leur +âge +, +leur +sexe +ou +leur +nationalité +. +< +S10 += +1 +> +la +garantie +de +l +' +emploi +. +. +< +S10 += +0 +> +§ +_ +droit +à +l +' +information +complète +et +contrôlable +faite +en +temps +utile +des +salariés +, +de +leurs +représentants +et +des +organisations +syndicales +sur +tous +les +problèmes +concernant +l +' +emploi +. +_ +droit +réel +de +discussion +pour +les +syndicats +et +les +représentants +du +personnel +sur +les +mesures +susceptibles +d +' +entraîner +des +compressions +d +' +effectifs +, +des +licenciements +ou +des +modifications +d +' +emploi +, +envisagées +par +les +employeurs +. +_ +droit +de +recours +, +pour +les +syndicats +et +les +représentants +du +personnel +, +à +des +instances +paritaires +et +à +des +instances +juridiques +habilitées +à +cet +effet +en +cas +de +difficultés +dans +l +' +entreprise +$ +: +le +recours +suspend +toute +décision +de +licenciement +. +_ +interdiction +de +tout +licenciement +non +accompagné +d +' +une +mesure +de +reclassement +préalable +, +garantissant +pleinement +les +droits +des +travailleurs +et +leur +assurant +une +situation +équivalente +. +_ +protections +équivalentes +des +salariés +licenciés +en +cas +de +faillite +( +liquidation +de +biens +, +règlement +judiciaire +) +par +la +mise +en +oeuvre +de +la +responsabilité +collective +du +patronat +. +_ +réemploi +obligatoire +des +femmes +dès +leur +retour +du +congé +légal +d +' +un +an +pour +élever +un +enfant +et +des +jeunes +à +l +' +issue +du +* +service +national +avec +maintien +des +avantages +acquis +. +_ +interdiction +de +tout +licenciement +prioritaire +basé +sur +l +' +âge +, +le +sexe +ou +la +nationalité +. +_ +application +intégrale +et +extension +à +l +' +ensemble +des +salariés +des +droits +découlant +des +accords +nationaux +interprofessionnels +, +lois +et +règlements +, +sur +la +sécurité +de +l +' +emploi +, +la +formation +et +le +perfectionnement +professionnels +. +_ +droit +de +contrôle +( +et +moyens +réels +de +l +' +assurer +) +, +sur +l +' +utilisation +des +fonds +publics +alloués +aux +entreprises +pour +création +ou +évolution +d +' +emplois +. +_ +suppression +des +contrats +à +durée +limitée +. +_ +personnel +permanent +en +nombre +suffisant +permettant +d +' +assurer +les +travaux +courants +de +l +' +entreprise +et +excluant +dans +ces +domaines +le +recours +à +des +entreprises +extérieures +de +main +d +' +oeuvre +intérimaire +ou +temporaire +. +_ +révision +profonde +des +conditions +d +' +introduction +de +séjour +et +d +' +emploi +de +la +main +- +d +' +oeuvre +immigrée +et +prise +en +compte +des +revendications +formulées +à +cet +égard +par +la +CGT +garanties +par +un +statut +à +caractère +social +et +démocratique +. +_ +protection +des +immigrés +contre +les +trafics +et +les +abus +dont +ils +sont +victimes +, +quels +qu +' +en +soient +les +auteurs +et +stricte +application +de +la +loi +du +6 +juillet +1973 +relative +à +la +répression +des +trafics +de +main +- +d +' +oeuvre +. +_ +l +' +* +office +national +d +' +immigration +doit +être +le +seul +organisme +compétent +chargé +du +recrutement +à +l +' +étranger +, +de +l +' +introduction +et +de +l +' +accueil +des +immigrés +et +de +leurs +familles +. +< +S10 += +1 +> +garantie +des +ressources +. +. +< +S10 += +0 +> +§ +lorsqu +' +un +emploi +ne +peut +être +donné +à +ceux +qui +veulent +travailler +, +il +faut +leur +garantir +des +ressources +décentes +sans +limitation +de +durée +: +_ +tout +salarié +privé +d +' +emploi +par +son +employeur +et +qui +est +inscrit +comme +demandeur +d +' +emploi +doit +bénéficier +de +ressources +égales +à +son +salaire +antérieur +. +_ +tous +les +autres +demandeurs +d +' +emploi +, +y +compris +ceux +qui +recherchent +un +premier +emploi +doivent +être +assurés +d +' +un +minimum +de +ressources +égal +au +SMIC +. +_ +garantie +des +ressources +sur +la +base +de +l +' +horaire +et +du +salaire +habituels +pour +les +salariés +touchés +par +des +réductions +d +' +horaires +. +_ +garantie +de +ressources +égales +au +salaire +antérieur +à +tous +les +salariés +dont +le +reclassement +dans +un +emploi +équivalent +n +' +a +pu +être +assuré +. +_ +revalorisation +des +allocations +d +' +aide +publique +en +matière +de +chômage +total +ou +partiel +au +taux +de +50 +% +du +SMIC +, +et +élévation +substantielle +des +plafonds +de +ressources +. +_ +généralisation +de +l +' +action +du +* +fonds +national +de +l +' +emploi +. +_ +généralisation +de +l +' +accord +national +interprofessionnel +du +14 +octobre +1974 +, +sur +l +' +allocation +supplémentaire +d +' +attenteà +tous +les +salariés +victimes +de +licenciement +. +_ +généralisation +et +amélioration +de +l +' +accord +national +interprofessionnel +du +27 +mars +1972 +sur +la +garantie +de +ressources +aux +salariés +privés +d +' +emploi +de +plus +de +60 +ans +. +_ +attribution +de +délais +de +paiement +et +aide +en +matière +d +' +impôts +, +de +loyer +, +de +dettes +et +crédits +pour +les +salariés +et +leurs +familles +pendant +la +période +où +ils +sont +sans +emploi +et +inscrits +comme +demandeurs +d +' +emplois +. +_ +suspension +immédiate +de +toutes +poursuites +saisies +et +voies +d +' +exécution +à +l +' +encontre +des +chômeurs +. +_ +cotisation +ASSEDIC +à +la +charge +exclusive +des +employeurs +. +< +S10 += +1 +> +l +' +abaissement +de +l +' +âge +de +la +retraite +. +. +< +S10 += +0 +> +§ +alors +que +des +centaines +de +milliers +de +travailleurs +connaissent +le +chômage +et +que +les +jeunes +sont +de +plus +en +plus +nombreux +à +ne +pouvoir +trouver +un +emploi +à +l +' +issue +de +leur +temps +de +scolarité +, +* +pouvoir +et +* +patronat +contraignent +des +salariés +âgés +de +plus +de +60 +ans +à +continuer +leur +activité +professionnelle +. +§ +l +' +abaissement +de +l +' +âge +de +la +retraite +se +justifie +pleinement +$ +: +_ +pour +des +raisons +humaines +$ +: +les +statistiques +font +clairement +apparaître +que +dans +leur +grande +masse +les +travailleurs +, +et +parmi +eux +tout +particulièrement +les +ouvriers +de +l +' +industrie +et +de +l +' +agriculture +, +ont +une +durée +moyenne +de +vie +plus +brève +que +les +autres +catégories +de +la +population +, +ceci +étant +dû +notamment +aux +conditions +de +travail +dont +la +CGT +demande +l +' +amélioration +. +le +droit +doit +leur +être +reconnu +de +pouvoir +bénéficier +véritablement +et +dans +des +conditions +décentes +de +leur +retraite +. +par +ailleurs +, +les +femmes +de +plus +en +plus +nombreuses +parmi +les +salariés +, +connaissent +dans +le +contexte +actuel +une +fatigue +accrue +du +fait +de +leur +double +fonction +de +travailleuse +et +de +mère +de +famille +, +et +de +l +' +insuffisance +notoire +des +équipements +sociaux +collectifs +qui +devraient +être +créés +afin +d +' +alléger +leurs +tâches +familiales +de +ménagères +. +dans +ces +conditions +, +la +possibilité +doit +leur +être +offerte +, +ainsi +qu +' +aux +travailleurs +des +professions +les +plus +pénibles +de +pouvoir +bénéficier +d +' +une +retraite +anticipée +. +_ +pour +des +raisons +économiques +et +sociales +$ +: +les +emplois +libérés +par +les +travailleurs +admis +à +faire +valoir +leurs +droits +à +la +retraite +au +taux +plein +pourraient +être +occupés +par +des +salariés +présentement +en +chômage +. +ceci +apparaît +plus +sain +sur +le +plan +économique +et +plus +juste +sur +le +plan +social +. +§ +pour +ces +deux +motifs +essentiels +, +la +CGT +entend +faire +aboutir +la +revendication +de +l +' +âge +de +la +retraite +au +taux +plein +à +60 +ans +pour +les +hommes +et +55 +ans +pour +les +femmes +et +les +salariés +effectuant +des +travaux +pénibles +ou +insalubres +, +en +garantissant +les +avantages +acquis +par +certaines +catégories +des +secteurs +public +et +nationalisé +. +< +S10 += +1 +> +la +réduction +de +la +durée +du +travail +. +. +< +S10 += +0 +> +§ +la +nécessité +d +' +un +allègement +de +la +charge +de +travail +, +élément +essentiel +de +l +' +amélioration +des +conditions +de +travail +, +les +besoins +croissants +de +temps +libre +pour +le +repos +, +les +loisirs +, +l +' +information +, +l +' +accès +à +la +culture +, +l +' +aggravation +de +la +situation +de +l +' +emploi +, +font +de +la +réduction +de +la +durée +du +travail +sans +diminution +des +salaires +une +revendication +qu +' +il +est +urgent +de +satisfaire +. +§ +elle +peut +s +' +appliquer +notamment +à +l +' +échelle +de +la +semaine +, +par +la +réduction +et +la +limitation +de +la +durée +hebdomadaire +, +et +à +l +' +échelle +de +l +' +année +, +par +l +' +allongement +des +congés +payés +. +§ +les +engagements +pris +par +le +patronat +en +mai +1968 +n +' +ont +pas +été +tenus +$ +: +le +retour +à +la +semaine +de +40 +heures +sans +diminution +des +salaires +n +' +a +été +rendu +effectif +que +pour +une +minorité +de +salariés +. +§ +la +durée +du +travail +demeure +très +élevée +dans +certains +secteurs +et +certaines +entreprises +, +alors +que +se +multiplient +les +licenciements +et +les +réductions +d +' +horaires +entrainant +d +' +importantes +diminutions +de +salaires +. +§ +la +durée +maximale +légale +du +travail +demeure +fixée +à +un +niveau +inadmissible +. +§ +en +conséquence +, +la +CGT +demande +$ +: +_ +retour +rapide +et +effectif +aux +40 +heures +dans +toutes +les +branches +et +pour +toutes +les +catégories +de +travailleurs +, +avec +compensation +intégrale +des +effets +de +la +diminution +des +horaires +sur +les +salaires +. +_ +attribution +à +tous +les +salariés +d +' +une +cinquième +semaine +de +congés +payés +, +pouvant +être +prise +en +dehors +de +la +période +légale +. +_ +augmentation +des +effectifs +pour +permettre +la +réduction +de +la +durée +du +travail +pour +toutes +les +catégories +de +travailleurs +, +sans +accroissement +de +l +' +intensité +du +travail +. +_ +semaine +de +travail +de +cinq +jours +suivis +de +deux +jours +de +repos +consécutifs +obligatoires +. +_ +abaissement +progressif +de +la +durée +du +travail +en +dessous +de +40 +heures +pour +les +salariés +dont +les +conditions +de +travail +sont +particulièrement +pénibles +. +_ +limitation +à +45 +heures +de +la +durée +hebdomadaire +maximale +du +travail +. +les +heures +supplémentaires +effectuées +dans +cette +limite +et +seulement +dans +des +cas +exceptionnels +seront +obligatoirement +rémunérées +comme +telles +et +récupérées +en +repos +compensateurs +. +_ +suppression +des +dérogations +permanentes +et +du +système +des +équivalences +. +_ +limitation +de +l +' +amplitude +de +la +journée +de +travail +. +< +S10 += +1 +> +la +formation +et +le +perfectionnement +professionnels +. +. +< +S10 += +0 +> +§ +la +rapidité +de +l +' +évolution +technologique +transforme +les +conditions +d +' +exercice +de +l +' +ensemble +des +professions +. +la +politique +de +concentration +des +entreprises +contraint +les +travailleurs +à +des +reconversions +profondes +. +la +crise +aggravée +du +système +capitaliste +et +la +détérioration +de +la +situation +de +l +' +emploi +rendent +ces +demandes +de +conversion +encore +plus +nombreuses +et +plus +difficiles +. +§ +les +travailleurs +formulent +l +' +exigence +légitime +$ +: +_ +d +' +acquérir +un +savoir +plus +large +, +plus +complet +correspondant +à +l +' +état +présent +des +connaissances +, +_ +de +pouvoir +se +perfectionner +afin +d +' +être +mieux +garantis +dans +leur +emploi +et +d +' +accéder +à +une +promotion +réelle +, +_ +de +pouvoir +se +reconvertir +à +d +' +autres +activités +professionnelles +, +avec +le +maintien +, +au +minimum +, +de +leur +niveau +de +qualification +antérieure +. +§ +résultat +des +luttes +, +l +' +* +accord +du +9 +juillet +1970 +a +ouvert +aux +travailleurs +le +droit +à +la +formation +. +il +a +donné +également +aux +apprentis +des +garanties +nouvelles +. +les +lois +du +16 +juillet +1971 +, +malgré +leurs +insuffisances +et +leurs +aspects +restrictifs +ont +dû +confirmer +ce +droit +et +ces +garanties +. +cependant +, +la +mise +en +application +se +heurte +à +l +' +attitude +négative +du +patronat +et +du +gouvernement +qui +entendent +faire +de +ces +textes +des +instruments +au +service +de +leurs +seuls +intérêts +. +§ +afin +de +permettre +aux +travailleurs +du +secteur +privé +et +du +secteur +public +d +' +exercer +ce +droit +et +aux +apprentis +de +disposer +des +nouvelles +garanties +, +la +CGT +préconise +les +revendications +suivantes +: +< +S10 += +1 +> +apprentissage +. +. +< +S10 += +0 +> +§ +la +situation +des +jeunes +sous +contrat +d +' +* +apprentissage +doit +être +améliorée +par +$ +: +_ +l +' +augmentation +du +minimum +légal +des +rémunérations +des +apprentis +avec +maintien +du +versement +des +allocations +familiales +aux +parents +( +rémunération +égale +à +40 +% +du +SMIC +pendant +la +durée +du +premier +tiers +de +l +' +apprentissage +, +60 +% +durant +le +deuxième +tiers +, +80 +% +pendant +le +troisième +) +; +_ +l +' +application +, +sans +dérogation +, +de +l +' +horaire +annuel +de +360 +heures +dans +les +* +centres +de +formation +d +' +apprentis +( +horaire +porté +progressivement +à +400 +heures +) +; +_ +la +garantie +de +recevoir +dans +l +' +entreprise +une +formation +pratique +complète +et +préalablement +définie +; +_ +la +reconnaissance +du +plein +droit +syndical +. +§ +les +* +centres +de +formation +d +' +apprentis +doivent +être +placés +sous +la +tutelle +et +le +contrôle +directs +de +l +' +éducation +* +nationale +. +< +S10 += +1 +> +formation +professionnelle +continue +. +. +< +S10 += +0 +> +§ +cette +formation +est +un +droit +ouvert +à +tous +les +travailleurs +des +secteurs +privé +, +public +et +nationalisé +. +§ +pour +assurer +la +formation +continue +des +travailleurs +, +la +CGT +pose +les +revendications +suivantes +: +_ +des +mesures +sociales +doivent +être +prises +concernant +$ +: +_ +la +généralisation +et +la +simplification +du +maintien +de +la +rémunération +des +travailleurs +en +congé +formation +ou +des +demandeurs +d +' +emploi +allant +en +stage +, +_ +une +protection +sociale +complète +des +stagiaires +$ +: +_ +le +remboursement +intégral +des +frais +de +transport +et +d +' +hébergement +, +_ +la +prise +en +charge +intégrale +par +l +' +état +ou +l +' +entreprise +du +coût +des +stages +, +_ +les +dispositions +particulières +permettant +aux +travailleuses +d +' +accéder +sans +discrimination +à +la +formation +et +au +perfectionnement +professionnels +. +_ +des +opérations +de +mise +à +niveau +sont +nécessaires +pour +certaines +catégories +dont +l +' +accès +à +une +formation +et +à +une +qualification +est +freiné +par +l +' +insuffisance +du +niveau +de +formation +générale +. +ces +opérations +doivent +relever +essentiellement +de +l +' +* +éducation +nationale +et +faire +l +' +objet +d +' +un +financement +particulier +. +§ +ces +actions +de +mise +à +niveau +sont +particulièrement +nécessaires +$ +: +_ +pour +les +femmes +désirant +prendre +un +emploi +ou +reprendre +une +activité +professionnelle +après +une +interruption +pour +raisons +familiales +; +ces +sessions +de +rattrapage +doivent +être +rémunérées +; +_ +pour +les +travailleurs +immigrés +, +afin +de +permettre +le +développement +de +leur +formation +professionnelle +et +leur +promotion +sociale +$ +: +les +cours +d +' +alphabétisation +et +d +' +apprentissagedu +français +doivent +être +généralisés +, +sur +le +temps +de +travail +et +rémunérés +comme +tel +. +ces +actions +doivent +être +à +la +charge +de +l +' +* +état +, +des +employeurs +et +des +pays +d +' +origine +, +sous +la +responsabilité +de +l +' +éducation +* +nationale +, +indépendamment +des +lois +et +des +accords +relatifs +à +la +formation +professionnelle +continue +; +_ +pour +les +jeunes +sans +formation +professionnelle +$ +: +_ +pour +ceux +qui +sont +sous +contrat +de +travail +, +doit +être +rendue +effective +l +' +application +des +dispositions +législatives +prévoyant +200 +heures +de +formation +pendant +le +temps +de +travail +et +avec +le +maintien +intégral +du +salaire +( +ces +200 +heures +devant +être +considérées +comme +un +minimum +) +, +_ +pour +ceux +qui +sont +sans +travail +, +il +faut +développer +et +améliorer +les +actions +de +préformation +de +l +' +* +éducation +nationale +et +de +l +' +AFPA +, +et +revaloriser +les +indemnités +des +stagiaires +. +_ +un +développement +important +de +l +' +AFPA +doit +être +réalisé +pour +lui +permettre +de +répondre +sans +délai +aux +besoins +de +formation +des +demandeurs +d +' +emploi +et +de +participer +à +la +mise +en +oeuvre +du +congé +formation +, +y +compris +par +la +création +de +sections +mobiles +opérant +hors +des +centres +, +au +plus +près +des +travailleurs +. +l +' +accès +des +femmes +et +des +travailleurs +immigrés +dans +toutes +les +spécialités +doit +être +rendu +possible +par +des +mesures +d +' +adaptation +des +* +centres +de +l +' +AFPA +. +le +libre +exercice +du +droit +syndical +doit +être +reconnu +aux +stagiaires +de +l +' +AFPA +. +_ +les +établissements +de +l +' +* +éducation +nationale +doivent +être +systématiquement +ouverts +à +la +formation +continue +, +ce +qui +implique +des +moyens +nouveaux +et +des +structures +appropriées +( +dotation +supplémentaire +de +crédits +de +fonctionnement +et +d +' +équipement +, +création +de +postes +d +' +enseignantset +d +' +autres +personnels +) +. +_ +la +reconnaissance +des +diplômes +, +des +connaissances +acquises +et +des +niveaux +de +qualification +atteints +, +doit +être +assurée +en +s +' +appuyant +sur +l +' +inscription +désormais +prévue +dans +les +clauses +obligatoires +des +conventions +collectives +. +_ +dans +le +secteur +public +, +le +droit +des +personnels +à +la +formation +doit +s +' +exercer +sans +entrave +. +_ +pour +les +non +- +titulaires +de +l +' +* +état +, +exclus +jusque +- +là +de +la +formation +continue +, +le +droit +doit +être +immédiatement +ouvert +et +les +stages +doivent +avoir +, +parmi +leurs +objectifs +, +de +contribuer +à +la +titularisation +. +< +S10 += +1 +> +financement +. +. +< +S10 += +0 +> +§ +en +ce +qui +concerne +le +financement +, +la +CGT +réaffirme +sa +proposition +d +' +un +* +fonds +national +de +formation +et +de +perfectionnement +, +alimenté +parallèlement +par +des +versements +des +employeurs +et +des +crédits +d +' +* +état +. +§ +ce +* +fonds +serait +soumis +au +contrôle +syndical +et +son +institution +est +le +seul +moyen +d +' +éviter +les +gaspillages +. +§ +dans +le +système +actuel +, +le +taux +de +la +participation +patronale +à +la +formation +continue +doit +être +portée +à +2 +% +du +montant +des +salaires +en +1976 +, +comme +le +prévoit +la +loi +du +16 +juillet +1971 +, +que +le +gouvernement +doit +appliquer +. +§ +la +taxe +d +' +apprentissage +doit +revenir +au +taux +, +antérieur +à +1972 +, +de +0 +- +6 +% +des +salaires +. +< +S10 += +1 +> +contrôle +des +organisations +syndicales +des +travailleurs +. +. +< +S10 += +0 +> +§ +le +contrôle +syndical +doit +être +accru +sur +toutes +les +actions +de +formation +, +aussi +bien +en +ce +qui +concerne +la +formation +initiale +que +la +formation +continue +. +cela +implique +le +renforcement +$ +: +_ +des +prérogatives +des +représentants +des +travailleurs +dans +toutes +les +instances +traitant +de +la +formation +; +_ +des +prérogatives +des +* +comités +d +' +entreprise +ainsi +que +des +délégués +du +personnel +en +l +' +absence +de +* +comité +d +' +entreprise +; +_ +des +moyens +donnés +à +leurs +membres +et +à +ceux +de +la +* +commission +d +' +emploi +et +* +formation +professionnelle +, +( +crédit +suffisant +d +' +heures +rémunérées +) +. +< +S10 += +1 +> +faire +appliquer +et +élargir +. +. +< +S10 += +0 +> +§ +la +CGT +engage +ses +organisations +et +l +' +ensemble +des +travailleurs +$ +: +_ +à +exiger +partout +l +' +application +intégrale +des +dispositions +contractuelles +et +légales +, +ce +qui +doit +permettre +actuellement +de +faire +bénéficier +, +au +minimum +, +un +travailleur +sur +cinq +d +' +un +mois +de +formation +, +chaque +année +; +_ +à +réclamer +l +' +élargissement +de +ces +dispositions +, +notamment +des +clauses +de +l +' +accord +interprofessionnel +du +9 +juillet +1970 +qui +peuvent +être +améliorées +à +tous +les +niveaux +, +notamment +au +plan +des +conventions +collectives +; +_ +à +faire +accélérer +l +' +établissement +des +listes +de +stages +paritairement +agréés +sur +des +critères +précis +; +_ +à +poursuivre +l +' +action +à +tous +les +niveaux +, +et +particulièrement +à +celui +des +entreprises +, +pour +obtenir +les +conditions +et +les +moyens +nécessaires +au +plein +exercice +du +droit +au +congé +formation +. +< +S10 += +1 +> +le +respect +de +la +vie +des +travailleurs +. +. +l +' +amélioration +des +conditions +de +travail +. +. +< +S10 += +0 +> +§ +l +' +aggravation +des +conditions +de +travail +se +généralise +. +elle +atteint +, +sous +des +formes +et +à +des +degrés +divers +, +toutes +les +catégories +de +salariés +$ +: +ouvriers +, +employés +, +techniciens +, +ingénieurs +, +cadres +. +§ +l +' +emploi +des +techniques +nouvelles +au +lieu +d +' +alléger +la +peine +des +hommes +s +' +accompagne +d +' +une +accélération +des +cadences +, +d +' +une +tendance +accentuée +à +la +déqualification +du +travail +et +à +la +parcellisation +des +tâches +, +du +développement +du +travail +en +continu +, +de +l +' +inadaptation +des +locaux +de +travail +, +de +l +' +absence +ou +de +l +' +insuffisance +des +moyens +de +protection +de +la +santé +et +de +la +sécurité +. +il +en +découle +une +usure +intensive +des +forces +des +travailleurs +, +une +augmentation +importante +du +nombre +et +de +la +gravité +des +accidents +et +maladies +, +situation +qui +contribue +à +aggraver +l +' +insécurité +de +l +' +emploi +, +de +la +classification +et +des +ressources +. +§ +les +28 +millions +de +journées +de +travail +perdues +annuellement +pour +incapacités +temporaires +traduisent +les +conséquences +extrêmement +graves +des +conditions +actuelles +de +travail +sur +la +santé +et +l +' +intégrité +physique +des +travailleurs +. +§ +les +revendications +de +la +CGT +ont +été +présentées +dans +le +document +adopté +le +2 +février +1972 +par +la +* +commission +exécutive +et +précisées +en +vue +des +négociations +avec +le +CNPF +. +elles +tendent +à +réduire +la +pénibilité +du +travail +, +à +prémunir +les +travailleurs +contre +les +exigences +de +rendement +accru +, +à +s +' +opposer +à +la +déqualification +et +à +la +parcellisation +extrême +du +travail +, +à +obtenir +une +protection +efficace +de +la +santé +et +de +la +sécurité +des +travailleurs +, +à +ouvrir +des +possibilités +de +promotion +professionnelle +. +§ +leur +satisfaction +exige +notamment +$ +: +_ +l +' +affectation +d +' +un +pourcentage +minimum +des +investissements +annuels +à +l +' +étude +et +à +la +réalisation +de +l +' +amélioration +des +conditions +de +travail +; +_ +la +mise +à +la +disposition +des +travailleurs +, +de +leurs +représentants +élus +, +des +syndicats +, +des +moyens +d +' +information +, +de +contrôle +, +d +' +expression +et +d +' +intervention +sur +tous +les +sujets +concernant +les +conditions +de +travail +, +lesquels +doivent +obligatoirement +, +sur +demande +des +syndicats +, +faire +l +' +objet +de +négociations +aux +différents +niveaux +. +§ +outre +la +réduction +de +la +durée +du +travail +et +l +' +augmentationdes +effectifs +, +éléments +essentiels +de +l +' +amélioration +des +conditions +de +travail +, +la +révision +des +classifications +, +le +droit +à +la +formation +et +au +perfectionnement +professionnels +, +qui +trouvent +sur +ce +plan +une +justification +particulière +, +la +CGT +défend +les +revendications +suivantes +: +< +S10 += +1 +> +§ +charge +de +travail +. +. +< +S10 += +0 +> +la +charge +de +travail +physique +ou +intellectuelle +doit +être +ramenée +ou +contenue +dans +des +limites +n +' +entrainant +pas +une +fatigue +excessive +pour +le +travailleur +. +les +cadences +de +travail +notamment +doivent +être +limitées +ou +réduites +en +conséquence +. +ce +résultat +peut +être +obtenu +par +$ +: +_ +l +' +accroissement +des +effectifs +, +lesquels +doivent +tenir +compte +notamment +des +absences +probables +, +_ +la +limitation +du +nombre +de +pièces +à +produire +ou +d +' +opérations +à +réaliser +, +_ +la +réduction +du +nombre +de +machines +ou +d +' +appareils +à +conduire +ou +à +surveiller +, +_ +la +réduction +de +la +vitesse +de +la +chaîne +, +_ +l +' +affichage +dans +les +ateliers +ou +services +des +temps +alloués +, +de +la +vitesse +de +la +chaîne +, +des +effectifs +occupés +, +de +la +définition +des +opérations +à +effectuer +sur +chaque +poste +de +travail +ou +du +nombre +de +machines +ou +d +' +appareils +à +conduire +ou +à +surveiller +doit +être +rendu +obligatoire +; +_ +toute +modification +ayant +pour +effet +d +' +accroître +la +charge +de +travail +individuelle +doit +être +interdite +; +_ +les +délégués +syndicaux +, +du +personnel +et +du +CE +, +les +travailleurs +concernés +, +doivent +être +informés +au +préalable +et +consultés +sur +toutes +modifications +du +processus +de +travail +. +< +S10 += +1 +> +§ +organisation +du +temps +de +travail +. +. +< +S10 += +0 +> +_ +temps +de +repos +payés +en +cours +de +journée +, +avec +arrêt +effectif +, +le +cas +échéant +, +de +la +machine +ou +des +appareils +ou +de +la +chaîne +; +_ +mise +en +place +, +pour +les +travaux +sur +chaîne +, +de +remplaçants +en +nombre +suffisant +pour +permettre +des +arrêts +individuels +; +_ +temps +de +repos +supplémentaires +pour +les +femmes +enceintes +et +allongement +à +18 +semaines +du +congé +légal +de +maternité +; +_ +installation +de +salles +de +repos +à +proximité +des +lieux +de +travail +; +_ +pour +les +travailleurs +en +équipes +$ +: +allongement +du +temps +de +pause +payé +et +paiement +, +comme +temps +de +travail +, +du +temps +total +de +présence +dans +l +' +entreprise +; +_ +limitation +du +travail +en +continu +et +en +semi +- +continu +aux +seuls +postes +de +travail +où +existent +réellement +des +impératifs +techniques +; +_ +compensation +pour +les +travailleurs +postés +en +continu +ou +semi +- +continu +, +des +conséquences +de +cette +forme +de +travail +par +$ +: +l +' +abaissement +de +la +durée +du +travail +en +dessous +de +40 +heures +par +$ +: +l +' +introduction +d +' +une +cinquième +équipe +( +continu +) +ou +d +' +unequatrième +équipe +( +semi +- +continu +) +, +l +' +avancement +de +l +' +âge +de +la +retraite +, +l +' +allongement +des +congés +payés +; +_ +organisation +des +systèmes +de +rotation +des +postes +par +discussion +entre +la +direction +et +les +organisations +syndicales +et +avec +l +' +accord +des +intéressés +; +_ +pour +les +travaux +particulièrement +éprouvants +ou +comportant +des +risques +pour +la +santé +, +changement +de +poste +en +cours +de +journée +, +avec +maintien +du +salaire +et +renforcement +de +la +surveillance +médicale +; +_ +préalablement +à +toute +application +des +horaires +variables +ou +du +travail +à +temps +partiel +, +établissement +de +garanties +portant +notamment +sur +les +avantages +acquis +et +l +' +exercice +des +droits +syndicaux +, +ces +garanties +devant +faire +l +' +objet +de +négociations +avec +les +organisations +syndicales +. +< +S10 += +1 +> +formation +et +promotion +professionnelles +. +. +< +S10 += +0 +> +§ +la +lutte +contre +les +effets +du +caractère +épuisant +et +asservissant +du +travail +comporte +l +' +exigence +du +droit +à +la +formation +et +à +la +promotion +pour +tout +travailleur +, +du +manoeuvre +à +l +' +ingénieur +, +selon +les +aptitudes +et +capacités +de +chacun +. +§ +ce +qui +implique +$ +: +_ +la +modification +de +l +' +organisation +du +travail +de +façon +à +en +diminuer +la +pénibilité +, +à +en +réduire +la +parcellisation +et +à +en +augmenter +l +' +intérêt +et +le +degré +de +qualification +; +_ +la +possibilité +pour +tous +les +ouvriers +spécialisés +qui +en +feront +la +demande +de +changer +de +poste +de +travail +, +après +un +an +d +' +ancienneté +, +afin +d +' +étendre +leur +expérience +ou +d +' +acquérir +une +polyvalence +donnant +accès +à +une +qualification +supérieure +; +_ +des +dispositions +particulières +pour +favoriser +l +' +accès +à +une +formation +de +base +des +travailleurs +et +travailleuses +n +' +en +ayant +pas +reçue +; +_ +la +garantie +pour +tous +les +travailleurs +de +pouvoir +franchir +, +au +bénéfice +de +l +' +expérience +et +de +l +' +enrichissement +de +leurs +connaissances +, +les +échelons +dans +la +hiérarchie +des +classifications +et +des +salaires +, +leur +assurant +ainsi +une +carrière +normale +. +< +S10 += +1 +> +rôle +de +l +' +encadrement +. +. +< +S10 += +0 +> +§ +il +importe +qu +' +en +matière +de +conditions +de +travail +, +les +ingénieurs +, +cadres +, +techniciens +et +agents +de +maîtrise +aient +toutes +possibilités +de +donner +leur +avis +sur +le +plan +professionnel +, +même +lorsqu +' +il +est +en +opposition +avec +l +' +orientation +officielle +de +l +' +entreprise +, +ce +qui +suppose +$ +: +d +' +une +part +, +les +modalités +d +' +application +des +garanties +collectives +, +les +protégeant +contre +les +pressions +de +leurs +employeurs +, +d +' +autre +part +, +les +garanties +liées +à +leurs +responsabilités +sur +les +conditions +de +travail +des +autres +salariés +et +d +' +en +fixer +les +limites +. +< +S10 += +1 +> +sécurité +des +personnes +. +. +< +S10 += +0 +> +§ +sécurité +des +travailleurs +assurant +les +paiements +, +encaissements +et +transports +de +fonds +. +§ +toutes +dispositions +matérielles +doivent +être +prises +pour +prémunir +les +travailleurs +concernés +contre +les +risques +d +' +agressions +. +§ +les +effectifs +de +personnel +, +en +particulier +, +doivent +être +en +nombre +suffisant +. +< +S10 += +1 +> +l +' +hygiène +et +la +sécurité +du +travail +. +. +< +S10 += +0 +> +§ +liée +étroitement +aux +problèmes +posés +par +les +conditions +de +travail +, +l +' +amélioration +des +conditions +d +' +hygiène +et +de +sécurité +implique +en +tout +premier +lieu +que +la +réglementation +existante +soit +strictement +appliquée +sur +tous +les +lieux +de +travail +, +qu +' +elle +soit +adaptée +aux +conditions +et +exigences +actuelles +et +qu +' +elle +évolue +constamment +en +fonction +des +conditions +et +exigences +nouvelles +. +§ +les +dispositions +et +l +' +action +, +en +matière +d +' +hygiène +et +sécurité +, +doivent +avoir +avant +tout +un +caractère +préventif +, +ce +qui +suppose +notamment +que +la +sécurité +soit +intégrée +dès +le +stade +de +l +' +élaboration +des +projets +de +construction +, +de +la +mise +au +point +des +méthodes +de +travail +, +de +la +conception +et +des +études +de +machines +, +locaux +, +produits +et +processus +de +fabrication +. +§ +les +organisations +syndicales +, +les +comités +d +' +entreprises +, +les +délégués +du +personnel +ont +pleine +compétence +pour +l +' +ensemble +de +ces +problèmes +touchant +aux +conditions +de +travail +. +les +* +comités +d +' +hygiène +et +de +sécurité +ont +un +rôle +particulièrement +important +. +< +S10 += +1 +> +comité +hygiène +et +sécurité +. +. +< +S10 += +0 +> +§ +à +cet +égard +, +leur +efficacité +doit +être +renforcée +par +les +dispositions +suivantes +: +§ +_ +institution +de +* +comités +d +' +hygiène +et +de +sécurité +dans +toutes +les +entreprises +et +établissements +industriels +et +commerciaux +du +secteur +privé +, +comme +des +secteurs +public +et +nationalisé +. +leurs +membres +doivent +disposer +de +pouvoirs +réels +, +notamment +celui +d +' +obtenir +l +' +interruption +du +travail +dans +tous +les +cas +où +celui +- +ci +présente +un +caractère +dangereux +et +de +saisir +les +juridictions +compétentes +. +§ +la +liberté +de +circulation +doit +leur +être +garantie +dans +tous +les +lieux +de +travail +. +ils +doivent +disposer +du +temps +nécessaire +pour +l +' +accomplissement +de +leur +mission +et +en +toute +hypothèse +d +' +un +minimum +au +moins +égal +au +crédit +d +' +heures +des +délégués +du +personnel +. +§ +_ +les +membres +des +* +comités +d +' +hygiène +et +de +sécurité +doivent +être +élus +par +l +' +ensemble +des +salariés +concernés +. +ils +doivent +bénéficier +d +' +une +protection +identique +à +celle +des +délégués +du +personnel +dans +toutes +les +entreprises +. +le +secrétaire +du +* +comité +d +' +hygiène +et +de +sécurité +doit +être +un +représentant +des +travailleurs +désigné +par +les +membres +élus +du +* +comité +d +' +hygiène +et +de +sécurité +. +§ +_ +le +* +comité +d +' +hygiène +et +de +sécurité +a +compétence +pour +l +' +ensemble +du +personnel +travaillant +dans +l +' +entreprise +qui +comprend +également +le +personnel +intérimaire +et +intermittent +. +§ +la +responsabilité +juridique +en +matière +d +' +accidents +du +travail +ou +de +maladies +professionnelles +incombe +exclusivement +à +l +' +employeur +. +elle +ne +peut +en +aucun +cas +être +imputée +au +personnel +d +' +encadrement +. +§ +outre +les +conditions +qui +leur +sont +faites +, +les +ingénieurs +, +cadres +, +techniciens +et +agents +de +maîtrise +jouent +un +rôle +important +dans +le +développement +de +la +sécurité +au +sein +de +l +' +entreprise +. +ils +doivent +pouvoir +travailler +en +liaison +avec +le +médecin +du +travail +et +l +' +ingénieur +de +sécurité +et +avoir +connaissance +de +toutes +les +remarques +des +CHS +, +ainsi +que +des +autres +représentants +des +salariés +et +des +organisations +syndicales +. +§ +toutes +dispositions +, +telles +que +le +contrôle +médical +organisé +à +l +' +initiative +des +employeurs +, +tendant +à +exercer +une +pression +sur +les +salariés +malades +ou +accidentés +, +en +vue +de +leur +imposer +une +reprise +prématurée +du +travail +, +sont +vigoureusement +combattues +par +la +CGT +et +doivent +être +interdites +. +§ +les +consignes +de +sécurité +doivent +être +adaptées +et +traduites +dans +leur +langue +maternelle +pour +les +travailleurs +immigrés +. +§ +des +stages +d +' +information +sur +les +questions +relatives +à +la +sécurité +doivent +être +organisés +pour +les +travailleurs +nouvellement +embauchés +, +le +temps +passé +à +ces +stages +étant +considéré +comme +temps +de +travail +et +payé +comme +tel +, +sans +imputation +sur +le +temps +du +congé +formation +professionnelle +ni +sur +les +fonds +dévolus +à +celle +- +ci +. +§ +la +compétence +du +* +comité +d +' +hygiène +et +sécurité +doit +s +' +étendre +sans +restriction +aux +problèmes +de +la +pollution +$ +: +toutes +dispositions +seront +prises +pour +qu +' +il +puisse +veiller +au +respect +des +normes +nationales +ou +internationales +concernant +le +bruit +et +la +teneur +en +produits +nocifs +non +seulement +de +l +' +atmosphère +des +ateliers +mais +aussi +des +gaz +, +liquides +et +solides +rejetés +par +l +' +entreprise +. +§ +dans +ce +domaine +, +la +CGT +dénonce +vigoureusement +le +chantage +exercé +sous +la +forme +des +faux +dilemnes +$ +: +usine +insalubre +( +ou +polluante +) +ou +fermeture +( +ou +non +installation +) +. +< +S10 += +1 +> +médecine +du +travail +. +. +< +S10 += +0 +> +§ +la +médecine +du +travail +est +un +élément +important +du +système +de +protection +de +l +' +homme +sur +le +lieu +de +travail +. +§ +il +convient +d +' +établir +avec +l +' +ensemble +des +parties +intéressées +un +statut +du +médecin +du +travail +. +§ +ce +statut +devra +notamment +fixer +les +conditions +de +rémunération +et +définir +une +protection +qui +assurent +au +médecin +du +travail +une +indépendance +totale +à +l +' +égard +de +l +' +employeur +. +_ +détermination +du +nombre +des +vacations +du +médecin +du +travail +de +telle +sorte +que +le +tiers +de +son +temps +lui +permette +réellement +de +remplir +les +tâches +qui +sont +les +siennes +en +matière +de +prévention +de +la +pathologie +du +travail +, +connaissance +des +conditions +concrètes +de +réalisation +du +travail +, +recherche +des +moyens +d +' +améliorer +l +' +hygiène +et +la +sécurité +. +_ +modification +du +décret +du +13 +juin +1969 +, +notamment +en +ce +qui +concerne +la +gestion +des +services +médicaux +interentreprises +. +les +représentants +élus +des +établissements +concernés +, +ainsi +que +ceux +des +organisations +syndicales +représentatives +doivent +participer +de +plein +droit +à +la +gestion +des +centres +médicaux +interentreprises +, +ce +qui +implique +$ +: +_ +que +leur +représentation +au +sein +du +* +conseil +d +' +administration +soit +assurée +dans +des +conditions +leur +permettant +une +intervention +effective +dans +les +décisions +et +sur +l +' +activité +des +centres +; +_ +qu +' +ils +disposent +du +temps +, +des +possibilités +de +déplacement +et +des +moyens +d +' +information +nécessaires +à +l +' +accomplissement +de +leur +mandat +, +l +' +indemnisation +du +temps +passé +étant +assumée +par +les +employeurs +. +§ +le +médecin +du +travail +sera +obligatoirement +consulté +pour +toutes +les +questions +relevant +des +conditions +de +travail +, +de +la +prévention +, +de +l +' +hygiène +et +de +la +sécurité +du +travail +. +< +S10 += +1 +> +les +comités +techniques +régionaux +et +nationaux +. +. +< +S10 += +0 +> +§ +de +par +leurs +attributions +, +les +* +comités +techniques +régionaux +et +nationaux +peuvent +prendre +des +mesures +comblant +le +retard +de +la +réglementation +sur +le +développement +des +sciences +et +des +techniques +influençant +les +conditions +de +travail +, +de +prévention +, +d +' +hygiène +et +de +sécurité +. +§ +les +conditions +actuelles +de +composition +et +de +fonctionnement +des +* +comités +techniques +régionaux +ne +leur +permettent +pas +de +jouer +correctement +et +pleinement +leur +rôle +. +il +est +nécessaire +d +' +imposer +$ +: +_ +l +' +augmentation +du +nombre +de +* +comités +techniques +régionaux +et +le +regroupement +des +activités +professionnelles +tout +en +assurant +aux +représentants +salariés +le +temps +et +les +moyens +d +' +assurer +leur +mandat +. +< +S10 += +1 +> +dispositions +législatives +. +. +< +S10 += +0 +> +§ +la +CGT +demande +que +tous +les +produits +présentant +un +danger +de +quelque +nature +que +ce +soit +avant +d +' +être +utilisés +dans +l +' +industrie +, +soient +subordonnés +à +un +visa +délivré +par +un +organisme +national +compétent +dont +il +convient +de +débattre +avec +les +* +pouvoirs +publics +. +le +même +organisme +devrait +être +chargé +de +déterminer +des +normes +nationales +fixant +la +teneur +maximale +tolérable +de +l +' +atmosphère +des +lieux +de +travail +en +substances +nuisibles +, +ainsi +que +les +limites +du +bruit +et +de +la +radioactivité +. +§ +ces +dispositions +s +' +appliquent +aux +produits +actuellement +en +usage +qui +entraînent +des +conséquences +nuisibles +pour +la +santé +. +_ +création +d +' +une +sous +- +commission +au +sein +de +la +* +commission +d +' +hygiène +industrielle +chargée +d +' +établir +, +de +tenir +à +jour +et +de +communiquer +les +listes +de +substances +et +agents +cancérigènes +à +interdire +dans +la +production +, +à +contrôler +ou +à +soumettre +à +autorisation +avant +utilisation +. +_ +établir +pour +chaque +travailleur +exposé +à +des +substances +et +agents +cancérigènes +ou +autres +substances +nocives +, +un +livret +médical +mentionnant +les +produits +dangereux +avec +lesquels +il +est +en +contact +durant +sa +carrière +. +_ +la +CGT +demande +, +en +outre +, +le +renforcement +du +corps +de +l +' +* +inspection +du +travail +et +de +l +' +* +inspection +médicale +qui +devraient +être +dotés +de +pouvoirs +accrus +en +matière +de +contrôle +et +de +sanction +à +l +' +encontre +des +employeurs +violant +les +règles +de +sécurité +. +< +S10 += +1 +> +les +droits +et +libertés +des +travailleurs +. +. +les +droits +. +. +< +S10 += +0 +> +§ +l +' +action +de +classe +a +libéré +le +travailleur +d +' +un +certain +nombre +de +contraintes +imposées +par +le +patronat +dans +l +' +entreprise +capitaliste +, +et +lui +a +permis +de +conquérir +certains +droits +. +§ +sans +perdre +de +vue +que +ces +contraintes +ont +leur +origine +dans +l +' +exploitation +capitaliste +et +que +seule +la +suppression +de +celle +- +ci +permettra +leur +disparition +complète +, +sans +perdre +de +vue +également +que +des +prétendus +nouveaux +" +droits +" +suggérés +ou +offerts +( +telle +" +la +participation +" +sous +ses +diverses +formes +) +, +visent +en +fait +à +l +' +intégration +du +travailleur +dans +le +système +et +constituent +par +là +même +une +duperie +, +il +est +possible +et +nécessaire +d +' +élargir +les +droits +existants +. +§ +la +CGT +entend +promouvoir +aussi +bien +les +droits +des +travailleurs +pris +individuellement +que +les +droits +de +la +collectivité +des +travailleurs +, +représentés +par +le +syndicat +et +les +diverses +institutions +existantes +ou +à +créer +, +y +compris +dans +les +petites +entreprises +. +§ +dans +cet +esprit +, +elle +oeuvre +pour +une +législation +interdisant +aux +employeurs +de +demander +au +personnel +d +' +encadrementd +' +exercer +sur +les +travailleurs +des +pressions +directes +ou +indirectes +non +relatives +à +l +' +accomplissement +de +l +' +activité +professionnelle +. +< +S10 += +1 +> +§ +la +CGT +réclame +concernant +. +. +information +. +. +< +S10 += +0 +> +_ +droit +pour +le +travailleur +d +' +être +préalablement +informé +, +avant +toute +décision +, +de +toute +mesure +le +concernant +( +qu +' +il +s +' +agisse +de +la +détermination +de +ses +conditions +de +travail +, +de +modification +à +son +contrat +de +travail +, +de +sanctions +, +y +compris +le +licenciement +$ +. +. +. +) +; +_ +droit +de +débattre +( +assisté +s +' +il +le +désire +d +' +un +délégué +syndical +ou +d +' +un +délégué +du +personnel +) +avec +la +direction +des +intentions +de +cette +dernière +à +son +égard +; +_ +toute +mesure +prise +en +violation +de +ces +droits +, +comme +toute +disposition +dont +les +motivations +seraient +reconnues +inexactes +, +doivent +entraîner +leur +annulation +. +< +S10 += +1 +> +promotion +. +. +< +S10 += +0 +> +_ +droit +effectif +à +la +promotion +par +la +priorité +absolue +donnée +aux +travailleurs +de +l +' +entreprise +en +cas +de +poste +d +' +une +qualification +à +pourvoir +. +< +S10 += +1 +> +rémunérations +. +. +< +S10 += +0 +> +_ +droit +pour +chacun +à +la +connaissance +des +salaires +de +tous +les +membres +du +personnel +de +l +' +entreprise +. +< +S10 += +1 +> +règlement +intérieur +. +. +< +S10 += +0 +> +_ +suppression +du +règlement +intérieur +dans +sa +conception +actuelle +qui +permet +à +l +' +employeur +d +' +édicter +souverainement +des +sanctions +et +de +se +rendre +ainsi +justice +à +lui +- +même +par +la +voie +de +décisions +unilatérales +. +< +S10 += +1 +> +information +économique +, +consultation +, +contrôle +. +. +< +S10 += +0 +> +_ +droit +à +l +' +information +à +la +consultation +et +au +contrôle +sur +tout +ce +qui +concerne +l +' +activité +de +l +' +entreprise +, +en +priorité +absolue +par +le +canal +des +représentants +du +personnel +. +cette +pratique +permettant +d +' +analyser +l +' +information +et +de +combattre +, +le +cas +échéant +, +tout +caractère +de +mise +en +condition +. +_ +mise +en +place +des +* +comités +d +' +entreprise +de +tous +les +éléments +d +' +informations +économiques +, +en +particulier +$ +: +_ +tous +les +documents +permettant +une +connaissance +approfondie +et +véridique +des +éléments +comptables +de +la +gestion +passée +et +d +' +avenir +au +niveau +de +l +' +entreprise +, +du +groupe +, +de +la +branche +d +' +industrie +sur +le +plan +national +et +international +. +ces +documents +doivent +être +fournis +dans +toutes +les +sociétés +quelle +qu +' +en +soit +leur +forme +juridique +. +_ +toutes +les +informations +relatives +au +travail +et +la +gestion +du +personnel +. +_ +suppression +de +toute +obligation +de +discrétion +dans +l +' +information +économique +. +_ +droit +à +l +' +assistance +d +' +un +expert +- +comptable +dans +toutes +les +sociétés +et +pouvant +être +choisi +en +tout +lieu +. +_ +dotation +des +* +comités +d +' +entreprise +en +moyens +matériels +et +financiers +leur +permettant +l +' +étude +des +questions +économiques +. +_ +mise +en +place +de +* +comités +centraux +de +groupes +. +< +S10 += +1 +> +information +syndicale +. +. +< +S10 += +0 +> +_ +droit +à +un +temps +suffisant +selon +les +besoins +constatés +dans +chaque +entreprise +_ +et +en +aucun +cas +, +inférieur +à +une +heure +par +mois +_ +pris +sur +le +temps +de +travail +et +payé +comme +tel +, +pour +participer +à +des +réunions +organisées +par +les +syndicats +, +dans +des +locaux +mis +à +leur +disposition +par +l +' +entreprise +. +< +S10 += +1 +> +représentation +. +. +< +S10 += +0 +> +_ +dans +les +grandes +entreprises +et +dans +celles +où +la +nature +du +travail +aboutit +à +la +dispersion +des +salariés +ou +à +leur +rotation +en +équipes +successives +, +augmentation +du +nombre +des +délégués +du +personnel +, +des +membres +du +* +comité +d +' +entreprise +et +du +nombre +des +délégués +au +CHS +. +§ +la +CGT +combat +les +tentatives +répétées +du +patronat +et +du +pouvoir +, +de +mettre +en +place +des +organisations +de +collaboration +de +classe +n +' +ayant +de +syndicales +que +le +nom +telle +par +exemple +la +CFT +. +§ +elle +rappelle +que +l +' +une +des +garanties +essentielles +de +la +liberté +syndicale +réside +dans +le +droit +pour +les +seules +organisations +syndicales +représentatives +de +présenter +des +candidatures +au +premier +tour +des +élections +professionnelles +. +afin +de +renforcer +ce +droit +et +pour +déjouer +les +manoeuvres +patronales +la +CGT +réclame +$ +: +_ +un +contrôle +plus +strict +et +une +aggravation +des +pénalités +encourues +par +les +employeurs +portant +atteinte +à +la +liberté +de +vote +; +_ +l +' +abrogation +des +dispositions +légales +, +telles +celles +relatives +aux +* +comités +centraux +d +' +entreprises +, +qui +déforment +la +représentation +proportionnelle +à +l +' +entreprise +; +_ +que +seules +les +organisations +syndicales +représentatives +soient +habilitées +à +présenter +des +candidatures +y +compris +au +deuxième +tour +des +élections +quand +celui +- +ci +s +' +avère +nécessaire +; +_ +que +les +candidats +soient +élus +dans +l +' +ordre +de +présentation +de +la +liste +. +§ +la +CGT +demande +également +que +la +représentation +des +organisations +syndicales +dans +les +organismes +paritaires +, +tripartites +ou +de +caractère +officiel +, +soit +établie +proportionnellement +à +l +' +influence +réelle +de +chacune +d +' +elle +, +et +soit +réservée +aux +seules +organisations +représentatives +à +l +' +exclusion +de +toute +autre +; +qu +' +en +conséquence +il +soit +procédé +à +l +' +éviction +des +organisations +telles +que +la +CFT +. +< +S10 += +1 +> +les +libertés +. +. +libertés +syndicales +. +. +< +S10 += +0 +> +§ +amélioration +et +extension +des +dispositions +de +la +loi +du +27 +décembre +1968 +, +soit +$ +: +_ +reconnaissance +de +l +' +organisation +syndicale +et +des +conséquences +légales +de +cette +reconnaissance +dans +tous +les +établissements +et +entreprises +quel +que +soit +l +' +effectif +du +personnel +; +_ +reconnaissance +de +la +représentation +spécifique +de +toutes +les +organisations +représentatives +d +' +ingénieurs +, +cadres +et +techniciens +; +_ +révision +des +textes +législatifs +ou +réglementaires +restreignant +le +rôle +des +organisations +syndicales +de +salariés +; +_ +libre +accès +et +liberté +de +circulation +en +tout +lieu +de +l +' +entreprise +et +à +tout +moment +, +aux +délégués +élus +, +aux +délégués +et +représentants +syndicaux +; +_ +possibilité +pour +les +délégués +représentants +locaux +régionaux +ou +nationaux +des +organisations +syndicales +représentatives +d +' +avoir +accès +dans +les +entreprises +pour +y +rencontrer +les +travailleurs +, +y +compris +là +où +n +' +existe +pas +d +' +organisation +syndicale +; +_ +collecte +des +cotisations +et +diffusion +des +publications +syndicales +sur +les +lieux +et +pendant +les +heures +de +travail +. +§ +mise +à +la +disposition +des +organisations +syndicales +d +' +un +contingent +d +' +heures +nécessaires +à +leur +fonctionnement +attribué +proportionnellement +à +leur +influence +telle +qu +' +elle +ressort +des +élections +professionnelles +. +< +S10 += +1 +> +protection +. +. +< +S10 += +0 +> +§ +interdiction +et +nullité +du +licenciement +et +de +toutes +les +formes +de +répression +patronale +visant +les +élus +et +représentants +du +personnel +, +les +salariés +exerçant +un +mandat +ou +une +fonction +confiés +par +l +' +organisation +syndicale +ou +exercé +en +son +nom +, +et +, +tout +salarié +en +raison +de +ses +opinions +, +croyances +ou +appartenance +à +une +organisation +syndicale +ou +à +un +parti +ou +prononcé +en +violation +des +droits +et +libertés +syndicales +. +< +S10 += +1 +> +mandat +syndical +. +. +< +S10 += +0 +> +§ +droit +inconditionnel +pour +tout +salarié +à +l +' +exercice +d +' +un +mandat +électif +et +de +délégué +syndical +, +cela +exige +que +la +charge +de +travail +de +l +' +intéressé +soit +diminuée +dans +la +même +proportion +que +le +temps +qu +' +il +doit +consacrer +à +son +travail +ou +qu +' +il +soit +remplacé +pendant +l +' +exercice +de +ses +fonctions +. +cela +exige +également +que +les +dispositions +soient +prises +pour +que +l +' +élu +des +travailleurs +puisse +continuer +à +exercer +son +activité +professionnelle +. +§ +éligibilité +pour +les +travailleurs +immigrés +dans +les +mêmes +conditions +que +celles +s +' +appliquant +aux +travailleurs +français +, +et +levée +de +toutes +restrictions +concernant +leur +accès +aux +responsabilités +de +représentation +, +de +direction +et +d +' +administration +des +organisations +syndicales +. +< +S10 += +1 +> +grève +. +. +< +S10 += +0 +> +§ +abrogation +de +toutes +les +restrictions +à +l +' +exercice +du +droit +de +grève +, +y +compris +celle +résultant +de +l +' +utilisation +abusive +de +la +notion +de +" +liberté +du +travail +" +. +§ +interdiction +de +toute +retenue +sur +le +salaire +ou +les +primes +excédant +le +prorata +de +la +durée +de +la +grève +. +§ +interdiction +du +lock +- +out +, +qu +' +il +soit +ou +non +camouflé +sous +l +' +appellation +de +chômage +technique +. +< +S10 += +1 +> +libertés +et +informatique +. +. +< +S10 += +0 +> +§ +en +cas +d +' +établissement +de +fichiers +de +renseignements +, +notamment +informatisés +par +des +services +administratifs +publics +ou +privés +, +qu +' +il +soit +interdit +de +recueillir +et +de +mémoriser +des +informations +sans +rapport +direct +avec +l +' +objet +spécifique +du +fichier +, +et +en +particulier +des +données +ou +appréciations +susceptibles +de +nuire +au +travailleur +dans +sa +vie +professionnelle +ou +de +porter +entrave +à +l +' +exercice +des +libertés +individuelles +ou +collectives +dont +il +est +en +droit +de +se +réclamer +. +§ +institution +de +système +de +contrôle +permettant +de +veiller +à +la +stricte +application +et +au +respect +du +principe +énoncé +ci +- +dessus +. +< +S10 += +1 +> +l +' +éducation +syndicale +. +. +< +S10 += +0 +> +§ +étant +donné +le +rôle +et +les +responsabilités +des +syndicats +dans +la +société +moderne +, +l +' +éducation +syndicale +est +un +élément +de +l +' +éducation +dans +son +ensemble +. +§ +son +développement +pose +de +nombreux +problèmes +au +premier +rang +desquels +le +financement +de +ces +activités +et +l +' +amélioration +du +congé +éducation +. +§ +s +' +agissant +du +financement +, +la +CGT +estime +qu +' +en +premier +lieu +le +patronat +doit +prendre +en +charge +le +paiement +de +la +perte +de +salaire +qu +' +entraîne +l +' +utilisation +des +congés +éducation +. +les +comités +d +' +entreprise +versant +, +quant +à +eux +, +des +bourses +d +' +études +aux +bénéficiaires +des +congés +éducation +, +bourses +d +' +un +montant +suffisant +pour +couvrir +les +frais +de +séjour +et +les +voyages +des +intéressés +. +plus +globalement +enfin +, +la +subvention +annuelle +du +* +ministère +du +travail +doit +connaître +une +augmentation +notable +pour +tenir +compte +de +l +' +augmentation +des +charges +, +du +développement +important +de +l +' +ensemble +des +réalisations +éducatives +de +la +CGT +, +ainsi +que +de +sa +représentativité +réelle +. +§ +s +' +agissant +du +congé +éducation +, +des +modifications +réglementaires +doivent +intervenir +pour +le +fractionnement +de +ce +congé +, +pour +l +' +augmentation +du +nombre +des +bénéficiaires +, +notamment +dans +les +grandes +entreprises +, +et +, +enfin +, +pour +l +' +octroi +aux +centrales +syndicales +les +plus +représentatives +et +proportionnellement +à +leur +représentativité +, +d +' +un +contingent +annuel +de +congés +éducation +de +longue +durée +pour +répondre +aux +besoins +des +éducateurs +et +à +la +nécessité +de +renforcer +les +stages +de +niveau +supérieur +. +< +S10 += +1 +> +la +législation +du +travail +. +. +< +S10 += +0 +> +§ +l +' +application +et +le +respect +des +droits +des +travailleurs +à +l +' +entreprise +nécessitent +que +les +instances +responsables +de +la +législation +sociale +disposent +de +moyens +de +contrôle +et +de +réparation +suffisants +et +adaptés +. +§ +en +effet +, +les +violations +des +droits +des +travailleurs +prennent +un +aspect +intolérable +, +du +fait +même +de +leur +fréquence +et +de +leur +gravité +, +et +appellent +un +certain +nombre +de +réformes +qui +, +au +jugement +de +la +CGT +, +devraient +comporter +les +points +suivants +: +< +S10 += +1 +> +§ +inspection +du +travail +. +. +< +S10 += +0 +> +_ +augmentation +sensible +du +nombre +des +inspecteurs +et +contrôleurs +du +travail +qui +devrait +être +doublé +. +_ +accroissement +de +leurs +pouvoirs +d +' +intervention +, +de +contrôle +et +de +sanction +à +l +' +encontre +des +employeurs +, +notamment +par +la +possibilité +d +' +intervenir +devant +toutes +les +instances +compétentes +, +le +droit +de +faire +arrêter +les +machines +en +cas +de +danger +flagrant +et +le +droit +de +convoquer +tout +témoin +. +_ +extension +de +leur +compétence +à +toutes +les +professions +et +à +tous +les +secteurs +d +' +activité +. +_ +institution +de +délégués +salariés +à +l +' +inspection +du +travail +, +élus +par +les +travailleurs +et +dotés +des +attributions +et +des +pouvoirs +nécessaires +à +l +' +accomplissement +de +leur +tâche +de +contrôle +dans +les +entreprises +, +de +répression +et +de +sanction +des +violations +de +la +loi +. +< +S10 += +1 +> +§ +juridiction +prudhomale +. +. +< +S10 += +0 +> +_ +création +obligatoire +de +* +conseils +de +prudhommes +dans +tous +les +centres +importants +et +couvrant +tout +le +territoire +national +. +_ +extension +sans +exception +de +la +juridiction +prudhomale +à +tous +les +travailleurs +ne +relevant +pas +de +la +fonction +publique +. +_ +accès +à +l +' +électorat +et +à +l +' +éligibilité +de +tous +les +travailleurs +sans +distinction +de +nationalité +. +_ +élection +des +conseillers +prudhommes +un +jour +ouvrable +, +pendant +le +temps +de +travail +, +au +scrutin +proportionnel +sur +des +listes +présentées +par +les +organisations +syndicales +les +plus +représentatives +. +_ +suppression +des +sections +et +catégories +en +tant +que +telles +, +et +liberté +d +' +organisation +interne +des +conseils +en +sections +professionnelles +ou +chambres +selon +leurs +besoins +particuliers +. +_ +gratuité +, +accélération +et +simplification +de +la +procédure +prudhomale +. +_ +prise +en +charge +par +l +' +* +état +, +au +titre +du +* +ministère +de +la +justice +, +de +la +création +et +du +fonctionnement +des +* +conseils +de +prudhommes +et +de +l +' +attribution +d +' +une +subvention +spéciale +aux +organisations +syndicales +pour +la +formation +de +leurs +conseillers +prudhommes +. +_ +élargissement +de +la +compétence +des +* +conseils +de +prudhommes +aux +conflits +collectifs +d +' +ordre +juridique +; +institution +d +' +un +véritable +référé +prudhomal +. +_ +établissement +d +' +un +statut +de +conseiller +prudhomme +garantissant +le +libre +exercice +de +son +activité +et +sa +couverture +contre +tout +préjudice +, +de +quelque +ordre +qu +' +il +puisse +être +. +< +S10 += +1 +> +code +du +travail +. +. +< +S10 += +0 +> +§ +une +réforme +profonde +de +la +législation +sociale +s +' +impose +pour +la +débarrasser +des +conceptions +antisociales +héritées +du +* +code +Napoléon +. +un +* +code +du +travail +moderne +doit +élargir +et +garantir +efficacement +les +droits +des +travailleurs +dans +les +conditions +actuelles +de +l +' +exploitationcapitaliste +. +< +S10 += +1 +> +les +conventions +collectives +. +. +< +S10 += +0 +> +§ +la +garantie +des +droits +collectifs +et +des +revendications +, +imposée +par +l +' +action +syndicale +, +nécessite +des +* +conventions +collectives +efficaces +. +§ +trop +souvent +, +ces +conventions +sont +vidées +de +leur +contenu +, +notamment +en +ce +qui +concerne +les +salaires +. +dans +de +nombreux +cas +, +elles +sont +même +inexistantes +. +§ +la +CGT +lutte +pour +de +véritables +conventions +collectives +$ +: +_ +la +négociation +des +conventions +collectives +, +avenants +et +accords +paritaires +, +doit +être +ouverte +obligatoirement +à +toutes +les +* +organisations +syndicales +représentatives +; +_ +les +conventions +collectives +, +avenants +et +accords +paritaires +ne +doivent +s +' +appliquer +que +s +' +ils +sont +signés +par +des +organisations +syndicales +représentatives +représentant +ensemble +la +majorité +des +travailleurs +concernés +; +_ +tous +les +travailleurs +d +' +une +même +branche +du +manoeuvre +à +l +' +ingénieur +doivent +être +couverts +par +une +convention +collective +unique +, +comportant +des +avenants +traitant +les +questions +spécifiques +qui +concernent +les +diverses +catégories +. +cela +implique +l +' +extension +automatique +de +chaque +convention +à +toutes +les +entreprises +d +' +une +profession +déterminée +; +_ +les +problèmes +généraux +intéressant +l +' +ensemble +des +salariés +doivent +être +réglés +par +des +accords +interprofessionnels +. +des +conventions +collectives +nationales +doivent +couvrir +toutes +les +branches +et +régler +les +problèmes +d +' +ensemble +du +secteur +professionnel +; +_ +les +accords +et +conventions +d +' +entreprises +doivent +être +considérés +comme +des +compléments +aux +accords +nationaux +ou +aux +conventions +collectives +nationales +, +leur +objet +étant +de +les +adapter +et +de +les +améliorer +; +_ +accélération +de +la +procédure +d +' +extension +des +conventions +collectives +et +accords +, +la +décision +devant +être +rendue +dans +un +délai +maximum +de +trois +mois +à +dater +du +dépôt +de +la +demande +d +' +extension +. +§ +pour +répondre +pleinement +à +la +protection +qu +' +elle +doit +apporter +aux +travailleurs +, +toute +convention +collective +doit +couvrir +dans +ses +dispositions +l +' +ensemble +des +problèmes +soulevés +par +l +' +exercice +de +la +profession +, +dans +le +sens +des +revendications +définies +par +le +présent +programme +. +tout +particulièrement +, +elle +doit +assurer +une +véritable +garantie +des +salaires +. +§ +la +CGT +s +' +oppose +à +toute +disposition +visant +à +limiter +les +droits +syndicaux +et +le +droit +de +grève +, +et +refuse +toute +clause +se +référant +à +des +conceptions +de +collaboration +de +classes +. +§ +conclue +à +la +fois +en +fonction +des +conditions +économiques +sociales +et +politiques +et +du +rapport +des +forces +entre +les +salariés +et +le +patronat +existant +au +moment +de +la +signature +, +la +convention +collective +représente +un +avantage +minimum +pour +tous +, +qui +ne +saurait +être +considéré +comme +immuable +. +§ +son +contenu +doit +être +amélioré +en +tenant +compte +des +besoins +nouveaux +et +de +l +' +évolution +du +rapport +des +forces +en +présence +. +§ +aussi +une +action +de +caractère +permanent +est +elle +nécessaire +pour +assurer +l +' +application +correcte +des +avantages +acquis +et +les +préserver +de +toute +atteinte +, +et +conquérir +des +avantages +et +des +droits +nouveaux +. +§ +sur +la +base +des +principes +énoncés +ci +- +dessus +, +la +CGT +réclame +l +' +ouverture +rapide +, +dans +toutes +les +branches +, +de +négociations +aux +fins +de +conclure +des +conventions +collectives +nationales +, +ou +, +le +cas +échéant +, +de +mettre +à +jour +et +d +' +améliorer +celles +qui +existent +. +< +S10 += +1 +> +les +statuts +. +. +< +S10 += +0 +> +§ +les +statuts +des +personnels +sont +le +résultat +des +luttes +nombreuses +des +organisations +syndicales +pour +obtenir +l +' +établissement +de +garanties +. +ils +ont +été +acquis +ou +améliorés +à +l +' +occasion +d +' +un +rapport +de +forces +favorable +à +l +' +ensemble +de +la +classe +ouvrière +, +notamment +lors +de +la +libération +de +notre +pays +avec +le +progrès +du +mouvement +démocratique +. +§ +la +prise +en +considération +des +revendications +générales +de +la +CGT +constitue +un +élément +important +de +la +lutte +pour +la +sauvegarde +et +l +' +amélioration +des +garanties +statutaires +mises +en +cause +par +la +politique +du +pouvoir +visant +à +favoriser +les +monopoles +. +§ +cette +politique +a +les +plus +lourdes +conséquences +dans +le +secteur +public +$ +: +_ +compression +maximum +des +dépenses +de +fonctionnement +au +détriment +des +conditions +de +vie +et +de +travail +des +personnels +et +de +la +qualité +de +service +rendu +aux +usagers +; +_ +transferts +de +plus +en +plus +nombreux +et +variés +des +activités +publiques +rentables +vers +le +secteur +privé +et +démantèlement +des +services +publics +, +utilisation +de +personnels +hors +statuts +pour +certains +secteurs +d +' +activité +. +§ +cela +s +' +accompagne +d +' +attaques +constantes +, +ouvertes +ou +insidieuses +contre +les +statuts +des +personnels +. +sous +couvert +de +réformes +, +d +' +adaptation +ou +de +réorganisation +, +l +' +objectif +final +est +de +remettre +en +cause +les +avantages +acquis +dans +tous +les +domaines +. +§ +ainsi +, +défense +du +service +public +, +défense +et +amélioration +des +garanties +statutaires +sont +étroitement +liées +. +§ +cette +action +reste +une +préoccupation +importante +de +la +CGT +. +< +S10 += +1 +> +respect +des +garanties +acquises +. +. +< +S10 += +0 +> +§ +la +CGT +lutte +pour +le +respect +intégral +des +garanties +acquises +et +le +rétablissement +de +celles +qui +ont +été +remises +en +cause +. +elle +exige +notamment +$ +: +_ +l +' +extension +du +rôle +et +de +la +compétence +des +organismes +paritaires +de +la +* +fonction +publique +( +commissions +administratives +, +comités +techniques +, +* +conseil +supérieur +de +la +* +fonction +publique +) +et +des +* +comités +mixtes +du +secteur +nationalisé +; +_ +leur +consultation +obligatoire +; +_ +l +' +amélioration +de +leur +fonctionnement +dans +le +sens +d +' +un +développement +de +prérogatives +des +représentants +des +personnels +et +des +facilités +nécessaires +à +l +' +exercice +de +leur +mandat +. +§ +la +CGT +exige +que +soit +mis +un +terme +au +recrutement +de +personnel +auxiliaire +ou +hors +statut +$ +: +_ +les +auxiliaires +doivent +être +titularisés +; +_ +les +personnels +écartés +du +bénéfice +des +droits +statutaires +doivent +être +intégrés +dans +le +cadre +du +statut +; +_ +les +situations +particulières +pouvant +justifier +le +recrutement +de +personnel +sous +contrat +doivent +être +déterminées +en +accord +avec +les +organisations +syndicales +. +dans +ce +cas +, +des +garanties +équivalentes +à +celles +des +personnels +à +statut +doivent +être +accordées +à +ces +personnels +. +des +règles +similaires +seront +appliquées +aux +personnels +des +entreprises +assurant +une +concession +de +service +public +. +< +S10 += +1 +> +garanties +nouvelles +. +. +< +S10 += +0 +> +§ +des +garanties +fondamentales +nouvelles +doivent +être +obtenues +, +notamment +en +ce +qui +concerne +$ +: +_ +les +modalités +de +négociations +afin +de +respecter +les +prérogatives +syndicales +. +à +ce +sujet +$ +: +_ +les +représentants +du +gouvernement +ou +des +directions +nationales +doivent +avoir +réellement +le +pouvoir +de +négocier +et +de +traiter +sans +être +enfermés +dans +les +limites +de +décisions +prises +au +préalable +et +arbitrairement +; +_ +la +référence +à +des +instruments +dont +le +gouvernement +possède +le +contrôle +exclusif +( +indice +officiel +des +prix +) +ou +à +des +formules +liées +à +la +productivité +, +à +l +' +évolution +des +recettes +, +ou +à +la +production +doit +être +exclue +; +_ +les +réformes +de +caractère +fondamental +, +ou +les +mesures +de +caractère +pluriannuel +doivent +être +négociées +en +dehors +des +discussions +salariales +annuelles +; +_ +les +organisations +syndicales +représentatives +doivent +être +associées +à +toutes +les +discussions +intéressant +les +travailleurs +dont +elles +ont +mission +de +défendre +les +intérêts +, +qu +' +elles +soient +ou +non +signataires +des +accords +. +§ +les +droits +syndicaux +, +les +prérogatives +des +organisations +syndicales +dans +l +' +entreprise +, +l +' +établissement +ou +le +service +, +en +particulier +pour +ce +qui +concerne +le +temps +et +les +moyens +des +élus +, +doivent +être +respectés +et +étendus +. +§ +les +comités +d +' +entreprise +ou +organismes +similaires +financés +par +les +administrations +ou +les +directions +et +gérés +par +les +représentants +élus +du +personnel +doivent +être +créés +dans +tous +les +secteurs +. +là +où +ils +existent +, +les +droits +des +travailleurs +dans +la +gestion +doivent +être +étendus +. +< +S10 += +1 +> +la +formation +et +le +développement +de +l +' +homme +. +. +l +' +enseignement +et +l +' +éducation +permanente +. +. +< +S10 += +0 +> +§ +la +CGT +attache +la +plus +grande +importance +à +la +formation +des +hommes +. +l +' +acquisition +des +connaissances +pour +tous +et +au +niveau +le +plus +élevé +, +en +fonction +des +aptitudes +de +chacun +, +commande +largement +le +développement +du +progrès +scientifique +, +technique +, +économique +, +social +et +culturel +. +§ +il +est +un +facteur +important +du +développement +de +la +démocratie +. +§ +l +' +éducation +des +enfants +et +des +jeunes +doit +viser +tout +à +la +fois +à +l +' +épanouissement +de +l +' +individu +, +à +son +insertion +dans +la +société +pour +qu +' +il +soit +utile +à +la +collectivité +nationale +, +à +sa +préparation +au +rôle +de +citoyen +responsable +. +§ +une +telle +formation +étalée +de +l +' +école +maternelle +à +l +' +enseignement +du +second +degré +et +à +l +' +enseignement +supérieur +, +doit +se +prolonger +au +cours +de +la +vie +active +par +le +moyen +d +' +une +éducation +permanente +ouverte +à +tous +les +champs +de +la +connaissance +. +§ +le +* +pouvoir +en +place +ne +permet +pas +la +réalisation +d +' +un +tel +objectif +. +§ +le +système +éducatif +actuel +est +conçu +à +partir +des +besoins +des +couches +dominantes +. +il +limite +les +connaissances +au +minimum +requis +pour +assurer +le +profit +. +il +freine +la +recherche +scientifique +et +l +' +asservit +au +patronat +. +il +perpétue +la +ségrégation +sociale +. +il +diffuse +largement +l +' +idéologie +de +la +classe +au +pouvoir +. +§ +les +réformes +successives +entreprises +depuis +15 +ans +_ +même +si +elles +doivent +tenir +compte +de +la +pression +populaire +_ +recherchent +les +adaptations +que +nécessitent +l +' +évolutiondes +techniques +et +surtout +la +crise +du +capitalisme +. +§ +la +crise +de +l +' +école +française +, +la +pauvreté +de +ses +moyens +, +les +jeunes +, +les +étudiants +diplômés +sans +emploi +, +sont +des +reflets +de +la +crise +du +capitalisme +dans +notre +pays +. +§ +la +CGT +estime +qu +' +un +autre +système +éducatif +réaliste +, +progressiste +, +inspiré +de +la +réforme +Langevin +- +Wallon +doit +être +mis +en +place +. +§ +il +donnerait +aux +jeunes +tout +à +la +fois +la +possibilité +de +s +' +instruire +sans +autre +limitation +que +celle +des +aptitudes +et +celle +d +' +utiliser +leur +savoir +dans +des +emplois +rendus +disponibles +par +le +renouveau +économique +. +§ +il +effacerait +largement +les +discriminations +nées +des +différences +de +situation +de +fortune +et +aussi +de +race +en +permettant +notamment +aux +immigrés +et +à +leurs +enfants +d +' +apprendre +leur +langue +maternelle +et +de +mieux +connaître +la +culture +du +pays +d +' +origine +et +du +pays +de +travail +. +§ +il +rétablirait +l +' +égalité +entre +la +formation +des +hommes +et +des +femmes +. +§ +il +se +prolongerait +dans +une +véritable +formation +continue +, +assurant +notamment +l +' +entretien +et +le +perfectionnement +professionnels +, +qu +' +un +enseignement +technique +rénové +et +développé +rendrait +possible +et +efficace +. +§ +ainsi +serait +assuré +, +dans +le +cadre +d +' +une +éducation +nationale +laïque +, +unifiée +associant +les +maîtres +et +les +utilisateurs +, +un +développement +réel +d +' +un +enseignement +de +qualité +, +effectué +par +des +maîtres +qualifiés +et +rémunérés +en +conséquence +. +§ +la +CGT +continuera +de +se +battre +pour +un +tel +projet +, +solution +réaliste +et +globale +à +la +crise +de +l +' +enseignement +. +§ +d +' +ores +et +déjà +, +sans +attendre +une +réforme +complète +du +système +éducatif +, +un +certain +nombre +de +revendications +peuvent +être +satisfaites +. +§ +le +développement +à +l +' +école +maternelle +pour +tous +en +milieu +rural +et +urbain +, +en +s +' +opposant +à +tout +" +plan +" +qui +tendrait +à +dénaturer +le +caractère +éducatif +et +social +de +cet +enseignement +. +§ +la +rénovation +de +l +' +école +élémentaire +dans +son +contenu +et +son +fonctionnement +et +assurant +notamment +la +réduction +des +effectifs +par +classe +et +la +formation +élevée +et +le +perfectionnement +des +maîtres +. +§ +le +respect +intégral +de +la +loi +sur +la +scolarisation +obligatoire +jusqu +' +à +16 +ans +en +garantissant +à +chaque +jeune +une +formation +complète +dans +les +structures +de +l +' +éducation +* +nationale +. +une +telle +exigence +implique +l +' +abrogation +des +articles +56 +et +57 +de +la +* +loi +Royer +, +l +' +abandon +des +formules +de +cloisonnement +structurel +ou +pédagogique +conduisant +des +élèves +à +des +impasses +dramatiques +. +elle +implique +également +des +actions +de +rattrapage +des +retards +scolaires +. +§ +la +mise +en +oeuvre +d +' +un +enseignement +secondaire +de +valeur +, +associant +aux +connaissances +scientifiques +et +littéraires +fondamentales +, +l +' +éducation +civique +et +morale +, +l +' +initiation +à +la +technologie +et +à +l +' +économie +, +l +' +éducation +artistique +et +la +formation +physique +. +§ +un +tel +enseignement +, +sanctionné +par +un +baccalauréat +doit +s +' +ouvrir +librement +et +sans +discrimination +vers +les +enseignements +supérieurs +, +ou +vers +l +' +exercice +d +' +un +métier +. +§ +l +' +expansion +sans +précédent +d +' +un +enseignement +technique +public +, +ouvert +également +aux +garçons +et +aux +filles +, +rénové +, +moderne +, +diversifié +, +favorisant +l +' +épanouissement +des +jeunes +, +leur +donnant +les +bases +fondamentales +des +adaptations +ultérieures +, +les +préparant +concrètement +à +l +' +emploi +. +cela +implique +$ +: +_ +d +' +assurer +le +développement +des +moyens +d +' +accueil +, +de +fonctionnement +, +d +' +orientation +et +d +' +enseignement +des +jeunes +, +garçons +et +filles +, +en +fonction +des +besoins +réels +de +l +' +économie +et +de +la +société +; +_ +de +supprimer +tous +les +moyens +et +toutes +les +structures +ségrégatives +, +empêchant +un +recrutement +normal +dans +les +collèges +d +' +enseignement +technique +; +_ +de +procéder +à +l +' +aménagement +des +structures +de +l +' +enseignementtechnologique +pour +permettre +$ +: +_ +la +mise +à +niveau +des +jeunes +, +garçons +et +filles +, +victimes +de +handicaps +scolaires +, +_ +la +diversification +des +formations +, +_ +l +' +accès +facilité +vers +des +formations +supérieures +; +_ +de +prendre +des +mesures +incitatives +pour +faire +venir +vers +l +' +enseignement +technologique +un +grand +nombre +de +jeunes +; +_ +de +réaliser +une +rénovation +totale +de +l +' +enseignement +technique +, +la +promotion +de +ses +enseignants +et +leur +perfectionnement +continu +. +§ +la +suppression +des +barrages +ségrégatifs +et +l +' +accès +des +étudiants +à +un +enseignement +supérieur +de +haut +niveau +, +en +assurant +la +liaison +entre +l +' +enseignement +et +la +recherche +dans +les +* +universités +, +et +en +étendant +les +moyens +de +la +recherche +. +§ +en +conquérant +le +droit +à +la +formation +et +le +congé +éducation +les +travailleurs +ont +réalisé +un +important +progrès +. +la +CGT +exige +que +ce +droit +soit +pleinement +respecté +et +que +la +formation +continue +s +' +élargisse +à +tous +les +besoins +professionnels +et +culturels +des +salariés +. +§ +elle +estime +que +l +' +* +éducation +nationale +doit +être +le +maître +d +' +oeuvre +principal +d +' +une +telle +politique +, +notamment +en +créant +auprès +de +chaque +établissement +public +des +départements +de +formation +continue +animés +par +des +enseignants +préparés +en +conséquence +. +§ +pour +la +réalisation +de +ces +mesures +, +la +CGT +demande +la +mise +à +la +disposition +de +l +' +* +éducation +nationale +des +moyens +nécessaires +permettant +$ +: +_ +de +construire +et +d +' +équiper +convenablement +, +et +en +toute +sécurité +, +les +écoles +de +tous +niveaux +; +_ +de +recruter +, +de +former +et +de +perfectionner +les +maîtres +, +de +résorber +l +' +auxilariat +; +_ +d +' +assurer +aux +familles +et +aux +jeunes +l +' +aide +sociale +nécessaire +sous +forme +de +bourses +, +de +primes +de +scolarité +ou +d +' +allocations +d +' +études +indexées +sur +l +' +indice +des +prix +accepté +par +les +organisations +syndicales +; +_ +de +mettre +en +place +un +véritable +service +de +protection +sociale +et +médicale +, +relevant +de +l +' +* +éducation +nationale +, +ainsi +qu +' +un +véritable +service +d +' +orientation +scolaire +et +professionnelle +. +§ +enfin +la +CGT +réaffirme +son +attachement +à +l +' +école +laïque +. +elle +dénonce +l +' +augmentation +constante +des +subventions +et +des +aides +aux +écoles +privées +, +confessionnelles +ou +patronales +. +elle +confirme +sa +volonté +de +voir +regrouper +au +sein +d +' +un +grand +service +public +de +l +' +* +éducation +nationale +tous +les +enseignements +et +services +actuellement +dispersés +comme +l +' +enseignement +agricole +par +exemple +. +§ +elle +appelle +toutes +ses +organisations +, +ses +militants +, +les +travailleurs +à +agir +, +aux +côtés +des +enseignants +, +des +organisations +et +partis +démocratiques +pour +promouvoir +toutes +les +mesures +conformes +à +l +' +intérêt +d +' +un +enseignement +national +et +pour +s +' +opposer +à +toutes +les +attaques +contre +l +' +école +. +< +S10 += +1 +> +la +culture +, +les +sports +, +les +loisirs +. +. +< +S10 += +0 +> +§ +le +développement +harmonieux +de +l +' +individu +sur +le +plan +culturel +, +sportif +et +des +loisirs +, +est +un +droit +qui +depuis +longtemps +est +partie +intégrante +des +revendications +de +la +classe +ouvrière +. +§ +consciente +que +la +possibilité +pour +les +travailleurs +d +' +accéder +à +une +véritable +vie +culturelle +, +sportive +ou +de +loisirs +est +largement +déterminée +par +leurs +conditions +générales +de +vie +, +la +CGT +agit +pour +l +' +amélioration +des +conditions +de +travail +, +la +réduction +de +la +durée +du +travail +, +la +garantie +et +la +progression +du +pouvoir +d +' +achat +. +§ +afin +de +permettre +aux +travailleurs +d +' +accéder +massivement +à +la +culture +, +aux +sports +et +aux +loisirs +, +la +CGT +définit +ses +revendications +$ +: +_ +au +niveau +de +la +collectivité +nationale +pour +exiger +une +véritable +politique +de +crédits +, +d +' +investissements +, +d +' +infrastructure +et +d +' +équipement +pour +l +' +ensemble +de +ces +activités +; +_ +au +niveau +des +entreprises +pour +obtenir +$ +: +_ +la +gestion +pleine +et +entière +de +ces +activités +par +les +représentants +élus +du +personnel +au +sein +des +* +comités +d +' +entreprise +et +organismes +assimilés +, +dans +toutes +les +entreprises +, +y +compris +dans +les +secteurs +public +et +nationalisé +, +sans +ingérence +du +patronat +et +du +gouvernement +. +§ +le +financement +par +l +' +employeur +$ +: +_ +de +l +' +ensemble +des +activités +sociales +par +une +contribution +au +* +comité +d +' +entreprise +qui +ne +saurait +être +inférieure +à +3 +% +de +la +masse +globale +des +salaires +et +appointements +, +ce +qui +permettrait +notamment +le +développement +des +réalisations +culturelles +, +sportives +et +de +loisirs +au +bénéfice +des +travailleurs +et +de +leur +famille +, +_ +des +investissements +pour +la +réalisation +d +' +installations +sportives +, +culturelles +, +de +loisirs +et +de +vacances +; +_ +l +' +octroi +par +l +' +* +état +de +subventions +et +de +crédits +sans +intérêt +aux +* +comités +d +' +entreprise +et +organismes +équivalents +pour +le +développement +des +activités +sociales +; +_ +la +mise +à +disposition +de +locaux +convenables +et +d +' +un +accès +facile +; +_ +la +suppression +de +la +TVA +pour +les +infrastructures +et +les +équipements +culturels +, +sportifs +, +de +loisirs +et +de +vacances +. +§ +la +CGT +appuie +l +' +activité +des +associations +démocratiques +culturelles +sportives +et +de +tourisme +, +des +organisations +d +' +éducation +populaire +et +de +jeunesse +et +appelle +les +organisations +confédérées +et +leurs +élus +dans +les +CE +et +équivalents +à +renforcer +leur +coopération +avec +elles +. +§ +l +' +essor +sans +précédent +des +sciences +et +des +techniques +, +la +multiplication +des +contacts +entre +les +peuples +et +des +échanges +économiques +, +la +prolifération +des +grands +moyens +d +' +information +, +la +prolongation +de +la +scolarité +, +les +nécessités +du +recyclage +professionnel +font +que +le +droit +à +la +culture +, +dans +le +prolongement +du +droit +à +l +' +instruction +, +à +la +formation +et +au +perfectionnement +professionnels +, +est +devenu +un +phénomène +social +de +notre +époque +et +une +revendication +primordiale +des +travailleurs +. +ils +développent +chez +les +travailleurs +le +besoin +d +' +approfondir +leurs +connaissances +, +leur +capacité +de +réflexion +, +de +discussion +sur +tous +les +sujets +de +la +vie +quotidienne +et +sociale +. +§ +les +besoins +croissants +des +travailleurs +, +donnent +une +acuité +plus +grande +à +ces +revendications +que +le +grand +capital +tente +de +détourner +à +des +fins +mercantiles +, +de +rabaisser +à +des +évasions +illusoires +, +individualistes +ou +primaires +, +de +canaliser +à +son +profit +pour +faire +pénétrer +son +idéologie +de +collaboration +de +classes +. +le +pouvoir +porte +atteinte +à +la +liberté +de +création +, +d +' +expression +, +et +de +diffusion +culturelle +. +les +mesures +prises +, +concernant +les +activités +de +l +' +audiovisuel +visent +à +renforcer +sa +pression +idéologique +sur +les +masses +. +il +en +est +de +même +de +certaines +opérations +de +prestige +qui +risquent +d +' +aboutirà +la +définition +d +' +une +culture +officielle +alors +même +que +sévit +la +censure +, +que +des +subventions +sont +supprimées +et +des +animateurs +licenciés +. +§ +pour +répondre +à +la +volonté +d +' +accéder +et +de +participer +à +la +culture +, +mettre +un +terme +à +la +dégradation +du +patrimoine +artistique +de +notre +pays +et +pour +l +' +enrichir +, +la +CGT +agit +pour +obtenir +$ +: +_ +l +' +augmentation +des +crédits +d +' +* +état +accordés +à +toutes +les +branches +des +activités +culturelles +, +afin +de +permettre +notamment +de +développer +le +réseau +des +théâtres +populaires +des +maisons +de +la +culture +et +des +conservatoires +et +de +donner +à +l +' +art +cinématographique +les +moyens +financiers +qui +lui +font +défaut +; +_ +la +liberté +de +création +, +d +' +expression +, +de +diffusion +des +oeuvres +artistiques +et +littéraires +; +_ +une +radio +- +télévision +répondant +à +l +' +intérêt +national +et +non +aux +impératifs +de +conditionnement +idéologique +et +de +profit +. +§ +la +CGT +soutient +la +revendication +des +artistes +, +écrivains +et +interprètes +pour +un +statut +social +élaboré +avec +eux +, +leurs +représentants +et +leurs +organisations +syndicales +. +§ +elle +considère +indispensable +d +' +associer +les +travailleurs +y +compris +les +travailleurs +immigrés +à +toutes +les +formes +de +la +vie +culturelle +et +à +toutes +les +réalisations +culturelles +existantes +$ +: +maisons +de +la +culture +, +maisons +de +jeunes +, +en +les +intéressant +également +à +la +gestion +. +§ +elle +participe +au +développement +de +ces +activités +à +divers +niveaux +par +la +mise +en +oeuvre +d +' +initiatives +prises +par +les +organisations +confédérées +, +par +l +' +impulsion +que +donnent +ses +militants +aux +multiples +réalisations +culturelles +des +comités +d +' +entreprise +ou +organismes +équivalents +des +secteurs +public +et +nationalisé +. +< +S10 += +1 +> +les +activités +sportives +de +masse +. +. +< +S10 += +0 +> +§ +le +sport +n +' +est +pas +seulement +le +moyen +le +plus +sûr +de +garantir +la +santé +et +l +' +équilibre +psychique +des +individus +, +c +' +est +aussi +un +des +éléments +de +la +culture +générale +et +de +l +' +éducation +. +§ +les +conditions +de +notre +temps +, +conditions +aggravées +des +travailleurs +menacent +gravement +leur +santé +et +celle +de +leur +famille +, +interdisent +l +' +épanouissement +de +leur +personnalité +. +la +pratique +des +activités +physiques +et +sportives +devient +un +besoin +social +indispensable +de +plus +en +plus +ressenti +par +les +travailleuses +et +les +travailleurs +. +§ +la +CGT +agit +pour +l +' +attribution +de +crédits +permettant +le +développement +de +la +pratique +du +sport +de +masse +, +et +également +pour +que +les +activités +sportives +occupent +toute +leur +place +dans +l +' +éducation +des +enfants +sur +la +base +de +la +gratuité +et +dans +des +établissements +scolaires +dotés +d +' +installations +modernes +et +d +' +éducateurs +qualifiés +. +§ +l +' +organisation +des +activités +physiques +et +sportives +sur +la +base +de +l +' +entreprise +doit +permettre +à +chaque +travailleuse +et +à +chaque +travailleur +qui +le +désire +de +pratiquer +le +sport +de +son +choix +. +§ +c +' +est +pourquoi +la +CGT +demande +que +des +dispositions +soient +prises +dans +les +statuts +, +accords +nationaux +et +conventions +collectives +. +§ +elle +demande +$ +: +_ +des +mesures +particulières +concernant +les +jeunes +sous +la +forme +de +cinq +heures +rétribuées +prises +sur +le +temps +de +travail +légal +, +leur +permettant +de +fréquenter +une +école +d +' +initiation +sportive +omnisports +; +_ +des +installations +à +l +' +intérieur +ou +à +proximité +immédiate +de +l +' +entreprise +; +_ +la +formation +d +' +animateurs +et +de +moniteurs +choisis +parmi +les +travailleurs +. +< +S10 += +1 +> +les +activités +touristiques +, +les +loisirs +. +. +< +S10 += +0 +> +§ +les +conditions +de +la +vie +moderne +et +les +servitudes +qu +' +elle +impose +, +la +pollution +qui +corrompt +l +' +atmosphère +et +le +milieu +de +vie +, +les +nuisances +de +toutes +sortes +, +atteignent +le +travailleur +sur +le +plan +physique +et +moral +. +§ +tous +ces +facteurs +contribuent +à +faire +des +loisirs +, +des +vacances +et +du +tourisme +un +phénomène +social +, +économique +et +culturel +de +notre +temps +. +§ +alors +que +les +vacances +et +le +tourisme +sont +conçus +par +le +patronat +et +le +pouvoir +comme +éléments +d +' +évasion +et +source +de +profits +, +qu +' +ils +sont +l +' +objet +d +' +opérations +spéculatives +, +la +CGT +lutte +pour +que +les +travailleurs +puissent +exercer +pleinement +le +droit +aux +congés +, +aux +loisirs +et +à +la +détente +. +§ +la +CGT +entend +susciter +et +favoriser +tout +ce +qui +conduit +à +l +' +enrichissement +culturel +, +à +la +découverte +des +sites +et +des +modes +de +vie +, +à +la +connaissance +des +réalités +socio +- +économiques +y +compris +dans +les +autres +pays +. +§ +attachant +une +très +grande +importance +au +tourisme +social +et +aux +activités +de +loisirs +, +elle +agit +pour +$ +: +_ +étendre +le +réseau +de +centres +de +vacances +familiales +et +de +parcs +de +loisirs +; +_ +réaliser +une +véritable +politique +de +crédits +et +d +' +investissements +pour +le +tourisme +social +, +ses +infrastructures +et +ses +équipements +; +_ +obtenir +la +réservation +par +l +' +* +état +et +les +collectivités +locales +de +sites +privilégiés +au +profit +du +tourisme +social +avec +bail +de +longue +durée +; +_ +exiger +la +réduction +de +50 +% +pour +les +billets +de +congés +payés +quel +que +soit +le +moyen +de +transport +ainsi +que +l +' +octroi +d +' +un +second +billet +; +_ +supprimer +toutes +les +restrictions +concernant +l +' +utilisation +de +certains +moyens +de +transport +ainsi +que +les +péages +sur +les +autoroutes +pour +les +salariés +en +congés +. +< +S10 += +1 +> +les +conditions +de +vie +. +. +les +équipements +collectifs +, +sanitaires +et +sociaux +. +. +le +logement +. +. +< +S10 += +0 +> +§ +la +politique +de +l +' +habitat +aboutit +à +l +' +accentuation +de +la +crise +du +logement +dont +les +travailleurs +et +leur +famille +sont +les +principales +victimes +. +cette +crise +est +à +la +fois +quantitative +et +qualitative +. +tout +d +' +abord +la +pénurie +de +logements +accessibles +persiste +( +particulièrement +dans +les +agglomérations +urbaines +) +; +la +charge +logement +ponctionne +lourdement +le +pouvoir +d +' +achat +, +égalant +et +souvent +même +dépassant +les +25 +% +du +budget +familial +. +les +logements +existants +ou +réalisés +ne +sont +ni +assez +spacieux +, +ni +suffisamment +équipés +, +ni +correctement +implantés +. +§ +tandis +que +des +menaces +de +plus +en +plus +lourdes +pèsent +sur +l +' +institution +HLM +, +et +que +la +spéculation +immobilière +est +source +de +profits +scandaleux +, +le +prétexte +de +la +lutte +contre +l +' +inflation +aboutit +à +réduire +le +nombre +des +logements +sociaux +construits +. +§ +la +CGT +considère +que +la +politique +sociale +du +logement +ne +peut +s +' +insérer +dans +la +pratique +d +' +un +urbanisme +fondé +sur +la +réalisation +du +profit +. +§ +pour +ce +qui +la +concerne +, +une +véritable +politique +sociale +du +logement +comporte +$ +: +_ +la +définition +d +' +un +urbanisme +d +' +ensemble +procédant +de +la +volonté +de +satisfaire +des +besoins +réels +. +cela +implique +d +' +une +part +, +d +' +assurer +des +liaisons +correctes +entre +l +' +habitat +et +l +' +emploi +, +des +transports +collectifs +rapides +et +confortables +et +financés +principalement +par +les +entreprises +, +d +' +autre +part +, +la +réalisation +d +' +un +cadre +de +vie +agréable +permettant +la +détente +et +la +satisfaction +correcte +des +besoins +sociaux +et +culturels +; +_ +la +reconnaissance +du +droit +au +logement +, +assurée +par +un +service +public +basé +sur +l +' +institution +HLM +, +ce +qui +suppose +une +gestion +démocratique +des +organismes +d +' +HLM +, +celle +- +ci +étant +assurée +majoritairement +par +les +élus +locaux +et +les +représentants +des +usagers +( +locataires +, +syndicats +) +, +ainsi +qu +' +un +ensemble +de +mesures +leur +permettant +de +remplir +efficacement +leur +rôle +; +_ +la +maîtrise +de +l +' +usage +des +sols +avec +droit +de +préemption +public +sur +les +transactions +de +terrains +bâtis +ou +non +bâtis +à +l +' +intérieur +des +zones +d +' +urbanisation +et +fixation +de +prix +de +référence +stables +pour +éliminer +la +spéculation +; +_ +le +financement +des +programmes +par +l +' +* +état +, +à +l +' +aide +de +prêts +de +longue +durée +à +faible +taux +d +' +intérêt +; +_ +l +' +octroi +de +subventions +permettant +aux +collectivités +locales +et +aux +offices +HLM +de +réaliser +les +réserves +financières +nécessaires +; +_ +l +' +exonération +totale +de +la +TVA +et +diminution +du +taux +de +celle +- +ci +sur +les +fournitures +et +travaux +d +' +entretien +; +_ +la +réalisation +de +programmes +annuels +permettant +de +faire +face +aux +besoins +; +_ +la +réglementation +des +loyers +et +charges +. +suppression +du +surloyer +, +garantie +du +droit +au +maintien +dans +les +lieux +, +abrogation +de +la +loi +permettant +la +vente +des +HLM +locatives +; +_ +la +refonte +complète +et +la +réforme +du +financement +de +l +' +allocation +logement +; +_ +l +' +affectation +prioritaire +, +sous +le +contrôle +des +* +comités +d +' +entreprise +, +de +la +cotisation +du +1 +% +des +entreprises +au +financement +du +logement +social +. +cette +cotisation +doit +s +' +appliquer +à +l +' +* +état +et +aux +collectivités +publiques +pour +les +personnels +qu +' +ils +emploient +; +elle +doit +être +portée +à +2 +% +pour +les +grandes +entreprises +; +_ +le +développement +de +la +construction +de +logements +sociaux +pour +les +travailleurs +immigrés +et +les +retraités +, +ainsi +que +des +foyers +pour +les +jeunes +travailleuses +et +travailleurs +; +résorption +de +l +' +habitat +insalubre +; +_ +la +mise +en +oeuvre +d +' +une +véritable +politique +de +rénovation +urbaine +et +d +' +amélioration +de +l +' +habitat +ancien +, +à +l +' +initiativedes +collectivités +locales +, +avec +dotations +budgétaires +convenables +permettant +l +' +intervention +prioritaire +des +organismes +d +' +HLM +et +le +respect +du +droit +au +relogement +sur +place +des +habitants +concernés +. +< +S10 += +1 +> +transports +et +circulation +. +. +< +S10 += +0 +> +§ +c +' +est +une +même +politique +monopoliste +qui +conduit +aux +déséquilibres +régionaux +de +l +' +économie +, +au +développement +incohérent +des +grandes +concentrations +urbaines +, +qui +dégrade +des +secteurs +entiers +de +l +' +équipement +ferroviaire +, +routier +, +de +l +' +aviation +civile +et +de +la +marine +marchande +. +elle +utilise +le +secteur +nationalisé +des +transports +dans +l +' +intérêt +des +grands +financiers +, +domine +par +la +sous +- +traitance +les +transports +routiers +, +détériore +gravement +les +services +publics +urbains +, +liquide +des +trafics +maritimes +ou +aériens +. +confrontée +avec +le +problème +du +développement +de +la +circulation +automobile +elle +accumule +les +retards +dans +les +infrastructures +de +circulation +. +elle +dilapide +le +potentiel +humain +et +matériel +de +construction +des +moyens +de +transports +( +aéronautique +, +automobile +, +etc +) +. +enfin +, +elle +mène +une +politique +énergétique +portant +préjudice +aux +transports +et +déplacements +. +§ +cette +politique +atteint +la +vie +quotidienne +de +la +population +laborieuse +, +le +développement +de +l +' +économie +nationale +et +les +échanges +internationaux +favorables +à +notre +pays +. +§ +l +' +insuffisance +notoire +et +grandissante +des +moyens +de +transports +collectifs +, +leur +manque +de +rapidité +et +leur +inconfort +portent +atteinte +à +la +santé +et +à +la +vie +familiale +, +sociale +et +culturelle +des +travailleurs +. +§ +la +politique +des +monopoles +tend +de +plus +en +plus +à +faire +peser +sur +les +travailleurs +les +frais +de +l +' +équipement +en +moyen +de +transports +et +de +circulation +remettant +en +cause +leur +rôle +de +services +publics +. +§ +pour +la +CGT +, +les +transports +de +marchandises +et +de +personnes +au +niveau +national +et +international +doivent +être +adaptés +aux +besoins +sociaux +et +culturels +, +au +développement +équilibré +de +l +' +économie +, +à +l +' +aménagement +cohérent +du +territoire +, +à +l +' +intérêt +national +. +§ +loin +de +s +' +opposer +, +les +différentes +techniques +de +transports +( +terrestres +, +aériens +, +maritimes +ou +fluviaux +) +les +différents +moyens +individuels +ou +collectifs +doivent +répondre +à +des +besoins +, +à +des +conditions +, +à +des +domaines +spécifiques +permettant +de +faire +face +à +la +complexité +, +à +la +diversité +et +à +la +mouvance +des +nécessités +de +la +vie +économique +et +sociale +, +tout +en +assurant +une +cohérence +et +une +efficacité +de +l +' +ensemble +. +§ +sachant +l +' +importance +que +représentent +les +conditionsde +transports +et +de +circulation +pour +l +' +existence +quotidienne +des +travailleurs +, +la +CGT +demande +$ +: +_ +une +politique +coordonnée +de +l +' +emploi +, +du +logement +et +des +équipements +sociaux +et +culturels +( +ce +qui +supposerait +la +suppression +de +la +spéculation +foncière +) +; +_ +un +véritable +service +public +de +transports +en +commun +, +desservant +l +' +ensemble +des +agglomérations +et +assurant +les +services +rapides +, +confortables +, +peu +coûteux +et +fonctionnant +aux +heures +permettant +l +' +activité +économique +, +sociale +et +culturelle +de +la +population +; +_ +l +' +amélioration +des +conditions +de +circulation +dans +les +agglomérations +permettant +d +' +élargir +l +' +accès +aux +transports +collectifs +notamment +par +l +' +adaptation +des +voieries +, +des +constructions +de +parkings +à +proximité +des +gares +ou +stations +; +_ +le +développement +de +l +' +équipement +en +transports +et +en +voies +de +circulation +entre +les +communes +isolées +et +les +agglomérations +. +ce +qui +implique +par +conséquent +, +de +cesser +le +démantèlement +des +réseaux +de +transports +existants +, +tels +la +SNCF +et +la +RATP +; +_ +la +prise +en +charge +de +l +' +essentiel +des +équipements +, +de +leur +renouvellement +et +de +leur +extension +par +des +investissements +de +l +' +* +état +. +des +taxes +progressives +étant +prélevées +sur +les +grosses +entreprises +commerciales +, +industrielles +et +la +grosse +propriété +foncière +; +_ +le +paiement +des +frais +de +transports +des +travailleurs +( +cartes +hebdomadaires +ou +autres +) +par +les +employeurs +; +_ +la +création +de +cartes +de +réduction +pour +les +chômeurs +, +les +retraités +et +vieux +travailleurs +, +sur +l +' +ensemble +des +transports +publics +; +_ +la +gratuité +des +transports +pour +les +jeunes +soldats +; +_ +l +' +extension +des +réductions +de +transports +accordées +aux +familles +nombreuses +, +aux +familles +de +travailleurs +immigrés +; +_ +l +' +amélioration +des +transports +scolaires +, +la +sécurité +des +enfants +devant +être +rigoureusement +assurée +et +les +frais +en +résultant +pris +en +charge +par +l +' +* +état +; +_ +la +création +ou +le +développement +des +moyens +de +transports +en +rapport +avec +les +besoins +en +loisirs +. +extension +des +billets +congés +payés +sur +les +transports +aériens +et +maritimes +, +création +de +navires +de +croisières +, +etc +; +_ +une +politique +de +développement +des +différents +modes +de +transports +sur +la +base +de +leur +qualité +complémentaire +, +associée +à +une +politique +nationale +de +la +construction +des +moyens +de +transports +. +< +S10 += +1 +> +la +santé +. +. +< +S10 += +0 +> +§ +la +santé +constitue +un +besoin +humain +essentiel +en +même +temps +qu +' +un +impératif +de +progrès +économique +, +social +et +culturel +. +elle +suppose +d +' +abord +des +conditions +de +vie +et +de +travail +correctes +pour +lesquelles +lutte +la +CGT +. +§ +il +appartient +avant +tout +à +l +' +* +état +de +fournir +les +moyens +nécessaires +à +la +satisfaction +de +ces +besoins +. +§ +le +droit +à +la +santé +doit +comporter +pour +toute +la +population +l +' +accès +aux +méthodes +de +prévention +, +d +' +investigation +, +de +traitement +, +de +rééducation +et +de +réadaptation +. +cet +accès +devrait +se +réaliser +dans +le +cadre +d +' +une +véritable +sectorisation +sanitaire +mettant +, +au +service +de +tous +, +les +progrès +des +techniques +médicales +et +des +sciences +biologiques +. +§ +pour +cela +la +CGT +exige +$ +: +_ +la +mise +en +oeuvre +d +' +une +véritable +réforme +de +la +santé +reposant +sur +le +principe +du +service +public +; +_ +la +reconnaissance +du +rôle +de +premier +plan +occupé +par +l +' +hôpital +public +; +_ +la +création +de +nouveaux +hopitaux +et +la +modernisation +de +ceux +qui +existent +; +l +' +implantation +des +unités +hospitalières +au +plus +près +des +lieux +d +' +activité +de +la +population +avec +des +équipements +permettant +de +prévenir +et +de +traiter +les +maladies +telles +que +notamment +le +cancer +, +les +affections +nerveuses +et +cardiaques +, +les +maladies +mentales +et +pulmonaires +; +_ +la +formation +d +' +urgence +, +et +en +nombre +suffisant +, +des +personnels +qualifiés +notamment +au +niveau +des +infirmiers +et +des +médecins +et +le +renforcement +massif +des +effectifs +des +hopitaux +, +les +personnels +bénéficiant +de +plus +justes +salaires +et +de +meilleures +conditions +de +travail +; +_ +un +statut +pour +le +secteur +privé +de +l +' +hospitalisation +garantissant +les +malades +et +les +personnels +; +_ +la +multiplication +des +centres +de +secours +hospitaliers +d +' +urgence +; +_ +le +développement +de +la +recherche +médicale +; +_ +la +promotion +de +formes +nouvelles +d +' +exercice +de +la +médecine +dans +le +respect +de +ses +principes +fondamentaux +$ +: +secret +professionnel +, +liberté +de +prescription +, +indépendance +technique +et +professionnelle +. +§ +dans +ce +but +, +il +convient +que +les +moyens +financiers +soient +assurés +permettant +le +développement +et +le +fonctionnement +des +* +centres +de +santé +, +des +* +collectivités +locales +, +de +la +* +sécurité +sociale +, +des +organisations +mutualistes +, +de +maisons +médicales +permettant +l +' +exercice +d +' +une +véritable +médecine +d +' +équipe +. +§ +la +mise +en +oeuvre +de +ces +mesures +devrait +s +' +effectuer +après +une +large +concertation +avec +les +organisations +syndicales +et +mutualistes +, +le +corps +médical +et +les +représentants +des +collectivités +locales +, +et +dans +le +cadre +d +' +une +véritable +carte +sanitaire +. +§ +ainsi +seraient +créées +les +conditions +d +' +une +réelle +humanisation +de +l +' +hôpital +, +de +la +continuité +des +soins +et +de +la +permanence +du +service +de +santé +. +< +S10 += +1 +> +les +équipements +sociaux +et +l +' +action +sociale +. +. +< +S10 += +0 +> +§ +la +CGT +attache +une +très +grande +importance +aux +différents +aspects +de +" +l +' +action +sociale +" +maintenue +, +malgré +les +déclarations +officielles +, +dans +la +plus +grande +indigence +. +§ +pour +une +politique +d +' +action +sociale +conforme +aux +exigences +actuelles +la +CGT +revendique +$ +: +_ +des +équipements +et +des +mesures +de +protection +de +l +' +enfance +et +en +tout +premier +lieu +$ +: +_ +des +crèches +$ +: +compte +tenu +des +graves +carences +qui +existent +dans +ce +domaine +il +convient +de +mettre +en +oeuvre +un +programme +d +' +urgence +. +pour +assurer +le +financement +de +la +construction +et +le +fonctionnement +des +crèches +, +il +importe +qu +' +à +la +participation +des +caisses +d +' +allocations +familiales +et +des +collectivités +locales +, +vienne +s +' +ajouter +un +versement +de +0 +- +5 +% +de +toutes +les +sommes +payées +au +titre +des +traitements +et +salaires +et +la +contribution +de +l +' +* +état +; +_ +une +véritable +médecine +scolaire +; +_ +des +maisons +et +hôtels +maternels +; +_ +des +foyers +de +l +' +enfance +; +_ +des +maisons +d +' +enfants +à +caractère +social +; +_ +l +' +ouverture +de +centres +d +' +orthogénie +et +de +consultations +spécialisées +permettant +la +connaissance +et +l +' +accès +aux +problèmes +de +la +sexualité +et +de +la +contraception +; +_ +des +équipements +et +des +mesures +spéciales +pour +les +personnes +âgées +et +en +particulier +$ +: +_ +la +création +de +centres +de +gériatrie +et +de +gérontologie +; +_ +l +' +augmentation +des +effectifs +des +aides +- +ménagères +; +_ +la +construction +de +foyers +d +' +habitation +comportant +les +équipements +sociaux +et +le +personnel +médical +nécessaire +; +_ +la +rénovation +des +" +hospices +" +existants +et +l +' +édification +d +' +établissements +chargés +d +' +accueillir +tous +ceux +qui +nécessitent +des +soins +constants +et +une +assistance +permanente +; +_ +le +développement +du +réseau +d +' +accueil +pour +les +travailleurs +immigrés +, +qui +doit +être +placé +sous +la +seule +responsabilité +de +l +' +* +office +national +d +' +immigration +, +avec +le +contrôle +syndical +et +financement +par +le +gouvernement +et +le +patronat +; +_ +la +mise +en +oeuvre +d +' +une +politique +conséquente +en +faveur +des +handicapés +qui +implique +un +effort +budgétaire +particulier +de +l +' +* +état +et +comporte +en +tout +premier +lieu +$ +: +_ +la +reconnaissance +du +droit +à +la +santé +permettant +de +mieux +prévenir +les +handicaps +et +de +mieux +les +soigner +; +_ +l +' +intégration +des +enfants +handicapés +dans +le +système +scolaire +de +l +' +* +éducation +nationale +, +en +créant +un +éventail +complet +d +' +établissements +offrant +tous +les +moyens +d +' +éducation +correspondant +aux +différents +handicaps +; +_ +la +reconnaissance +du +droit +à +l +' +emploi +sur +la +base +du +principe +de +l +' +insertion +du +travailleur +handicapé +dans +le +cadre +normal +des +entreprises +, +et +de +la +garantie +des +dispositions +légales +et +de +celles +définies +dans +les +conventions +collectives +; +_ +la +juste +rétribution +de +la +force +de +travail +du +travailleur +handicapé +qui +doit +au +minimum +percevoir +le +SMIC +et +l +' +attribution +d +' +une +allocation +égale +à +80 +% +du +SMIC +pour +ceux +qui +sont +dans +l +' +incapacité +de +travailler +; +_ +la +refonte +des +prestations +familiales +versées +aux +familles +ayant +à +leur +charge +un +enfant +handicapé +. +< +S10 += +1 +> +le +cadre +de +vie +. +. +< +S10 += +0 +> +§ +aujourdhui +, +ce +que +l +' +on +appelle +les +" +nuisances +" +atteignent +un +niveau +insupportable +pour +la +population +etspécialement +pour +les +travailleurs +, +ce +sont +$ +: +le +bruit +, +l +' +air +vicié +l +' +eau +polluée +, +les +forêts +détruites +, +le +paysage +enlaidi +, +les +cités +dortoirs +inadaptées +. +§ +mais +ce +n +' +est +pas +la +" +vie +moderne +" +qui +en +est +responsable +. +le +grand +responsable +c +' +est +l +' +anarchie +d +' +un +système +basé +sur +le +profit +qui +gaspille +les +biens +naturels +et +néglige +les +besoins +fondamentaux +de +l +' +homme +; +c +' +est +l +' +anarchiede +l +' +urbanisation +qui +se +fait +en +fonction +de +la +spéculation +foncière +et +du +profit +immobilier +; +c +' +est +l +' +anarchie +de +l +' +industrialisation +qui +se +fait +en +fonction +de +calculs +de +rentabilité +à +court +terme +; +c +' +est +l +' +anarchie +de +la +production +qui +consomme +des +biens +comme +l +' +eau +et +l +' +air +et +les +restitue +sous +forme +de +déchets +pollués +, +sans +que +personne +ne +limite +cette +consommation +ni +oblige +les +vrais +pollueurs +à +empêcher +cette +dégradation +. +§ +les +salariés +, +exploités +dans +leur +travail +, +ne +veulent +pas +, +à +leur +sortie +du +travail +, +que +ce +soit +dans +leur +localité +ou +dans +leur +lieu +de +vacances +, +retrouver +le +même +univers +inhumain +, +souillé +par +la +recherche +du +profit +immédiat +. +§ +la +CGT +demande +$ +: +_ +que +l +' +urbanisation +et +l +' +industrialisation +se +fassent +en +fonction +d +' +un +plan +élaboré +démocratiquement +; +_ +que +soit +mis +en +oeuvre +un +urbanisme +respectant +les +besoins +et +aspirations +de +la +population +tant +en +matière +esthétique +qu +' +en +matière +sociale +; +_ +qu +' +aucune +construction +d +' +ensembles +immobiliers +n +' +ait +lieu +sans +que +soient +, +en +même +temps +, +édifiées +les +installations +sociales +, +culturelles +, +sportives +nécessaires +à +la +population +; +_ +que +les +syndicats +aient +leur +mot +à +dire +, +à +l +' +échelon +local +, +départemental +ou +régional +sur +les +équipements +collectifs +nécessaires +à +la +population +; +_ +que +les +mesures +nécessaires +soient +imposées +aux +industriels +pour +que +leurs +activités +préservent +les +conditions +de +vie +de +la +population +et +les +sites +de +repos +et +qu +' +elles +respectent +des +normes +antipollution +efficaces +; +_ +que +toute +nouvelle +installation +ou +fabrication +fasse +l +' +objetd +' +un +examen +, +notamment +des +* +comités +d +' +hygiène +et +de +sécurité +, +en +liaison +avec +les +représentants +de +la +population +concernée +; +_ +qu +' +une +contribution +financière +, +prélevée +sur +le +chiffre +d +' +affaires +des +grandes +entreprises +en +fonction +des +atteintes +au +cadre +de +vie +, +soit +affectée +à +la +réparation +des +préjudices +causés +. +< +S00 += +02 +> +< +S01 += +003 +> +< +S02 += +001 +> +< +S03 += +003 +> +< +Sda += +1975 +> +< +Sdm += +06 +> +< +Sat += +0 +> +< +S10 += +1 +> +la +CGT +définit +son +action +face +à +la +situation +générale +du +pays +. +. +< +S10 += +0 +> +§ +la +crise +du +système +capitaliste +s +' +est +aggravée +. +elle +engendre +un +niveau +élevé +et +permanent +d +' +inflation +et +un +chômage +massif +. +elle +s +' +accompagne +d +' +un +ralentissement +de +l +' +activité +économique +, +de +difficultés +croissantes +de +débouchés +. +§ +la +France +est +profondément +affectée +par +le +développement +de +la +crise +qui +entraîne +des +atteintes +sérieuses +au +pouvoir +d +' +achat +et +approfondit +et +généralise +l +' +insécurité +. +§ +mais +la +crise +n +' +est +pas +fatale +. +le +dérèglement +de +l +' +économie +capitaliste +a +pour +cause +l +' +accumulation +de +profits +extraordinaires +par +les +grandes +sociétés +capitalistes +et +en +particulier +par +les +sociétés +multinationales +avec +le +soutien +de +l +' +* +état +. +§ +la +politique +du +pouvoir +vise +à +faire +supporter +la +crise +aux +travailleurs +et +au +peuple +. +l +' +austérité +n +' +est +pas +un +remède +permettant +de +sortir +de +la +crise +. +elle +l +' +accentue +. +elle +accélère +le +gâchis +des +forces +productives +humaines +et +matérielles +, +entraînant +la +destruction +et +l +' +abandon +de +secteurs +décisifs +, +aggravant +les +déséquilibres +de +l +' +appareil +productif +et +des +économies +régionales +. +le +" +redéploiement +" +que +met +en +oeuvre +le +pouvoir +pour +renforcer +les +monopoles +va +encore +les +accélérer +. +il +vise +à +soutenir +l +' +expansion +multinationale +des +groupes +monopolistes +basés +en +France +et +il +accélère +la +pénétration +de +l +' +économie +française +par +les +multinationales +étrangères +. +§ +les +orientations +du +* +7ème +plan +visent +à +prolonger +et +à +accentuer +la +politique +d +' +austérité +. +§ +cette +politique +est +profondément +nocive +, +contraire +à +l +' +intérêt +national +et +à +l +' +établissement +d +' +une +coopération +et +d +' +échanges +économiques +internationaux +sur +une +base +saine +. +§ +concentrant +toutes +les +forces +de +conservation +sociale +, +la +politique +du +pouvoir +renforce +l +' +autoritarisme +du +système +et +en +accentue +toutes +les +contraintes +majeures +. +§ +en +s +' +appuyant +sur +la +montée +de +la +volonté +populaire +de +changement +, +il +est +nécessaire +de +développer +les +luttes +sociales +pour +assurer +la +défense +des +conditions +de +travail +et +de +vie +des +travailleurs +. +en +même +temps +l +' +action +est +indispensable +pour +imposer +des +mesures +économiques +, +s +' +attaquant +à +l +' +inflation +, +assainissant +l +' +économie +et +assurant +son +développement +. +elle +est +intimement +liée +à +la +défense +des +intérêts +des +travailleurs +. +< +S10 += +1 +> +la +politique +économique +. +. +< +S10 += +0 +> +§ +pour +faire +face +à +la +crise +, +des +mesures +essentiellement +différentes +de +celles +adoptées +par +le +patronat +et +le +gouvernement +, +dont +la +responsabilité +dans +la +situation +actuelle +est +écrasante +, +sont +à +mettre +en +oeuvre +. +§ +il +est +indispensable +d +' +assurer +le +développement +prioritaire +du +marché +intérieur +et +d +' +élever +la +consommation +populaire +pour +répondre +aux +besoins +des +travailleurs +et +des +grandes +masses +de +la +population +. +pour +assurer +un +développement +économique +plus +sain +, +fondé +sur +l +' +élargissement +de +la +consommation +populaire +et +du +marché +intérieur +, +sauvegarder +l +' +emploi +et +rééquilibrer +nos +échanges +, +il +faut +promouvoir +une +politique +industrielle +s +' +appuyant +sur +le +secteur +public +. +il +faut +utiliser +toutes +les +ressources +et +potentialités +du +pays +. +il +faut +s +' +attaquer +aux +sources +de +l +' +inflation +. +§ +à +cet +effet +il +est +nécessaire +$ +: +_ +de +réduire +la +TVA +sur +les +produits +de +première +nécessité +; +_ +de +bloquer +les +prix +de +certains +produits +de +grande +consommation +, +des +produits +industriels +les +plus +importants +à +la +production +ainsi +que +les +tarifs +publics +, +les +loyers +et +les +charges +; +_ +de +réduire +et +de +contrôler +les +marges +bénéficiaires +des +grandes +sociétés +; +_ +de +mettre +en +oeuvre +une +politique +sélective +du +crédit +s +' +attaquant +aux +facilités +inflationnistes +de +crédit +offertes +aux +grandes +entreprises +, +sans +porter +atteinte +au +fonctionnement +normal +des +PME +ni +à +l +' +emploi +; +_ +de +défendre +l +' +épargne +populaire +contre +l +' +inflation +et +d +' +indexer +le +montant +des +livrets +A +- +de +* +caisse +d +' +épargne +sur +l +' +évolution +réelle +des +prix +. +§ +pour +s +' +opposer +à +la +dégradation +de +l +' +emploi +et +assurer +son +développement +, +sont +nécessaires +des +mesures +de +réduction +de +la +durée +du +travail +, +d +' +abaissement +d +' +âge +de +la +retraite +, +la +garantie +des +ressources +, +l +' +interdiction +des +décisions +de +licenciement +sans +reclassement +préalable +, +le +droit +et +les +moyens +de +discuter +du +bien +fondé +des +décisions +de +licenciement +et +de +fermeture +d +' +entreprises +. +conjointement +, +il +est +indispensable +de +mettre +en +oeuvre +une +politique +économique +et +sociale +assurant +le +développement +économique +et +qui +soit +créatrice +d +' +emplois +. +ceci +exige +notamment +le +développement +des +services +et +activités +directement +utiles +à +l +' +économie +ou +indispensables +à +l +' +amélioration +des +conditions +de +vie +( +enseignement +, +santé +, +services +sociaux +, +etc +) +. +§ +il +faut +stopper +l +' +abandon +, +la +liquidation +et +la +subordination +au +capital +étranger +de +secteurs +ou +d +' +entreprisesindispensables +au +développement +de +l +' +économie +française +qu +' +entraîne +la +politique +actuelle +, +assurer +leur +maintien +et +leur +développement +, +notamment +dans +les +secteurs +de +pointe +, +vitaux +pour +la +souveraineté +nationale +et +la +définition +de +la +place +de +notre +pays +dans +la +civilisation +internationale +du +travail +. +§ +la +politique +industrielle +doit +s +' +appuyer +sur +l +' +extension +du +secteur +public +pour +assurer +le +développement +de +productions +nationales +nécessaires +au +développement +de +l +' +économie +, +indispensables +à +son +équilibre +interne +et +à +celui +de +ses +échanges +extérieurs +. +§ +indépendamment +des +mesures +visant +à +une +réforme +de +la +fiscalité +qui +aurait +une +portée +économique +positive +, +les +subventions +et +autres +transferts +effectués +au +bénéfice +du +grand +capital +doivent +être +supprimés +. +un +impôt +sur +le +capital +des +grandes +firmes +françaises +doit +être +instauré +. +§ +les +ressources +dégagées +doivent +être +, +en +priorité +, +affectées +aux +équipements +sociaux +. +le +budget +de +l +' +* +état +doit +être +équilibré +. +il +convient +de +réduire +substantiellement +les +dépenses +militaires +avant +tout +par +la +suppression +de +la +force +de +frappe +nucléaire +et +en +prévoyant +la +reconversion +des +industries +d +' +armement +et +des +activités +qui +leur +sont +liées +vers +des +fabrications +civiles +en +utilisant +pleinement +le +potentiel +scientifique +technologique +devenu +ainsi +disponible +. +§ +une +nouvelle +orientation +de +la +fiscalité +et +du +budget +et +des +fonds +publics +ou +parapublics +( +conjugués +avec +le +contrôle +des +prix +et +du +crédit +) +est +indispensable +pour +s +' +attaquer +à +l +' +inflation +qui +pèse +lourdement +sur +les +travailleurs +et +les +titulaires +de +petits +revenus +et +qui +a +également +des +effets +négatifs +sur +les +échanges +extérieurs +. +§ +il +est +immédiatement +nécessaire +d +' +augmenter +rythme +et +réalisation +des +équipements +sociaux +et +collectifs +afin +de +combler +les +retards +considérables +accumulés +dans +ce +domaine +. +§ +ces +mesures +sont +de +nature +à +impulser +l +' +activité +dans +de +nombreux +secteurs +de +production +et +à +favoriser +la +mise +en +oeuvre +de +techniques +nouvelles +. +§ +un +changement +radical +de +la +politique +énergétique +de +la +France +est +urgent +. +il +faut +en +finir +avec +le +pillage +et +la +domination +des +sociétés +multinationales +sur +la +politique +énergétique +. +§ +une +politique +nouvelle +fondée +sur +la +diversification +et +la +coordination +des +sources +d +' +énergie +doit +être +appliquée +. +elle +doit +comporter +$ +: +_ +l +' +arrêt +immédiat +des +fermetures +de +puits +dans +les +mines +de +charbon +encore +en +exploitation +et +l +' +utilisation +à +plein +des +capacités +actuelles +d +' +extraction +; +_ +un +plan +d +' +augmentation +de +la +production +charbonnière +utilisant +pleinement +les +ressources +nationales +; +_ +l +' +utilisation +des +potentialités +nationales +pour +la +production +hydraulique +d +' +électricité +, +notamment +par +l +' +énergie +marémotrice +; +_ +le +développement +de +la +production +d +' +électricité +d +' +origine +nucléaire +en +orientant +le +choix +entre +les +différentes +techniques +de +réacteurs +, +dans +le +but +d +' +assurer +une +meilleure +utilisation +possible +des +réserves +naturelles +en +matériaux +fissiles +pour +la +production +d +' +électricité +; +_ +" +aucune +considération +de +rentabilité +économique +ne +doit +être +opposée +aux +mesures +indispensables +pour +assurer +la +sécurité +de +la +population +et +du +personnel +" +; +_ +la +suppression +des +privilèges +des +sociétés +pétrolières +et +l +' +abaissement +des +taxes +à +la +consommation +sur +les +produits +pétroliers +; +_ +l +' +établissement +avec +les +pays +producteurs +de +pétrole +et +de +gaz +naturel +de +contrats +sur +la +base +de +l +' +intérêt +mutuel +des +peuples +, +en +bannissant +toute +pratique +néo +- +coloniale +et +sans +interférence +des +compagnies +; +_ +la +nationalisation +de +l +' +ensemble +du +secteur +pétrolier +et +, +dans +l +' +immédiat +, +la +nationalisation +des +groupes +pétroliers +français +Elf +- +Erap +CFP +- +Total +; +_ +le +développement +de +la +recherche +, +par +le +secteur +public +et +nationalisé +, +sur +les +sources +d +' +énergie +de +l +' +avenir +$ +: +hydrogène +, +énergie +solaire +, +géothermie +, +fusion +thermonucléaire +contrôlée +. +§ +la +remise +en +cause +généralisée +du +rôle +du +service +public +, +le +démantèlement +de +certaines +activités +des +administrations +et +entreprises +nationalisées +par +leur +transfert +, +soit +pour +les +faire +effectuer +par +des +personnels +hors +statut +, +soit +pour +faire +bénéficier +les +monopoles +de +leur +rentabilité +, +la +pénétration +accélérée +de +ces +administrations +et +entreprises +par +les +capitaux +privés +doivent +être +stoppés +. +au +contraire +, +il +convient +de +développer +le +secteur +public +et +nationalisé +et +de +le +mettre +au +service +de +l +' +intérêt +national +, +ce +qui +implique +une +politique +de +tarifs +mettant +fin +aux +transferts +considérables +opérés +au +bénéfice +des +monopoles +et +au +détriment +de +la +grande +masse +des +usagers +et +qui +pèsent +sur +les +prix +à +la +consommation +. +§ +une +politique +coordonnée +des +transports +, +combinant +le +développement +des +infrastructures +nouvelles +et +l +' +utilisation +des +capacités +existantes +répondant +aux +besoins +des +usagers +, +des +régions +, +du +développement +économique +national +et +des +échanges +internationaux +de +la +France +, +est +à +mettre +en +oeuvre +. +§ +cette +politique +doit +s +' +insérer +dans +un +plan +de +développement +à +long +terme +des +infrastructures +nécessaires +pour +satisfaire +au +mieux +et +au +moindre +coût +économique +et +social +les +besoins +prévisibles +. +il +est +urgent +de +développer +les +transports +collectifs +d +' +usagers +, +notamment +les +transports +urbains +. +§ +il +est +nécessaire +d +' +organiser +une +recherche +scientifique +dégagée +de +la +pression +matérielle +et +morale +des +intérêts +privés +qui +s +' +efforcent +d +' +en +monopoliser +les +résultats +et +compromettent +son +avenir +à +long +terme +. +§ +l +' +enseignement +supérieur +et +les +établissements +publics +de +recherche +scientifique +doivent +recevoir +les +moyens +nécessaires +au +développement +des +différents +secteurs +de +la +recherche +, +conformément +à +l +' +intérêt +national +. +§ +en +ce +qui +concerne +l +' +aménagement +du +territoire +, +il +faut +en +premier +lieu +assurer +un +niveau +d +' +activité +permettant +de +réaliser +le +plein +emploi +, +s +' +attaquer +aux +facteurs +de +régression +que +sont +les +disparités +en +matière +de +salaires +, +d +' +équipements +collectifs +et +sociaux +. +§ +les +investissements +publics +, +ceux +du +secteur +nationalisé +, +doivent +être +orientés +en +vue +de +rééquilibrer +les +économies +régionales +. +il +est +urgent +de +prendre +des +mesures +pour +arrêter +le +dépérissement +des +régions +du +Centre +de +la +France +, +de +l +' +Ouest +- +Sud +- +Ouest +. +des +mesures +spécifiques +doivent +être +adoptées +à +cet +effet +. +§ +les +objectifs +généraux +suivants +doivent +être +assignés +à +la +politique +d +' +aménagement +du +territoire +. +§ +infrastructures +$ +: +_ +accélération +des +liaisons +de +désenclavement +des +régions +et +de +jonctions +radiales +interrégions +, +notamment +autoroutières +sous +le +contrôle +et +avec +le +financement +de +l +' +* +état +; +_ +arrêt +des +fermetures +de +liaisons +ferroviaires +et +accélération +des +programmes +d +' +investissements +; +_ +participation +accrue +de +l +' +* +état +et +du +FDES +( +* +fonds +développement +économique +et +social +) +à +la +modernisation +des +installations +portuaires +et +fluviales +; +_ +modernisation +et +extension +prioritaire +du +réseau +de +télécommunications +. +§ +industrie +$ +: +_ +développement +diversifié +des +activités +économiques +régionales +prenant +appui +sur +les +ressources +propres +de +chaque +région +et +leur +vocation +; +_ +utilisation +de +l +' +ensemble +des +ressources +industrielles +, +énergétiques +, +minières +, +agricoles +et +humaines +de +chaque +région +. +§ +dans +le +domaine +législatif +et +réglementaire +, +il +est +nécessaire +de +prendre +les +mesures +suivantes +$ +: +_ +élection +au +suffrage +universel +direct +et +à +la +proportionnelle +des +* +conseils +régionaux +et +accroissement +des +ressources +des +régions +par +transfert +du +budget +de +l +' +* +état +et +suppression +de +la +fiscalité +supplémentaire +prévue +par +la +loi +du +5 +juillet +1972 +; +_ +augmentation +de +la +représentation +des +organisations +représentatives +des +salariés +dans +les +CESR +( +* +conseils +économiques +et +sociaux +régionaux +) +et +répartition +des +sièges +attribués +à +ces +organisations +proportionnellement +à +leur +influence +respective +; +_ +suppression +des +sièges +attribués +aux +organisations +non +représentatives +. +§ +il +est +indispensable +de +cesser +les +encouragements +sous +des +formes +diverses +visant +à +favoriser +les +exportations +de +capitaux +et +il +faut +viser +à +se +prémunir +contre +leurs +effets +inflationnistes +et +à +contrôler +les +mouvements +de +capitaux +pour +défendre +la +monnaie +. +les +investissements +de +capitaux +étrangers +doivent +faire +l +' +objet +d +' +un +strict +contrôle +et +être +interdits +dans +tous +les +cas +où +ils +mettent +en +cause +la +maîtrise +de +l +' +économie +du +pays +et +la +souveraineté +nationale +. +§ +il +est +nécessaire +de +procéder +, +progressivement +, +à +une +diversification +de +nos +relations +économiques +extérieures +tant +en +ce +qui +concerne +le +commerce +extérieur +que +la +coopération +technique +et +scientifique +en +les +fondant +sur +l +' +intérêt +mutuel +et +en +les +étendant +à +un +nombre +plus +grand +de +pays +, +notamment +les +pays +socialistes +et +les +pays +en +voie +de +développement +. +§ +ces +mesures +ne +peuvent +être +imposées +que +par +les +luttes +des +salariés +et +des +grandes +masses +de +la +population +. +elles +s +' +inscrivent +en +opposition +avec +la +politique +réactionnaire +du +pouvoir +dont +les +effets +néfastes +s +' +expriment +dans +la +crise +actuelle +. +< +S10 += +1 +> +les +libertés +. +. +< +S10 += +0 +> +§ +luttant +pour +l +' +instauration +d +' +un +véritable +régime +démocratique +, +la +CGT +s +' +oppose +au +caractère +de +plus +en +plus +autoritaire +du +pouvoir +qui +tente +de +le +dissimuler +dans +un +libéralisme +de +façade +. +§ +elle +dénonce +la +propagande +antisyndicale +du +patronat +et +des +hommes +du +pouvoir +et +les +campagnes +racistes +de +leurs +officines +. +§ +la +CGT +s +' +élève +contre +l +' +accroissement +des +contraintes +, +directes +et +indirectes +du +pouvoir +et +du +patronat +dirigées +contre +les +libertés +individuelles +et +publiques +et +mettant +en +cause +les +droits +syndicaux +, +notamment +le +droit +de +grève +et +les +autres +droits +des +travailleurs +. +< +S10 += +1 +> +libertés +collectives +et +individuelles +. +. +< +S10 += +0 +> +§ +elle +juge +que +le +respect +des +libertés +fondamentales +dans +notre +pays +exige +, +dans +l +' +immédiat +, +l +' +ensemble +des +mesures +suivantes +$ +: +_ +respect +absolu +du +droit +de +pétition +et +de +manifestation +; +_ +abrogation +de +la +loi +du +8 +juin +1970 +, +dite +loi +" +anticasseur +" +; +_ +droit +d +' +expression +des +syndicats +sur +les +antennes +de +la +radio +et +de +la +télévision +; +_ +abrogation +de +la +loi +du +7 +août +1974 +portant +suppression +de +l +' +ORTF +et +remplacement +de +cette +loi +par +un +ensemble +législatif +garantissant +l +' +indépendance +, +la +démocratisation +et +la +qualité +de +la +radio +et +de +la +télévision +française +; +_ +mise +en +oeuvre +d +' +un +statut +démocratique +du +jeune +soldat +assurant +le +droit +d +' +association +de +libertés +d +' +expression +, +de +respect +de +la +dignité +de +l +' +homme +citoyen +et +l +' +arrêt +de +toutes +sanctions +prises +arbitrairement +; +_ +suppression +des +juridictions +d +' +exception +telle +la +* +cour +de +sûreté +de +l +' +* +état +; +_ +modification +profonde +de +la +loi +1963 +pour +aboutir +à +un +véritable +statut +des +objecteurs +de +conscience +; +_ +rattachement +de +la +police +judiciaire +au +ministère +de +la +justice +; +_ +démocratisation +de +la +police +dans +son +recrutement +sa +formation +et +son +utilisation +; +_ +suppression +des +polices +parallèles +; +_ +rétablissement +et +respect +des +franchises +universitaires +; +_ +réforme +de +la +procédure +de +flagrant +délit +; +_ +abrogation +de +la +garde +à +vue +; +_ +droit +immédiat +et +gratuit +, +en +cas +d +' +arrestation +, +à +l +' +assistance +d +' +un +avocat +; +_ +droit +pour +tout +inculpé +de +connaître +son +dossier +aussi +bien +que +le +procureur +; +_ +réforme +des +règles +d +' +enquête +judiciaire +; +_ +levée +du +secret +de +l +' +instruction +judiciaire +; +_ +abolition +du +pouvoir +discrétionnaire +du +* +ministre +de +l +' +intérieur +en +matière +d +' +expulsion +, +de +refoulement +et +d +' +assignation +à +résidence +; +_ +garantie +des +libertés +individuelles +et +collectives +des +travailleurs +immigrés +, +de +leur +dignité +, +de +leurs +droits +d +' +expression +, +d +' +association +et +de +leurs +droits +politiques +; +_ +réforme +du +système +pénitentiaire +dans +le +sens +d +' +une +véritable +humanisation +des +conditions +de +détention +et +de +la +garantie +de +la +sécurité +des +gardiens +; +_ +répression +sévère +des +attentats +, +violences +et +campagnes +racistes +et +stricte +application +de +la +loi +antiraciste +du +1er +juillet +1972 +. +< +S10 += +1 +> +liberté +de +la +presse +et +des +autres +moyens +d +' +information +. +. +< +S10 += +0 +> +§ +la +crise +que +connaît +actuellement +la +presse +écrite +a +son +origine +dans +l +' +entreprise +délibérée +du +pouvoir +et +des +quelques +journaux +à +grand +tirage +, +propriété +de +groupes +industriels +et +financiers +, +pour +s +' +assurer +le +monopole +de +l +' +information +. +§ +c +' +est +le +même +objectif +que +poursuit +le +pouvoir +en +démantelant +l +' +ORTF +et +en +s +' +assurant +plus +complètement +le +contrôle +des +radios +périphériques +. +§ +il +s +' +agit +de +la +volonté +délibérée +de +mettre +en +cause +une +liberté +essentielle +$ +: +la +liberté +d +' +expression +. +§ +le +droit +à +l +' +information +est +une +donnée +essentielle +et +permanente +de +la +démocratie +. +§ +la +CGT +demande +une +discussion +générale +de +toutes +les +parties +intéressées +_ +y +compris +les +représentants +des +organisations +syndicales +de +travailleurs +en +vue +de +rechercher +une +solution +d +' +ensemble +pour +assurer +l +' +existence +de +l +' +indépendance +des +moyens +d +' +information +. +§ +en +outre +, +elle +réclame +$ +: +_ +une +industrie +nationale +du +papier +de +presse +; +_ +l +' +abrogation +des +mesures +fiscales +et +postales +amputant +les +aides +consenties +à +la +presse +à +la +* +libération +; +_ +une +réglementation +des +ressources +publicitaires +; +_ +des +garanties +pour +le +libre +exercice +de +la +fonction +de +journaliste +aussi +bien +à +la +radio +, +à +la +télévision +que +dans +la +presse +écrite +. +< +S00 += +02 +> +< +S01 += +003 +> +< +S02 += +001 +> +< +S03 += +004 +> +< +Sda += +1975 +> +< +Sdm += +06 +> +< +Sat += +0 +> +< +S10 += +1 +> +la +CGT +définit +son +action +face +aux +grands +problèmes +internationaux +et +au +marché +commun +. +. +la +solidarité +internationale +, +la +paix +, +l +' +indépendance +nationale +. +. +< +S10 += +0 +> +§ +l +' +accentuation +de +la +crise +générale +du +capitalisme +fait +obligation +au +mouvement +syndical +de +lier +étroitement +la +lutte +pour +les +revendications +économiques +et +sociales +des +travailleurs +aux +niveaux +national +et +international +ainsi +qu +' +au +combat +plus +général +pour +le +maintien +de +la +paix +, +pour +le +développement +de +rapports +internationaux +permettant +l +' +établissement +d +' +un +climat +mondial +de +coopération +entre +les +peuples +. +§ +notre +époque +est +caractérisée +par +des +grandes +luttes +des +travailleurs +et +des +peuples +pour +l +' +indépendance +nationale +et +la +démocratie +, +le +progrès +social +et +la +paix +, +pour +le +socialisme +. +la +solidarité +internationale +acquiert +des +dimensions +inconnues +jusqu +' +ici +. +§ +d +' +importants +succès +ont +été +obtenus +dans +ces +domaines +. +après +avoir +été +contraint +de +signer +les +accords +de +Paris +, +l +' +impérialisme +US +a +été +chassé +du +Viêt +- +Nam +et +du +Cambodge +qui +ont +été +définitivement +libérés +. +des +pays +anciennement +colonisés +ont +acquis +leur +indépendance +politique +, +certains +acquièrent +ou +consolident +leur +indépendance +économique +, +au +Portugal +et +en +Grèce +le +fascisme +a +subi +un +échec +; +des +progrès +sont +enregistrés +pour +l +' +établissement +de +la +coexistence +pacifique +dans +le +* +monde +, +pour +la +détente +et +la +coopération +européenne +. +§ +l +' +impérialisme +est +en +crise +profonde +et +s +' +affaiblit +. +il +est +contraint +à +des +reculs +. +mais +, +en +vue +de +maintenir +et +si +possible +de +renforcer +sa +domination +et +son +exploitation +sur +les +travailleurs +et +les +peuples +, +il +intervient +de +plus +en +plus +contre +la +liberté +des +peuples +, +emploie +la +violence +la +plus +bestiale +comme +au +Chili +pour +s +' +opposer +au +développement +de +la +démocratie +. +il +relance +l +' +alliance +atlantique +, +dangereuse +pour +la +paix +mondiale +et +l +' +indépendance +des +peuples +, +il +fomente +complots +et +agressions +. +§ +de +plus +, +il +favorise +le +développement +des +sociétés +multinationales +et +l +' +internationalisation +de +l +' +exploitation +des +travailleurs +, +il +organise +l +' +intégration +monopoliste +comme +dans +le +* +marché +commun +. +§ +la +CGT +considère +que +la +lutte +anti +- +impérialiste +et +antimonopoliste +est +un +impératif +pour +la +défense +des +intérêts +des +travailleurs +. +§ +en +se +félicitant +qu +' +en +France +des +actions +unitaires +se +manifestent +pour +l +' +affirmation +de +la +solidarité +internationale +des +travailleurs +et +la +défense +de +la +paix +, +la +CGT +s +' +efforce +de +faire +progresser +l +' +action +unie +de +la +classe +ouvrière +et +des +organisations +syndicales +dans +le +monde +et +plus +spécialement +en +Europe +. +§ +constatant +que +la +politique +extérieure +du +* +pouvoir +en +France +s +' +efforce +d +' +enchaîner +notre +pays +à +la +stratégie +planétaire +de +l +' +impérialisme +US +, +la +CGT +exige +le +respect +et +la +défense +de +l +' +indépendance +et +de +la +souveraineté +nationale +, +que +soient +prises +par +notre +pays +des +initiatives +pour +la +coexistence +pacifique +, +pour +le +désarmement +général +et +contrôlé +, +pour +l +' +établissement +d +' +une +action +et +durable +entente +entre +les +peuples +du +monde +. +§ +la +CGT +se +prononce +et +déploie +son +action +$ +: +_ +pour +la +participation +active +de +la +France +à +la +détente +internationale +, +aux +règlements +par +voie +de +négociations +des +litiges +internationaux +, +à +l +' +organisation +de +la +coexistence +pacifique +et +du +désarmement +général +; +_ +pour +la +suppression +de +toute +force +de +frappe +atomique +, +qu +' +elle +soit +nationale +, +multinationale +ou +européenne +et +des +armes +de +destruction +massive +, +pour +la +réduction +des +dépenses +d +' +armement +et +l +' +utilisation +des +fonds +ainsi +disponibles +à +la +solution +des +grands +problèmes +de +notre +temps +( +aide +aux +pays +sous +- +développés +, +lutte +contre +le +chômage +et +pour +l +' +emploi +, +contre +la +pollution +, +etc +) +; +_ +pour +la +dissolution +simultanée +de +tous +les +blocs +militaires +. +la +France +ne +doit +pas +participer +à +un +bloc +militaire +quel +qu +' +il +soit +, +ce +qui +implique +son +désengagement +du +* +pacte +atlantique +; +_ +pour +le +respect +de +l +' +indépendance +des +peuples +, +la +non +- +ingérence +dans +leurs +affaires +intérieures +et +l +' +établissement +sur +un +pied +d +' +égalité +d +' +une +véritable +politique +de +coopération +avec +les +peuples +nouvellement +indépendants +; +_ +après +la +victoire +historique +des +peuples +du +Viêt +- +Nam +et +du +Cambodge +, +la +CGT +exigera +que +ces +peuples +qui +ont +eu +à +supporter +durant +de +longues +années +une +guerre +de +destruction +massive +puissent +faire +valoir +leurs +droitsà +de +justes +réparations +et +pour +une +reconstruction +rapide +des +régions +dévastées +. +la +France +doit +élargir +et +développer +ses +rapports +, +avec +la +* +république +démocratique +du +Viêt +- +Nam +, +avec +le +GRP +du +Sud +- +Viêt +- +Nam +, +avec +le +Laos +et +le +GRUNC +du +Cambodge +; +_ +pour +le +règlement +politique +du +conflit +au +Moyen +- +Orient +sur +la +base +des +résolutions +de +l +' +ONU +prévoyant +, +en +premier +lieu +, +l +' +évacuation +des +territoires +occupés +par +l +' +armée +israélienne +, +la +reconnaissance +des +droits +nationaux +du +peuple +arabe +de +Palestine +, +le +droit +à +l +' +existence +de +tous +les +états +de +la +région +y +compris +l +' +* +état +d +' +Israël +. +la +CGT +souhaite +que +la +* +conférence +de +Genève +permette +un +tel +règlement +écartant +à +l +' +avenir +toute +ingérence +impérialiste +et +que +s +' +instaure +un +climat +de +détente +et +de +coopération +entre +les +* +états +et +les +* +communautés +du +Moyen +- +Orient +; +_ +pour +l +' +organisation +d +' +une +véritable +sécurité +collective +entre +tous +les +* +états +d +' +Europe +sans +distinction +de +régime +politique +. +la +CGT +soutient +les +diverses +initiatives +qui +tendent +à +créer +sur +notre +continent +un +véritable +climat +de +coexistence +pacifique +. +elle +souhaite +que +rapidement +soient +menés +à +bien +les +travaux +de +la +* +conférence +européenne +de +sécurité +et +de +coopération +; +_ +pour +la +liquidation +totale +du +colonialisme +et +pour +la +condamnation +de +toute +politique +néo +- +colonialiste +tendant +à +maintenir +sous +la +dépendance +du +système +capitaliste +de +nombreux +pays +, +particulièrement +en +ce +qui +concerne +l +' +exploitation +de +leur +richesse +nationale +. +la +CGT +soutient +l +' +action +des +peuples +concernés +pour +la +libre +disposition +et +la +mise +en +valeur +de +leurs +richesses +naturelles +, +leur +commercialisation +et +leur +utilisation +. +elle +dénonce +la +politique +de +l +' +impérialisme +qui +vise +à +maintenir +de +nombreux +pays +dans +des +zones +de +dépendance +économique +et +politique +portant +ainsi +entrave +à +la +lutte +pour +une +véritable +indépendance +nationale +. +§ +la +CGT +s +' +est +félicitée +et +a +salué +les +succès +des +forces +démocratiques +au +Portugal +et +la +liquidation +du +régime +fasciste +en +Grèce +. +elle +est +solidaire +et +apporte +un +appui +sans +réserve +à +la +lutte +des +travailleurs +et +du +* +peuple +d +' +Espagne +pour +un +changement +radical +de +régime +, +pour +l +' +amnistie +, +pour +la +démocratie +et +la +liquidation +du +franquisme +. +§ +de +même +, +elle +continuera +d +' +être +aux +côtés +des +peuples +d +' +Afrique +du +Sud +, +de +Zimbabwe +, +de +Namibie +dont +l +' +action +est +renforcée +par +les +succès +anticolonialistes +arrachés +par +les +peuples +de +Guinée +- +Bissau +, +d +' +Angola +et +du +Mozambique +. +§ +la +CGT +, +en +dénonçant +les +interventions +répétées +des +USA +et +, +plus +précisément +d +' +organismes +comme +la +CIA +en +Amérique +latine +, +affirme +sa +solidarité +aux +travailleurs +et +aux +peuples +de +cette +région +du +monde +. +elle +développera +avec +plus +de +force +le +soutien +et +l +' +aide +aux +travailleurs +et +au +peuple +du +Chili +, +dans +leur +détermination +pour +la +liquidation +de +la +junte +fasciste +et +le +rétablissement +des +libertés +démocratiques +dans +leur +pays +. +§ +les +récentes +luttes +dans +les +pays +dits +départements +d +' +Outre +- +Mer +ont +posé +avec +force +la +nécessité +du +changement +des +rapports +entre +la +France +et +ces +pays +. +la +CGT +soutient +leurs +revendications +nationales +et +leur +demande +légitime +d +' +accéder +à +un +statut +d +' +autonomie +. +§ +face +au +développement +des +sociétés +multinationales +la +CGT +considère +que +chaque +pays +a +le +droit +$ +: +_ +de +prendre +des +mesures +pour +que +les +sociétés +multinationales +investissent +leurs +bénéfices +dans +le +pays +où +ils +ont +été +obtenus +; +_ +d +' +orienter +les +investissements +d +' +origine +extérieure +vers +tel +ou +tel +secteur +ou +vers +telle +ou +telle +région +, +suivant +les +nécessités +de +son +développement +; +_ +d +' +instaurer +un +contrôle +public +et +démocratique +des +importations +et +exportations +de +capitaux +; +_ +de +nationaliser +les +entreprises +implantées +sur +son +territoire +et +de +disposer +librement +de +ses +ressources +nationales +afin +de +créer +ou +d +' +assurer +les +bases +d +' +un +développement +indépendant +et +d +' +une +coopération +internationale +fondée +sur +les +avantages +mutuels +. +§ +s +' +appuyant +sur +le +soutien +des +travailleurs +, +la +CGT +agit +pour +la +reconnaissance +et +la +pleine +application +de +ces +principes +par +les +gouvernements +, +les +groupements +interétatiques +et +les +organisations +internationales +( +ONU +, +OIT +, +etc +) +. +elle +considère +que +les +politiques +communes +et +les +mesures +arrêtées +au +niveau +de +la +CEE +doivent +respecter +les +principes +énoncés +ci +- +dessus +. +§ +pour +assurer +la +défense +des +intérêts +des +travailleurs +, +face +à +l +' +internationalisation +du +capital +et +de +la +production +, +la +CGT +exige +également +des +mesures +économiques +, +à +savoir +$ +: +_ +les +organisations +syndicales +doivent +avoir +le +droit +et +les +moyens +de +discuter +avec +la +direction +des +entreprises +multinationales +des +problèmes +qui +se +posent +à +l +' +ensemble +des +travailleurs +d +' +une +même +société +( +ou +d +' +un +groupe +) +. +le +droit +de +négociations +collectives +internationales +pour +les +travailleurs +appartenant +à +des +groupes +économiques +multinationaux +, +sans +que +cela +affecte +le +plein +exercice +des +droits +syndicaux +au +niveau +de +chaque +entreprise +et +de +chaque +état +. +il +est +nécessaire +de +promouvoir +en +ce +domaine +, +une +réglementation +communautaire +. +aucune +négociation +, +à +un +niveau +international +, +ne +saurait +remettre +en +cause +les +avantages +acquis +, +ni +porter +atteinte +au +droit +de +négociations +des +syndicats +au +niveau +de +chaque +pays +. +_ +les +travailleurs +doivent +avoir +le +droit +effectif +et +les +moyens +de +participer +pleinement +aux +activités +syndicales +, +nationales +et +internationales +. +ils +doivent +disposer +pleinement +du +droit +de +grève +sans +restriction +d +' +aucune +sorte +. +les +organisations +internationales +et +groupements +interétatiques +( +OIT +, +CEE +, +etc +) +doivent +promouvoir +les +instruments +nécessaires +à +un +libre +exercice +du +droit +syndical +et +des +droits +sociaux +et +veiller +à +leur +application +. +_ +des +organismes +représentatifs +doivent +être +constitués +au +niveau +des +sociétés +multinationales +avec +droit +d +' +information +et +de +consultation +des +représentants +élus +des +travailleurs +et +des +organisations +syndicales +de +chaque +pays +, +sur +la +politique +sociale +, +la +gestion +économique +et +notamment +les +résultats +économiques +, +financiers +et +la +politique +d +' +investissement +menée +par +la +société +. +_ +pour +assurer +des +garanties +minimales +aux +travailleurs +en +relation +avec +les +problèmes +nouveaux +posés +par +le +développement +accéléré +des +sociétés +multinationales +, +il +est +nécessaire +de +donner +une +portée +plus +effective +et +un +champ +plus +large +aux +normes +internationales +du +travail +élaborées +par +l +' +OIT +. +_ +les +organisations +internationales +et +groupements +interétatiques +( +OIT +, +CEE +, +etc +) +doivent +promouvoir +les +instruments +nécessaires +à +un +libre +exercice +du +droit +syndical +à +l +' +extension +des +droits +sociaux +rendus +indispensables +par +le +développement +des +sociétés +multinationales +et +veiller +à +leur +application +. +< +S10 += +1 +> +le +marché +commun +. +. +< +S10 += +0 +> +§ +favorable +à +une +coopération +englobant +tous +les +pays +européens +, +y +compris +les +pays +socialistes +, +la +CGT +réaffirme +son +opposition +à +la +division +actuelle +de +l +' +Europe +. +§ +la +CGT +tient +compte +de +la +réalité +que +représente +le +* +marché +commun +, +mais +elle +considère +que +l +' +intérêt +national +est +d +' +assurer +un +meilleur +équilibre +et +une +croissance +plus +saine +de +ses +échanges +, +ce +qui +exige +que +ses +relations +économiques +, +techniques +et +scientifiques +s +' +établissent +avec +tous +les +pays +et +soient +réellement +fondées +sur +la +base +de +l +' +avantage +réciproque +. +§ +assujetties +aux +plus +puissants +monopoles +, +les +politiques +communautaires +visent +au +renforcement +de +la +domination +des +grandes +féodalités +économiques +et +financières +, +s +' +opposent +à +la +maîtrise +de +l +' +économie +nationale +et +comportent +des +atteintes +et +des +risques +pour +l +' +indépendance +nationale +. +§ +face +au +* +marché +commun +qui +a +favorisé +un +tel +renforcement +et +accentué +les +déséquilibres +sectoriels +et +régionaux +mais +s +' +est +avéré +incapable +d +' +instaurer +une +politique +sociale +prenant +en +compte +les +intérêts +des +travailleurs +, +la +CGT +agit +pour +l +' +action +commune +des +travailleurs +et +des +organisations +syndicales +d +' +Europe +. +§ +les +revendications +et +les +réformes +à +partir +desquelles +l +' +unité +d +' +action +doit +se +réaliser +sont +nombreuses +. +elles +concernent +notamment +$ +: +_ +s +' +agissant +des +revendications +à +avancer +$ +: +_ +la +garantie +et +la +progression +du +pouvoir +d +' +achat +des +salaires +, +retraites +, +pensions +et +allocations +; +ce +qui +suppose +des +mesures +concrètes +de +nature +à +juguler +la +hausse +des +prix +et +l +' +inflation +; +_ +la +sécurité +de +l +' +emploi +et +la +garantie +des +revenus +; +_ +la +réduction +de +la +durée +du +travail +; +_ +l +' +allongement +du +temps +de +congés +payés +; +_ +l +' +amélioration +des +conditions +de +travail +, +de +la +protection +de +l +' +hygiène +et +de +la +sécurité +du +travail +, +en +général +de +la +qualité +de +la +vie +essentiellement +dans +les +grandes +concentrations +urbaines +et +industrielles +; +_ +l +' +extension +des +libertés +syndicales +et +des +droits +démocratiques +des +travailleurs +dans +les +entreprises +ou +dans +la +vie +publique +; +_ +l +' +abolition +de +toute +forme +de +discrimination +entre +femmes +et +hommes +, +jeunes +et +adultes +; +_ +l +' +égalité +des +droits +dans +tous +les +domaines +pour +les +travailleurs +immigrés +des +pays +membres +et +des +pays +tiers +; +_ +une +véritable +formation +professionnelle +et +continue +en +rapport +avec +les +conditions +actuelles +; +_ +la +mise +en +oeuvre +d +' +une +politique +progressiste +dans +les +domaines +de +la +sécurité +sociale +, +de +la +santé +, +des +prestations +familiales +, +de +la +retraite +( +sous +le +double +aspect +de +l +' +âge +et +des +ressources +garanties +) +. +_ +s +' +agissant +des +réformes +à +proposer +$ +: +_ +de +convenir +d +' +objectifs +communs +à +atteindre +dans +le +domaine +de +la +démocratisation +des +* +institutions +communautaires +; +_ +de +présenter +et +de +soutenir +ensemble +des +propositions +concrètes +de +nature +à +faire +échec +à +l +' +activité +dominatrice +des +firmes +multinationales +et +dans +l +' +immédiat +, +compte +tenu +de +la +situation +énergétique +, +de +soumettre +le +cartel +international +du +pétrole +à +de +strictes +mesures +de +contrôle +conformément +à +l +' +intérêt +général +; +_ +de +favoriser +les +échanges +commerciaux +, +économiques +, +scientifiques +et +culturels +entre +* +états +; +_ +de +stimuler +la +coopération +, +notamment +dans +l +' +informatique +, +l +' +aéronautique +et +le +nucléaire +, +de +telle +façon +que +prédominent +les +intérêts +généraux +, +ce +qui +implique +la +mise +en +cause +de +l +' +utilisation +des +fonds +publics +pour +le +financement +de +sociétés +privées +; +_ +de +soutenir +d +' +un +commun +accord +l +' +idée +de +nouvelles +relations +entre +les +pays +de +l +' +Europe +et +les +pays +en +voie +de +développement +sans +que +ces +relations +puissent +gêner +en +aucune +façon +les +relations +bilatérales +; +_ +de +contribuer +ensemble +à +la +détente +, +à +la +sécurité +collective +et +à +la +coexistence +pacifique +des +pays +d +' +Europe +de +systèmes +économiques +et +sociaux +différents +. +§ +il +s +' +agit +d +' +un +ensemble +de +revendications +urgentes +et +cohérentes +qui +peuvent +être +prises +en +compte +par +le +mouvement +syndical +au +niveau +de +la +CEE +et +qui +s +' +inscriventdans +le +développement +des +luttes +de +la +classe +ouvrière +en +Europe +occidentale +. +la +défense +de +ces +revendications +exige +une +coopération +accrue +et +l +' +action +unie +des +syndicats +de +l +' +ensemble +des +pays +de +la +* +communauté +. +< +S00 += +02 +> +< +S01 += +003 +> +< +S02 += +001 +> +< +S03 += +005 +> +< +Sda += +1975 +> +< +Sdm += +06 +> +< +Sat += +0 +> +< +S10 += +1 +> +la +CGT +poursuit +son +action +pour +une +démocratie +économique +et +politique +et +pour +le +socialisme +. +. +< +S10 += +0 +> +§ +accentuant +tous +ses +effets +nocifs +, +la +crise +qui +s +' +approfondit +rend +plus +que +jamais +nécessaire +de +promouvoir +un +type +de +développement +économique +et +social +reposant +sur +une +large +participation +des +travailleurs +et +des +masses +populaires +et +apportant +une +réponse +véritable +à +leurs +besoins +. +§ +pour +réaliser +des +changements +réellement +novateurs +dans +le +domaine +économique +, +politique +et +social +correspondant +à +l +' +intérêt +national +, +à +celui +des +travailleurs +et +des +grandes +masses +de +la +population +, +il +est +urgent +et +indispensable +d +' +imposer +des +solutions +d +' +un +contenu +fermement +dirigé +contre +la +domination +des +monopoles +. +§ +la +CGT +a +longuement +déployé +tous +ses +efforts +pour +que +se +réalise +l +' +alliance +des +forces +de +gauche +sur +une +telle +base +. +§ +elle +s +' +est +félicitée +de +la +conclusion +du +* +programme +commun +de +gouvernement +entre +le +PCF +, +le +PS +et +le +mouvement +des +* +radicaux +de +gauche +qui +a +ouvert +les +perspectives +d +' +une +démocratie +économique +et +politique +réellement +nouvelle +, +permettant +de +retirer +aux +monopoles +les +moyens +de +leur +puissance +, +de +maîtriser +des +leviers +de +commande +essentiels +de +l +' +économie +et +de +les +remettre +à +la +* +nation +et +d +' +assurer +ainsi +la +mise +en +oeuvre +des +mesures +sociales +hardies +répondant +aux +revendications +des +travailleurs +. +§ +la +CGT +a +apporté +et +elle +apporte +au +* +programme +commun +, +son +plein +soutien +. +par +ses +dispositions +fondamentales +, +il +correspond +, +en +effet +, +aux +objectifs +élaborés +par +les +instances +de +la +CGT +et +définis +à +partir +de +ses +propres +préoccupations +syndicales +. +§ +ces +dispositions +fondamentales +du +* +programme +commun +sont +rendues +encore +plus +urgentes +pour +apporter +une +issue +positive +à +la +crise +et +elles +constituent +la +base +indispensable +à +la +réalisation +d +' +un +changement +profond +et +durable +qui +soit +réellement +novateur +. +à +partir +de +ces +dispositions +fondamentales +, +il +est +possible +de +le +perfectionner +et +de +l +' +enrichir +encore +, +ainsi +que +d +' +actualiserses +dispositions +conjoncturelles +. +§ +assurer +la +satisfaction +des +revendications +populaires +, +fonder +le +développement +économique +sur +le +progrès +social +, +établir +un +cadre +institutionnel +démocratique +dans +lequel +les +masses +populaires +et +avant +tout +la +classe +ouvrière +pourront +exercer +leur +influence +, +c +' +est +l +' +objectif +de +la +démocratie +économique +et +politique +dont +le +contenu +et +les +moyens +ont +été +précisés +par +les +précédents +congrès +de +la +CGT +. +§ +le +39ème +* +congrès +confédéral +rappelle +les +mesures +essentielles +, +qui +sont +indispensables +pour +promouvoir +un +autre +type +de +développement +économique +et +social +et +qui +sont +maintenant +substantiellement +prises +en +compte +dans +le +* +programme +commun +. +< +S10 += +1 +> +démocratie +économique +. +. +< +S10 += +0 +> +§ +les +changements +à +promouvoir +visent +à +dégager +les +moyens +indispensables +pour +répondre +aux +revendications +des +travailleurs +et +à +faire +de +la +politique +sociale +un +facteur +de +plus +en +plus +essentiel +du +développement +économique +. +les +mesures +déterminantes +à +mettre +en +oeuvre +sont +: +< +S10 += +1 +> +la +nationalisation +démocratique +. +. +< +S10 += +0 +> +§ +la +maîtrise +des +instruments +décisifs +du +développement +économique +doit +être +donnée +à +la +* +nation +. +ce +qui +exige +que +les +grands +moyens +de +production +et +de +contrôle +du +crédit +soient +soustraits +à +l +' +emprise +des +féodalités +économiques +et +financières +. +§ +c +' +est +pourquoi +la +CGT +s +' +est +prononcée +pour +la +nationalisation +démocratique +des +secteurs +clés +du +crédit +, +des +banques +et +des +compagnies +d +' +assurances +, +de +la +sidérurgie +, +de +l +' +industrie +du +pétrole +et +de +l +' +énergie +atomique +, +dans +toutes +ses +composantes +des +groupes +dominants +de +l +' +électronique +, +de +la +grande +industrie +chimique +et +pharmaceutique +, +de +la +construction +des +grands +moyens +d +' +équipement +, +des +industries +aéronautiques +, +aérospatiales +, +d +' +armement +, +de +la +construction +automobile +et +de +la +marine +marchande +. +< +S10 += +1 +> +la +gestion +démocratique +. +. +< +S10 += +0 +> +§ +la +large +et +effective +participation +des +travailleurs +et +des +organisations +syndicales +à +la +gestion +des +entreprises +publiques +et +nationalisées +, +constitue +un +élément +décisif +pour +assurer +leur +pleine +efficacité +économique +et +pour +répondre +aux +besoins +des +travailleurs +et +des +masses +populaires +. +elle +répond +pleinement +aux +aspirations +légitimes +des +travailleurs +à +participer +à +l +' +orientation +, +à +la +gestion +et +au +contrôle +des +entreprises +nationalisées +. +§ +assurant +leur +intervention +active +dans +la +détermination +des +objectifs +économiques +de +la +politique +sociale +de +l +' +entreprisenationalisée +, +la +gestion +démocratique +est +une +condition +primordiale +de +la +démocratie +économique +. +§ +en +ce +domaine +, +le +37ème +* +congrès +de +la +CGT +et +ultérieurement +le +document +de +" +réflexions +et +de +propositions +de +la +CGT +sur +la +gestion +démocratique +dans +les +entreprises +" +, +ont +précisé +, +de +manière +détaillée +, +les +mesures +à +mettre +en +oeuvre +pour +assurer +et +garantir +le +caractère +pleinement +démocratique +de +la +gestion +des +entreprises +nationalisées +. +à +cet +effet +, +il +convient +essentiellement +de +promouvoir +$ +: +_ +de +larges +droits +pour +les +travailleurs +, +leurs +représentants +élus +et +les +organisations +syndicales +, +leur +donnant +les +moyens +d +' +exercer +un +contrôle +efficace +dans +l +' +orientation +, +la +conduite +et +le +contrôle +de +la +politique +générale +et +sociale +de +l +' +entreprise +. +ce +qui +requiert +des +prérogatives +étendues +comportant +le +droit +et +le +devoir +d +' +information +sur +la +politique +de +la +marche +de +l +' +entreprise +dans +tous +les +domaines +de +son +activité +; +ce +qui +nécessite +des +droits +suffisants +permettant +la +consultation +et +l +' +intervention +active +des +travailleurs +et +de +leurs +représentants +élus +et +la +création +des +instances +nécessaires +à +l +' +exercice +de +ces +droits +aux +divers +échelons +de +l +' +entreprise +. +un +statut +du +personnel +de +contenu +progressiste +, +élaboré +avec +les +organisations +syndicales +, +garantira +l +' +emploi +, +la +rémunération +, +les +droits +du +personnel +, +l +' +exercice +du +droit +syndical +et +des +droits +des +travailleurs +et +donnera +les +moyens +pour +qu +' +ils +participent +au +règlement +des +questions +relatives +aux +conditions +de +travail +sous +tous +leurs +aspects +; +_ +une +autonomie +effective +de +gestion +des +entreprises +nationalisées +dans +le +cadre +du +plan +et +leur +assurant +une +large +initiative +dans +les +divers +domaines +de +la +gestion +financière +, +technique +et +commerciale +et +de +la +politique +sociale +; +_ +une +pleine +et +entière +responsabilité +du +* +conseil +d +' +administrationqui +aura +notamment +dans +ses +attributions +la +nomination +du +personnel +de +direction +; +_ +une +composition +démocratique +de +ce +* +conseil +d +' +administrationcomprenant +des +représentants +du +pouvoir +central +, +des +représentants +syndicaux +élus +par +les +travailleurs +, +des +représentants +de +certaines +catégories +d +' +usagers +et +des +collectivités +locales +ou +territoriales +. +< +S10 += +1 +> +une +planification +démocratique +. +. +< +S10 += +0 +> +§ +la +nationalisation +des +secteurs +clés +, +la +maîtrise +des +moyens +d +' +action +économique +essentiels +de +l +' +* +état +par +un +pouvoir +démocratique +fondent +la +possibilité +de +promouvoir +une +planification +démocratique +. +cette +planification +est +indispensable +pour +permettre +un +développement +progressiste +d +' +ensemble +de +l +' +économie +pour +réaliser +sa +cohérence +, +pour +s +' +attaquer +aux +déséquilibres +engendrés +par +les +monopoles +et +pour +assurer +le +respect +des +objectifs +sociaux +et +pour +élever +d +' +une +manière +continuelle +le +niveau +et +les +conditions +de +vie +. +§ +en +matière +économique +, +la +planification +démocratique +est +le +complément +nécessaire +et +indispensable +de +la +nationalisation +démocratique +, +pour +réaliser +une +véritable +démocratie +économique +et +politique +à +l +' +échelle +de +la +* +nation +, +pour +assurer +la +cohérence +d +' +ensemble +du +développement +économique +, +pour +éliminer +les +disparités +et +distorsions +engendrées +par +les +monopoles +dans +le +domaine +économique +et +social +. +§ +la +participation +des +travailleurs +et +de +leurs +organisations +syndicales +à +l +' +élaboration +du +plan +, +au +contrôle +de +son +exécution +est +indispensable +et +constitue +une +condition +essentielle +de +son +contenu +réellement +démocratique +et +de +la +réalisation +des +objectifs +sociaux +qui +doivent +constituer +le +fondement +même +de +la +planification +démocratique +. +ce +qui +implique +à +tous +les +échelons +la +participation +des +organisations +syndicales +et +qu +' +elles +disposent +des +informations +les +plus +complètes +. +la +participation +démocratique +des +travailleurs +et +de +leurs +organisations +syndicales +s +' +exercera +à +l +' +échelon +national +dans +les +grandes +entreprises +nationalisées +, +mais +également +au +plan +régional +, +départemental +, +et +municipal +ainsi +que +dans +les +institutions +de +recherche +et +d +' +enseignement +. +les +attributions +des +diverses +instances +de +la +planification +devront +être +définies +démocratiquement +, +assurer +une +représentation +satisfaisante +des +travailleurs +et +prévoir +les +droits +et +moyens +leur +permettant +d +' +assumer +pleinement +leur +rôle +. +§ +l +' +élaboration +du +plan +, +son +adoption +et +le +contrôle +de +son +exécution +devront +constituer +une +attribution +essentielle +de +l +' +* +assemblée +nationale +. +§ +la +démocratisation +de +l +' +économie +est +inséparable +de +l +' +élargissement +des +droits +en +matière +économique +des +comités +d +' +entreprise +et +des +organismes +similaires +tant +dans +les +entreprises +nationalisées +, +les +administrations +que +dans +les +entreprises +privées +. +dans +ces +dernières +, +l +' +extension +des +attributions +des +comités +d +' +entreprise +devra +leur +permettre +de +contrôler +que +l +' +activité +de +l +' +entreprise +est +conforme +aux +options +du +plan +démocratique +et +respecte +la +politique +économique +assurant +sa +mise +en +oeuvre +, +notamment +dans +le +domaine +des +prix +, +du +crédit +et +de +la +fiscalité +. +< +S10 += +1 +> +démocratie +politique +. +. +< +S10 += +0 +> +§ +démocratie +économique +et +démocratie +politique +sont +étroitement +liées +et +complémentaires +. +s +' +attaquer +à +la +domination +des +monopoles +, +mettre +en +oeuvre +les +changements +structurels +indispensables +, +satisfaire +les +revendications +des +travailleurs +nécessitent +un +pouvoir +politique +d +' +origine +et +d +' +orientation +démocratique +et +des +changements +institutionnels +correspondants +. +§ +ceci +exige +conjointement +$ +: +_ +un +cadre +institutionnel +démocratique +, +ce +qui +suppose +l +' +abrogationde +toutes +les +dispositions +sur +lesquelles +se +fonde +le +pouvoir +personnel +; +_ +la +séparation +et +l +' +équilibre +des +pouvoirs +issus +du +suffrage +universel +; +_ +une +extension +des +libertés +fondamentales +et +leurs +garanties +tant +en +ce +qui +concerne +les +libertés +collectives +qu +' +individuelles +; +ce +qui +implique +$ +: +_ +la +garantie +du +droit +de +grève +, +de +manifestation +et +de +réunion +; +_ +la +garantie +du +droit +d +' +association +et +pour +les +partis +et +groupements +politiques +, +la +garantie +de +pouvoir +se +former +librement +et +de +déployer +leur +activité +dans +le +respect +de +la +légalité +; +_ +la +liberté +de +la +presse +et +un +droit +à +l +' +information +assurant +notamment +l +' +attribution +d +' +un +temps +d +' +antenne +régulier +aux +grandes +centrales +syndicales +; +_ +le +renforcement +de +la +protection +des +libertés +individuelles +et +des +droits +du +citoyen +. +< +S10 += +1 +> +rassemblement +populaire +pour +la +victoire +du +programme +commun +. +. +< +S10 += +0 +> +§ +la +CGT +a +engagé +toutes +ses +forces +dans +la +lutte +pour +la +démocratie +économique +et +politique +. +le +soutien +massif +que +le +peuple +de +France +a +apporté +au +* +programme +commun +lors +de +l +' +élection +présidentielle +, +le +grand +espoir +soulevé +par +la +possibilité +de +voir +accéder +la +gauche +au +pouvoir +pour +y +appliquer +son +programme +, +créant +une +situation +nouvelle +, +favorable +pour +gagner +des +millions +de +consciences +nouvelles +à +la +nécessité +du +changement +démocratique +. +§ +dans +ces +conditions +nouvelles +, +la +CGT +poursuivra +inlassablement +son +action +pour +une +démocratie +économique +et +politique +. +elle +déploiera +tous +ses +efforts +pour +développer +l +' +action +commune +sur +des +buts +concrets +et +promouvoir +le +grand +rassemblement +populaire +, +indispensable +à +la +victoire +du +* +programme +commun +. +§ +la +CGT +développera +son +activité +pour +s +' +opposer +à +toutes +les +tentatives +et +manoeuvres +que +développe +et +que +multipliera +la +bourgeoisie +pour +tenter +de +dissocierl +' +alliance +de +la +gauche +et +surtout +pour +s +' +efforcer +de +la +vider +de +son +contenu +antimonopoliste +. +< +S10 += +1 +> +les +perspectives +du +socialisme +pour +la +France +. +. +< +S10 += +0 +> +§ +le +régime +capitaliste +fait +apparaître +d +' +une +manière +aiguë +et +massive +, +ses +tares +et +ses +absurdités +, +son +incapacité +profonde +à +résoudre +les +problèmes +fondamentaux +de +notre +époque +. +§ +le +socialisme +représente +l +' +avenir +de +notre +société +. +son +idée +progresse +dans +les +consciences +et +prend +un +caractère +de +masse +. +§ +dès +sa +fondation +, +la +CGT +s +' +est +assignée +de +transformer +la +société +capitaliste +en +mettant +un +terme +à +l +' +exploitation +capitaliste +. +son +37ème +* +congrès +a +encore +précisé +ce +but +dans +les +statuts +. +le +socialisme +est +le +système +économique +et +social +où +l +' +exploitation +de +l +' +homme +par +l +' +homme +est +bannie +. +son +but +est +de +répondre +aux +besoins +matériels +et +intellectuels +grandissants +des +travailleurs +et +du +peuple +, +de +créer +les +conditions +susceptibles +de +libérer +l +' +homme +de +toutes +les +oppressions +économiques +, +sociales +et +culturelles +et +de +permettre +l +' +épanouissement +complet +de +ses +facultés +et +de +sa +personnalité +. +§ +la +CGT +estime +que +la +définition +des +voies +et +moyens +pour +parvenir +au +socialisme +en +France +, +ainsi +que +des +mécanismes +, +organes +, +institutions +et +modalités +de +la +gestion +et +de +la +vie +sociale +qui +sont +à +promouvoir +pour +son +édification +, +doivent +être +l +' +oeuvre +commune +des +formations +politiques +et +syndicats +intéressés +. +§ +pour +sa +part +, +elle +est +prête +, +en +tant +qu +' +organisation +de +classe +la +plus +intéressée +à +l +' +instauration +du +socialisme +, +à +y +contribuer +dans +le +respect +de +son +caractère +d +' +organisation +de +masse +et +avec +ses +vues +propres +résultant +de +sa +spécificité +d +' +organisation +syndicale +. +§ +le +document +" +thèmes +de +réflexion +sur +les +perspectives +du +socialisme +pour +la +France +et +le +rôle +des +syndicats +" +a +exposé +les +principales +idées +communes +aux +organisations +de +la +CGT +. +sa +discussion +a +conduit +à +une +large +approbation +de +son +contenu +par +les +organisations +de +la +CGT +et +par +les +travailleurs +. +il +conserve +pleinement +sa +valeur +. +§ +les +réflexions +exposées +dans +ce +document +constituent +la +base +commune +aux +organisations +de +la +CGT +pour +la +poursuite +de +la +réflexion +et +de +la +discussion +tant +avec +les +travailleurs +qu +' +avec +les +forces +intéressées +à +ce +but +et +pour +laquelle +la +CGT +demeure +disponible +. +§ +elles +constituent +la +base +de +sa +contribution +à +la +nécessaire +élaboration +de +positions +communes +rassemblant +les +forces +qui +luttent +pour +le +socialisme +. +§ +en +même +temps +qu +' +elle +engage +toutes +ses +forces +dans +la +lutte +pour +la +démocratie +économique +et +politique +afin +de +réaliser +les +changements +qu +' +il +est +urgent +d +' +apporter +à +la +société +, +la +CGT +agit +pour +gagner +toujours +plus +de +travailleurs +à +l +' +objectif +du +socialisme +et +pour +que +mûrissent +les +conditions +susceptibles +d +' +en +rapprocher +le +terme +pour +notre +pays +. diff --git a/autres/Rlib/textometrieR/cgt75.txt b/autres/Rlib/textometrieR/cgt75.txt new file mode 100644 index 0000000..10e591b --- /dev/null +++ b/autres/Rlib/textometrieR/cgt75.txt @@ -0,0 +1,4412 @@ + + + + + + + + + document d'orientation de la CGT .. + + § deux données essentielles caractérisent la situation, + déterminent le comportement des diverses forces sociales + et politiques et situent par conséquent les conditions + de l'action syndicale $: + _l'aggravation de la crise qui affecte l'économie et la vie + du pays; + _la montée de la volonté de changement et les + perspectives qu'offre l'union de la gauche sur la base + de son *programme commun de gouvernement . + § dans sa manifestation la plus immédiate et la plus + sensible aux travailleurs la crise se traduit par de + sérieuses atteintes au pouvoir d'achat de leurs salaires, + retraites et prestations sociales,par la montée du chômage, + l'aggravation de leurs conditions de travail et d'existence. + § mais la dimension de cette crise est plus vaste.elle + affecte _ les précédents *congrès de la CGT l'ont déjà + souligné _ l'ensemble de la vie du pays,sous tous ses + aspects essentiels $: économique,social,politique,culturel, + moral. + § elle met en cause les fondements de la société capitaliste + et pose la nécessité de transformations profondes touchant + aux structures économiques et sociales de la société. + § c'est dans ce contexte de crise profonde et durable de + l'ensemble des grands pays capitalistes que se situe + l'aggravation de la situation économique.elle se manifeste + par une poussée beaucoup plus forte d'une inflation depuis + longtemps permanente. cette inflation se combine avec une + montée considérable du chômage et un déclin du + développement économique.il est faux d'attribuer cette + situation au prix du pétrole et des matières premières. + § la récession de 1974-1975 est la plus forte que les + économies capitalistes aient connu depuis la deuxième + guerre mondiale. + § il ne s'agit pas seulement d'une période défavorable + accentuée,mais d'un dérèglement durable en profondeur de + l'économie capitaliste qui est le fond de la crise. + § le dérèglement en profondeur de l'économie capitaliste + mondiale est à la base de la crise.il résulte de l'exploitation +et de la course au profit poussées jusqu'à + leurs limites dans tous les pays où l'*état est + l'instrument des grandes sociétés capitalistes.parmi + ces pays,les Etats-Unis occupent une position dominante, + et l'économie américaine pèse d'un poids déterminant. + § l'accumulation des profits extraordinaires réalisés + par les grandes sociétés,les moyens employés pour + maintenir ces profits et les accroître,même au prix + d'énormes gaspillages,la militarisation de l'économie, + en particulier aux USA,sont à l'origine de l'inflation, + de la crise du système monétaire et des relations + économiques des pays capitalistes ainsi que de tous les + désordres économiques qui les accompagnent. + § la place prépondérante des sociétés multinationales + dans l'ensemble du monde capitaliste et dans les pays + en voie de développement,leurs dimensions,la nature + de leurs activités en font l'un des principaux facteurs + des perturbations économiques,un danger pour les travailleurs, + pour l'indépendance des peuples et les droits des *états . + § cette malfaisance s'exerce également en Europe + occidentale et particulièrement au sein du marché commun. + l'ensemble des phénomènes de crise s'y manifestent. + les sociétés multinationales y sont pour les deux tiers sous + la domination des groupes financiers et industriels + américains,en particulier dans les secteurs de pointe. + § elles assoient leur emprise avec l'appui des gouvernements + qui facilitent l'interpénétration des capitaux publics + et privés au profit de ces derniers. + § les contradictions s'aiguisent au sein du *marché commun + alors que le capital ouest-allemand y joue le rôle principal + et que se renforce la dépendance à l'égard des USA. + § les abandons de souveraineté opérés par le *pouvoir + portent gravement préjudice à l'indépendance nationale + de la France menacée par les projets de supranationalité + et replacée pratiquement dans le giron atlantique. + la volonté d'unification des politiques économiques et + sociales vise à renforcer le front des patrons et des + gouvernements contre les travailleurs de ces pays. + § en France ,la crise a les mêmes causes profondes que + dans les autres pays capitalistes.l'économie est dominée + par un petit nombre de groupes financiers géants qui + augmentent leurs richesses et leur puissance au détriment + des travailleurs et du pays.la politique menée depuis des + années,avec pour but essentiel leurs profits et le + renforcement de leurs positions à l'échelle nationale + et internationale,a plongé le pays dans la crise. + § la politique d'austérité imposée par le gouvernement + sous prétexte d'endiguer la crise ne s'attaque pas à + l'inflation qui est source de profits accrus.elle l'entretient +et augmente le chômage. + § les promesses gouvernementales d'amélioration de la + situation économique sont contredites par la réalité. + § les milliards distribués sous prétexte de relance gonflent + les profits et alimentent l'inflation. + § l'orientation prévue pour le *7ème plan est une + prolongation de la politique d'austérité.elle ne peut assurer + le taux de croissance mensongèrement affiché.elle vise à + diminuer brutalement le pouvoir d'achat par une politique + des revenus.le nombre de chômeurs,déjà égal à 1200000 au + début de 1975,risque sérieusement d'augmenter encore dans + une forte proportion. + § le *pouvoir des féodalités capitalistes ne peut combattre + efficacement ni l'inflation,ni le chômage.loin de s'attaquer +à leurs causes réelles,il veut faire supporter + les frais de la crise aux travailleurs et saisir cette + occasion pour accélérer la concentration capitaliste, + l'élimination d'entreprises petites,moyennes et parfois + grandes.le "redéploiement de l'industrie" consiste + principalement à mettre les ressources du pays et les + moyens de financement et d'action économiques de l'*état + à la disposition des groupes industriels et financiers + susceptibles d'atteindre la dimension multinationale. + § le budget,la fiscalité,la politique du crédit,la politique + des prix,la politique de tarifs et de transferts d'activités + bénéficiaires des services publics et des entreprises + nationalisées vers le secteur privé,tous les moyens sont + mis en oeuvre par le *pouvoir pour répondre aux + exigences des principaux groupes capitalistes. + § le *pouvoir giscardien pousse plus avant l'interpénétration + et la conjonction des moyens de l'*état et des monopoles, + au service de ces derniers,c'est-à-dire le capitalisme + monopoliste d'*état . + § pour cette raison il ne peut qu'aggraver la crise qui mine + la société française. + § la confiscation,par une minorité toujours plus restreinte + et plus puissante des richesses du travail du plus grand + nombre et des moyens de la direction de l'économie conduit + aux aberrations les plus choquantes $: la baisse du niveau + de vie des travailleurs et le chômage,l'énormité des + gaspillages des forces humaines et matérielles,le + sacrifice des équipements collectifs,les injustices de + toutes sortes. + § face au bilan désastreux d'un système condamné,une + puissante force de transformation a grandi et s'est mise + en mouvement.la résistance des travailleurs s'est renforcée, + leur pression revendicative s'est exprimée par la montée + des luttes sociales.la signature du *programme commun de + gouvernement entre le *parti communiste ,le *parti + socialiste et le *mouvement des radicaux de gauche , + avec le soutien de la CGT a constitué un tournant. + § en se prononçant pour la réalisation de ce programme, + lors de l'élection présidentielle de mai 1974,plus de + 49% des électeurs ont démontré que le changement véritable, + fondé sur des réformes profondes est possible,qu'il peut + devenir la volonté majoritaire du peuple. + § cette situation crée un nouveau rapport de force dans + le pays. + § les travailleurs y puisent un grand espoir,une plus + grande confiance en leurs forces. + § ils y trouvent des conditions plus favorables pour leurs + luttes revendicatives,pour défendre avec succès leurs + intérêts les plus urgents,obtenir certains résultats, + mettre en échec certaines mesures antisociales.le *pouvoir + et le *patronat doivent en tenir compte. + § dans cette situation des possibilités nouvelles existent + pour gagner de nouvelles forces,de nouvelles couches + aux luttes immédiates et à l'idée des changements qui + seuls sont de nature à permettre la solution effective + et durable des grands problèmes posés à la société. + § mais leur attitude est également dictée par l'étroitesse + de la marge d'action dont ils disposent. + § d'une part,le maintien et l'accroissement des profits + des grandes sociétés dans le contexte de la crise économique + exigent une politique aux conséquences sociales aggravées.d'autre +part,toute concession aux revendications démontre + qu'il est possible de les satisfaire et qu'une autre + politique peut être mise en oeuvre. + § *pouvoir et *patronat s'efforcent donc,dans ces + nouvelles conditions,de s'adapter pour maintenir une + résistance acharnée aux revendications,poursuivre et + aggraver leur politique.ils s'efforcent également de + contrarier par tous les moyens l'évolution des masses + populaires vers l'idée du changement. + § c'est dans cet ensemble de circonstances qu'il convient + de définir les positions,les tâches et l'action de la CGT. + + l'action revendicative et l'unité d'action syndicale .. + + § le *patronat et le *gouvernement giscardien s'efforcent + de mettre à profit la situation économique dont ils sont + responsables pour comprimer le pouvoir d'achat des salaires, + faire admettre le chômage,les fermetures d'entreprises, + les licenciements,pour aggraver les conditions de travail, + alourdir les impôts payés par les salariés,déprécier + les prestations sociales et familiales,renforcer l'exploitation +des travailleurs français et immigrés. + § pour y parvenir ils usent de tous les moyens dont ils + peuvent disposer $: + _l'intransigeance globale dans toutes les négociations + et le détournement d'une véritable politique contractuelle + par la conclusion avec des organisations minoritaires, + d'accords de collaboration à la politique d'austérité; + _la démagogie sous ses diverses variantes,plus ou moins + renouvelées en dernier lieu le thème de la "réforme + de l'entreprise",pour tenter inlassablement de détourner + les travailleurs des réalités sociales et de la défense + de leurs intérêts de classe ; + _la tentative de domestiquer toute l'information et la + mise en oeuvre des moyens énormes de pression idéologique + pour faire admettre l'inéluctabilité de la crise et de + l'austérité,jouer de l'inquiétude pour l'emploi,et + dénaturer la lutte de la CGT et de toutes les forces + démocratiques; + _l'extension des méthodes plus perfectionnées d'exploitation + sous couvert d'une prétendue participation ou d'une + organisation différente du travail; + _la division entre travailleurs de diverses catégories; + _la tentative de mettre en selle la collaboration de classe + comme une institution permanente (accords séparés, + collusion dans les organismes paritaires,concertation + avec le gouvernement,utilisation abusive de l'information + officielle et de la formation professionnelle); + _l'attaque généralisée contre les libertés syndicales et le + droit de grève,les mesures de répression arbitraires et + illégales,l'emploi de la force policière,des milices privées + armées,contre les grévistes dans les entreprises. + § c'est aussi dans ce cadre qu'il faut placer le recours + par certains patrons,avec la complicité et le soutien + direct du pouvoir,à des syndicats maison,des officines + patronales comme la CFT,des entreprises de louage + d'hommes de main employant des méthodes fascistes. + § loin d'être un signe de force,ces pratiques sont un signe + des difficultés de la bourgeoisie. + § elles constituent néanmoins un grave danger pour les + libertés.elles s'inscrivent dans un processus de renforcement + du système autoritaire .c'est pourquoi elles doivent + recevoir les ripostes immédiates et énergiques qui + s'imposent,et susciter un grand mouvement de lutte pour + la démocratie. + § c'est dans ce cadre qu'il faut placer le recours,pour + une partie du patronat avec la complicité et parfois le + soutien direct des milieux du *pouvoir ,aux syndicats + maison CFT dont le caractère d'officine patronale et + les méthodes ont été dévoilés par la CGT. + § mais ils font un mauvais calcul en misant sur une + quelconque résignation des travailleurs.ils ne tiennent + pas compte du mécontentement accumulé ni de l'état d'esprit + né du progrès des forces de gauche,ni des conséquences + que tirent les travailleurs de toutes les injustices, + de tout ce qui témoigne de l'incapacité du système à + résoudre les problèmes sociaux les plus élémentaires. + § les luttes syndicales ont connu,en plusieurs occasions,des + périodes particulièrement intenses.elles ont mis en avant + des revendications d'une ampleur et d'une portée + nouvelles. + § depuis l'aggravation de la crise,bien des actions et + des grèves d'envergure ont témoigné,d'une combativité + parmi l'ensemble des travailleurs et particulièrement + dans la jeunesse,qu'il faut considérer comme l'indice + d'un état d'esprit significatif du monde du travail. + § toutes les manoeuvres,tous les procédés employés pour + détourner les salariés de la lutte sont voués à l'échec, + inadaptés aux conditions nouvelles,à condition de recevoir + la riposte appropriée. + § car il n'est pas vrai que la crise,le chômage,l'inflation + soient une fatalité $: ils sont un produit du système + capitaliste et de la domination des monopoles. + § il n'est pas vrai ,que l'austérité pour les travailleurs + soit inévitable. + § il n'est pas vrai,que le gouvernement s'attaque aux + inégalités sociales. + § il n'est pas vrai,que les mesures patronales et + giscardiennes soient les seules possibles. + § au contraire,même dans les conditions actuelles,il est + possible d'imposer d'autres mesures pour combattre + l'inflation et le chômage et d'engager l'action avec + l'immense majorité des travailleurs. + § c'est parce qu'ils le ressentent que les travailleurs + n'ont cessé de mener des luttes importantes.mieux ils en + auront conscience et plus énergiquement encore ils + défendront leurs intérêts,avec succès. + § le programme d'action soumis au 39ème *congrès précise + l'ensemble des objectifs revendicatifs essentiels de + la CGT pour la période à venir. + § parmi ces objectifs,il en est un certain nombre qui ont + un caractère d'urgence et une portée générale qui sont + à la base des luttes actuelles. + § dans le contexte de la crise économique,la défense + des conditions de vie et de travail par les revendications + syndicales est étroitement liée à l'action pour des mesures + économiques capables de combattre la crise et de + s'attaquer à ses causes afin d'assainir l'économie et + d'assurer son développement. + § les revendications concernent en particulier : + + les salaires .. + + _garantie du pouvoir d'achat pour tous par l'échelle + mobile et progression avec des différenciations allant + dans le sens d'une remise en ordre des systèmes de + rémunération; + _SMIC à 1700F par mois pour 40 heures hebdomadaires; + _relèvement des prestations sociales et familiales, + des pensions et retraites et allocations de chômage total + ou partiel. + + l'emploi .. + + _une politique de développement économique créatrice + d'emplois; + _le droit et les moyens de discuter du bien fondé des + décisions de licenciements et de fermetures d'entreprises + avec la possibilité d'instances de recours avec effet + suspensif; + _l'interdiction de tout licenciement sans reclassement + préalable équivalent. + § dans les conditions présentes,deux mesures longtemps + refusées prennent une importance et une urgence + particulières $: + _le droit à une retraite pleine à 60 ans pour les hommes + et à 55 ans pour les femmes,avec 75% des éléments du + salaire; + _la semaine de 40 heures en 5 jours partout,sans réduction + de salaire et dans les plus brefs délais. + + les conditions de travail + + exigent un ensemble de mesures pour $: + _limiter les cadences,embaucher en nombre suffisant, + _protéger la santé et la vie des travailleurs, + _élever l'intérêt,la responsabilité,la qualification + du travail avec des classifications et des salaires + correspondants, + _assurer des garanties d'accès à la formation et à la + promotion professionnelles. + + les libertés syndicales.. + + cessation immédiate des atteintes aux libertés + syndicales et au droit de grève et garanties légales + contre ces pratiques; + _sanctions judiciaires contre toutes les violations + de ces libertés et contre l'emploi de la force contre + les travailleurs; + _extension des libertés syndicales,des droits démocratiques + des travailleurs et des moyens attribués pour leur exercice + dans les entreprises et dans la vie publique. + + les discriminations de toutes sortes + + doivent être supprimées et toutes tentatives de les + maintenir sanctionnées. + + une véritable réforme de la fiscalité + + allégeant la charge des salariés et frappant le *capital . + + la sécurité sociale + + doit être rendue aux travailleurs et les mesures + consécutives à la politique de démantèlement poursuivie + par le *pouvoir et le *patronat doivent être abrogées. + § l'indexation des allocations ,rentes et pensions sur + la base d'un indice de prix négocié par les organisations + syndicales. + § les mesures économiques immédiatement nécessaires + visent principalement à assurer un développement + suffisant et équilibré de la production,combattre + l'inflation et la vie chère,sauvegarder l'emploi et + rééquilibrer les échanges.c'est pour atteindre ces buts + qu'elles doivent s'attaquer aux privilèges ,aux profits + et aux moyens de domination des grandes sociétés capitalistes. + § énoncées précisément dans le programme d'action du + 39ème *congrès ,elles comportent : + § contre l'inflation et la vie chère $: + _des réductions de TVA,le blocage temporaire de certains + prix et tarifs publics,la réduction et le contrôle des + bénéfices ainsi que la limitation du crédit pour les + grandes sociétés,la défense de l'épargne populaire. + § pour l'emploi $: + _une politique de développement créatrice d'emplois + fondée sur un solide marché intérieur développé, + notamment par l'amélioration du pouvoir d'achat,une + politique industrielle s'appuyant sur le secteur public, + un développement des équipements collectifs améliorant les + conditions d'existence,un développement régional réel. + § pour l'équilibre des échanges extérieurs $: + _un développement diversifié,vers tous les pays et + notamment les pays socialistes et du Tiers-Monde , + des échanges commerciaux et de la coopération technique + et scientifique en les fondant sur l'intérêt mutuel, + le contrôle des mouvements de capitaux et des investissements + étrangers en France . + § pour assurer les besoins en énergie $: + _des contrats de type nouveau avec les pays producteurs + de pétrole,l'arrêt immédiat des fermetures de puits de mine + et un plan d'augmentation de la production charbonnière, + l'utilisation de l'énergie hydraulique,marémotrice, + géothermique,la maîtrise technologique,la protection de + l'environnement et la garantie de l'approvisionnement + en combustible pour les centrales nucléaires,la + suppression des privilèges des sociétés pétrolières + et la nationalisation immédiate des groupes pétroliers + français,le développement de la recherche sur les + sources de l'avenir. + § ces revendications correspondent à des besoins impérieux + et justifiés.elles constituent des éléments importants + de réponse aux problèmes économiques et sociaux actuels + en favorisant l'emploi et la lutte contre l'inflation.elles + répondent à l'intérêt national. + § si le *pouvoir et le *patronat en tenaient compte, + des difficultés pourraient être atténuées. + § mais il faut s'attendre pour l'essentiel à une résistance + acharnée de leur part,car telle est leur nature de classe + et telles sont les exigences des intérêts du grand capital + monopoliste. + § l'action revendicative de masse est et sera nécessaire + pour obtenir chaque amélioration. + § la réduction du pouvoir d'achat des salaires,les pertes + dues à la réduction d'activité,le chômage total et partiel, + la misère qui gagne un grand nombre de foyers de + travailleurs,loin d'engendrer la résignation,se traduisent + par le mécontentement et la colère,et une conscience plus + élevée de la responsabilité de la politique du pouvoir. + § le patronat et le gouvernement poussent chaque conflit + à l'extrême tension. + § mais la tendance principale est constituée par la + combativité,l'endurance exceptionnelle des travailleurs, + le nombre et la durée des grèves en même temps que par la + recherche des méthodes d'action les plus efficaces,les + mieux adaptées. + § il est possible,par l'action,d'imposer des succès marquants + comme maints exemples l'ont déjà démontré. + § l'intransigeance gouvernementale et patronale conduit + à une montée des luttes sociales,susceptibles d'atteindre + une grande envergure. + § faire échec à la politique d'austérité pour les travailleurs, + de privations pour beaucoup,implique une grande ténacité + dans la lutte. + § il s'agit d'une bataille de longue haleine et + d'envergure dans laquelle s'allient les actions + multiformes et incessantes dans les entreprises + et des mouvements coordonnés de divers types $: au plan + professionnel ou au plan interprofessionnel selon + la nature des revendications essentielles;parfois au + niveau local ou départemental,parfois par de grandes + initiatives d'ampleur nationale. + § dans tous les cas,parmi les conditions nécessaires + à la conduite des luttes,l'information de l'opinion + publique et la recherche de son soutien sont indispensables. + § ce sont les circonstances,les situations concrètes qui + conduisent à adopter les initiatives qui conviennent + le mieux dans chaque cas. + § et c'est l'ensemble de ces luttes aux aspects diversifiés, + souvent très décentralisées et parfois puissamment + regroupées qui constitue un mouvement revendicatif + rassemblant,sur toute une période,des forces de plus en + plus grandes capables d'imposer non seulement des reculs + dans telle ou telle entreprise ou branche mais au + patronat et au gouvernement pour les objectifs communs + à l'ensemble des travailleurs. + § les orientations du 38ème *congrès confédéral définissant + les principes d'une action efficace et responsable se sont + pleinement vérifiées. + § l'essentiel dans la conduite de la bataille présente est, + avec la persévérance,le souci plus indispensable que + jamais de la plus large démocratie $: démocratie avec les + syndiqués qui doivent jouer leur rôle,démocratie avec + l'ensemble des travailleurs,pour tenir le plus grand + compte de leurs besoins,de leur état d'esprit,définir avec + eux à toutes les étapes de la lutte et rechercher la + convergence dans les objectifs et les méthodes d'action. + § les militants et les organisations de la CGT ont à faire + preuve d'audace pour se placer,de la sorte,résolument + à la tête des luttes avec esprit d'initiative,de + décision et d'unité. + § c'est dans cet esprit que la CGT et la CFDT ont pris, + dans toute la dernière période des initiatives d'action + et animé le développement des luttes. + § l'accord conclu le 26 juin 1974 entre les deux centrales + sur les objectifs communs,les méthodes de l'action et le + renforcement de l'unité d'action a représenté un progrès + considérable dans les relations confédérales.il a permis + d'éliminer un grand nombre d'obstacles et a favorisé une + amélioration à différents niveaux quoique subsistent + bien des inégalités de situations. + § la pratique a prouvé $: + _que les divergences existant sur les questions + fondamentales de l'avenir de la société ne sont pas + un obstacle insurmontable à l'unité d'action pour les + revendications communes et urgentes pour les travailleurs; + _que les divergences sur les revendications et les + méthodes de l'action,lorsqu'elles existent,sont plus + facilement surmontées lorsqu'elles sont discutées + clairement et franchement avec les travailleurs dont + l'appui est décisif; + _que la pratique de l'unité d'action sur des bases claires + favorise l'établissement de rapports fraternels et + loyaux,qu'elle contribue à aborder dans de meilleures + conditions la discussion des divergences plus fondamentales + pour tenter de les réduire.tout progrès dans ce sens + facilite réciproquement l'unité d'action; + _qu'une bonne et saine unité suppose la vitalité,l'activité + et l'esprit d'initiative des organisations de la CGT en + tant que telles. + § la CGT persiste à souhaiter que l'unité d'action qui + se développe avec la CFDT s'étende à la FEN et à + Force Ouvrière . + § mais la direction de la FEN en dépit des intentions + qu'elle affirme est délibérément retournée à la + collaboration avec le gouvernement en signant un nouvel + accord salarial qui s'inscrit dans la politique + d'austérité.la pratique de l'unité d'action avec de nombreuses + organisations de la FEN est fondée sur la défense + des intérêts de classe des travailleurs,la lutte contre + la crise et ses conséquences,pour faire reculer le + pouvoir et le patronat. + § la CGT lutte pour l'unité avec la FEN en combattant + les positions de collaboration de classe dans la fonction + publique. + § la direction confédérale de FO est devenue l'agent + officiel et le symbole de la collaboration de classe. + elle s'attaque directement aux travailleurs en grève + et apporte systématiquement la caution de son + organisation au patronat et au gouvernement. + § la CGT ne peut qu'espérer un sursaut contre cette + dégradation parmi les militants et les organisations + de Force Ouvrière et la réalisation de l'unité d'action + sur des bases de classe avec les organisations FO + qui y sont prêtes. + § le *congrès souligne que cela ne peut être possible + que si cette organisation adopte enfin une attitude + combative de défense des intérêts des travailleurs. + § le renforcement et l'élargissement de l'unité d'action + pour les revendications communes est toujours la question + actuelle,la tâche urgente en matière d'unité.la CGT + s'y emploie sans relâche.simultanément,elle ne s'est jamais + résignée à la division syndicale et maintient plus que + jamais son objectif de réunification syndicale.elle + entend travailler à en créer les conditions. + § dans cette perspective,elle a défini ses propres conceptions + fondées sur le contenu de classe de son action, + le caractère de masse de ses activités et la démocratie + syndicale assurant la véritable indépendance d'une + organisation groupant l'ensemble des salariés dans + la diversité des opinions. + § elle est prête à en discuter,certaine d'aller au devant + du désir de la masse des travailleurs et particulièrement + des jeunes. + + rassemblement des forces populaires pour la victoire + du programme commun .. + + § des millions de travailleurs se persuadent,à l'expérience et + par l'effort de conviction de la CGT,que si + l'indispensable action revendicative permet de résister + à l'agression permanente contre le niveau de vie,rien + d'essentiel ni de durable ne pourra être fait sans des + changements profonds dans la société. + § la crise étale toute la malfaisance,les tares et les + absurdités d'un système qui ne répond pas aux besoins + du développement de l'humanité et qui s'avère incapable + de résoudre aucun des problèmes posés par notre époque. + § c'est le socialisme qui représente l'avenir de la + société.cette idée continue à progresser dans l'esprit + des travailleurs.la CGT qui s'est fixée pour but cette + transformation décisive conduisant à l'émancipation + des travailleurs,a clairement exposé ses conceptions + à cet égard.son 38ème *congrès les a confirmées. + elle est disponible pour la poursuite de la réflexion + et de la discussion avec les travailleurs et toutes les + forces intéressées à ce but. + § c'est en poursuivant cet objectif et en militant pour + y gagner toujours plus de travailleurs que la CGT + a engagé toutes ses forces dans la lutte pour la + démocratie économique et politique,pour les changements + profonds qu'il faut d'urgence apporter à la société. + § la conclusion du *programme commun de gouvernement + entre le *parti communiste ,le *parti socialiste et + le *mouvement des radicaux de gauche en a ouvert la + perspective. + § le soutien massif à cette alliance et à ce programme + lors de l'élection présidentielle a créé une situation + nouvelle. + § la possibilité de faire parvenir la *gauche au pouvoir + pour appliquer son programme soulève un grand espoir + parmi les travailleurs. + § cet espoir,pour être pleinement justifié,doit + s'accompagner d'une vue lucide des conditions de la + lutte pour y parvenir. + § car cette même perspective provoque la profonde + inquiétude des milieux dirigeants de la haute bourgeoisie + et de toutes les forces de réaction qui ne restent pas + passifs. + § le *pouvoir regroupe toutes les forces de conservation + sociale quelle que soit leur étiquette.il précipite + son alignement atlantique.il renforce le caractère + personnel,autoritaire du système et en particulier + sa mainmise sur les principaux moyens d'information. + § tout en s'efforçant de maintenir ainsi le pouvoir qui + lui convient le mieux,la bourgeoisie multiplie et + multipliera constamment les manoeuvres pour s'efforcer + de dissocier l'alliance de la *gauche et surtout + pour tenter de la vider de son contenu. + § à cet effet,le pouvoir tente d'entraîner des forces de + la gauche à un comportement de collaboration de classe. + les campagnes anticommunistes sont destinées à diviser et à + affaiblir la gauche.c'est pourquoi il est du devoir de l'ensemble +des forces de gauche,syndicales et politiques, + de les combattre. + § car ce qui inquiète le plus le grand patronat dans + l'union de la *gauche ,ce sont ses objectifs et le + contenu social et économique avancé de son programme. + § c'est aussi ce qui importe le plus aux travailleurs et + à la CGT. + § la CGT a constamment défini,dans ses *congrès et + instances responsables,à partir de ses préoccupations + syndicales,ses positions indépendantes quant aux + perspectives de transformation de la société. + § cette indépendance,conforme aux intérêts des travailleurs,ne + peut pas se détacher des principes de classe et,par + conséquent,ne saurait être confondue avec une quelconque + neutralité. + § pendant de longues années la CGT a lutté pour que + se réalise l'alliance des forces de gauche sur la base + d'un *programme commun au contenu fermement dirigé + contre la domination des monopoles. + § elle a défini,pour sa part,les objectifs qu'elle jugeait + essentiels dans ce but.ces objectifs figurent toujours + dans son programme confédéral. + § lorsque fut conclu le *programme commun de la gauche , + la CGT a fondé son soutien sans défaillance sur le + fait qu'elle y retrouvait l'essentiel de ses propres + objectifs. + § c'est avec ces mêmes préoccupations que la CGT + poursuit son action. + § l'essentiel,du point de vue des intérêts de classe + des travailleurs _ et par conséquent du point de vue + de la CGT _ est dans l'application des mesures prévues + par le *programme commun $: + _pour retirer aux monopoles les moyens de leur + puissance et remettre à la *nation les leviers de + commande essentiels de l'économie,c'est-à-dire la + nationalisation des secteurs clés et leur gestion + démocratique dans le cadre d'une planification également + démocratique; + _pour mettre en oeuvre des mesures sociales hardies + répondant aux revendications des travailleurs; + _pour développer,en démocratisant l'économie,l'intervention + active et la participation de la masse des travailleurs + à la gestion et à la planification. + § les mises au point et ajustements nécessaires du + programme,qui doivent intervenir en temps opportun + pour tenir compte de la conjoncture et des conditions + concrètes devant lesquelles sera placée la *gauche ,ne + sauraient en affecter les dispositions fondamentales, + celles qui sont destinées à donner les moyens du + changement réel. + § loin d'être dépassé,comme le prétendent ses détracteurs, + le *programme commun est plus actuel et urgent que + jamais,dans son fond. + § non,la crise n'est pas fatale,l'austérité pour les + travailleurs n'est pas inévitable et ne constitue pas + une solution. + § contre le pouvoir actuel et les féodalités capitalistes + qu'il s'agit d'éliminer,seules les réformes profondes + contenues dans le *programme commun permettront de + sortir le pays de la crise,d'assurer son développement + et de résoudre d'une manière neuve et efficace les + problèmes essentiels posés à la société moderne et + d'abord ceux qui importent le plus aux travailleurs + pour améliorer leur situation,leurs conditions de vie + et de travail. + § pour qu'elle devienne majoritaire,l'union de la gauche + implique $: + _l'action concrète contre le pouvoir pour assurer + la défense des intérêts des travailleurs et la défense + des libertés; + _le rassemblement et l'union de tous pour la mise en + échec de toutes les tentatives de collaboration de + classe; + _des initiatives multiples afin de gagner aux idées + décisives du *programme commun des millions de consciences + nouvelles et notamment parmi les salariés et de contribuer + au renforcement de leur détermination pour de véritables + changements. + § c'est dans cet esprit et pour ces objectifs communs + que la CGT souhaite voir se renforcer l'*union de + la gauche . + § elle travaillera pour sa part,sur la base de ses + positions de classe,à gagner à ces conceptions et aux + solutions fondamentales du *programme commun ,la masse + des travailleurs.elle impulsera l'action commune pour + des buts concrets.elle contribuera ainsi au renforcement + de l'*union de la gauche et à la réalisation du + rassemblement majoritaire qui assurera sa victoire + et l'application de son programme. + + dans l'intérêt des travailleurs $: puissance,capacité + d'organisation,d'initiative et d'influence de la CGT .. + + § défendre les intérêts des travailleurs dans une situation + aussi complexe,quand la lutte de classe atteint un tel + degré;les aider à s'orienter,à s'organiser pour + intervenir eux-mêmes efficacement;les rassembler par millions + dans la lutte pour les transformations sociales + indispensables $: il est impossible d'accomplir ces tâches + sans un renforcement considérable de la CGT,en + quantité comme en qualité. + § les travailleurs de toutes catégories et de toutes + professions ne peuvent se passer d'une CGT active, + vivante,présente partout,capable de faire face à ses + responsabilités en toutes circonstances,ce qui suppose + à la fois le recrutement systématique de nouveaux + adhérents,l'exercice d'une large démocratie syndicale + et la diffusion des idées de la CGT $: trois conditions + indispensables au syndicalisme de masse et donc à l'efficacité + de l'action syndicale. + + syndiquer massivement les travailleurs .. + + § c'est à partir de ces préoccupations que l'année 1974 + a marqué une ouverture dans la voie d'un recrutement + important et permanent et de la création d'un grand + nombre d'organisations là où elles n'existaient pas. + § les résultats obtenus en 1974,avec 308000 adhésions + et 3400 bases nouvelles,sont encourageants mais ils ne + représentent que le début d'une attitude nouvelle pour + placer les forces organisées de la CGT en concordance + avec son influence et ses responsabilités. + § il s'agit,chaque année,de progresser au rythme + de nombreuses centaines de milliers d'adhérents et de + milliers d'organisations nouvelles. + § ce résultat ne peut être atteint que par une activité +de masse s'appuyant sur une prise de conscience générale + de tous les militants,de tous les syndiqués et un + travail systématique,organisé,dirigé par les directions + syndicales aux différents niveaux. + § le renforcement numérique doit s'accompagner d'un + perfectionnement général du travail des organisations + de la CGT $: direction collective pour assurer + entièrement nos responsabilités dans tous les domaines. + promotion de forces militantes nouvelles représentatives + de la diversité de la CGT aux responsabilités et + tout particulièrement les femmes qui prennent une place + de plus en plus grande dans l'action et la vie syndicale + et des jeunes gens et jeunes filles;formation de centaines + de milliers de militants de toutes responsabilités. + § donner à la CGT un caractère de masse dans toute sa vie + et son action exige également de veiller aux intérêts + de chaque catégorie de travailleurs,de comprendre leurs + besoins,leurs préoccupations.cela exige de déployer + un travail d'organisation et une activité spécifique + qui tiennent compte de leurs revendications particulières, + de leur sensibilité propre à l'égard des revendications + générales et des problèmes d'ensemble de tous les + travailleurs. + § ce travail spécifique,pour être efficace,doit s'appuyer + sur l'activité de l'ensemble des organisations de la + CGT. + § cet ensemble de préoccupations qui concernent toutes + les organisations de la CGT à tous les échelons + s'impose particulièrement dans les grandes entreprises + en raison de leur place dans la vie économique et + sociale,dans les luttes. + + développer et perfectionner la démocratie syndicale .. + + § c'est pour des raisons importantes que la CGT + poursuit avec insistance une campagne intérieure + pour le développement de la démocratie syndicale $: c'est la clé + du perfectionnement des organisations de la CGT ainsi + que la solution de nombreux problèmes qui s'y rapportent, + l'état actuel de sa pratique au sein de nos organisations + réclame qu'on poursuive avec une plus grande attention + les efforts entrepris. + § la démocratie syndicale consiste principalement à + assurer la participation active des syndiqués à la vie + de l'organisation,à la détermination de son orientation et + de ses décisions. + § elle suppose la plus large expression des syndiqués, + l'information et la circulation des idées. + § le 38ème *congrès a défini les principales conditions + nécessaires à la démocratie syndicale. + § plus est grande la participation des adhérents à la vie + de l'organisation,meilleures sont les décisions,plus + étroits sont les liens du syndicat avec les travailleurs + par l'intermédiaire de ses adhérents mieux informés, + plus nombreux les syndiqués qui prennent une part + même modeste,au travail syndical,plus nombreux enfin ceux qui + deviennent des militants. + § par là,le syndicat décuple son efficacité dans son + orientation,dans la mise en activité des forces indispensables + pour faire face à toutes ces obligations,dans les moyens + d'un plus grand recrutement,d'une meilleure promotion de + cadres. + § par là,il donne pleinement l'image,à tous les échelons, + de la grande organisation de masse qu'est la CGT + et qu'elle veut être toujours mieux,pour être + "la CGT partout et pour tous" . + § lorsque les militants responsables sont animés par + ces préoccupations et en assimilent la portée,ils + trouvent plus aisément les solutions pour y parvenir, + les mesures d'organisation et le style de direction. + + porter la bataille des idées à la mesure de nos + responsabilités .. + + § c'est à partir de la même préoccupation $: le caractère + de masse de toute l'activité syndicale,qu'il convient + d'envisager la bataille des idées. + § le 38ème *congrès a lancé le mot d'ordre $: + "gagner des millions de consciences" + car telle est l'envergure de la bataille sociale. + § c'est à des millions de travailleurs qu'il faut apporter + constamment les idées,les réponses ,les réflexions, + les propositions de la CGT pour qu'ils puissent se + déterminer,trouver leur voie en dépit du martèlement + des idées du *capital qui dispose de tous les moyens + essentiels d'information. + § c'est une condition absolue de l'efficacité de l'action + revendicative comme de la lutte pour les changements + plus fondamentaux et de l'accomplissement de toutes les + tâches de la CGT. + § la mettre en mesure de faire face à ses responsabilités, + c'est à la fois la doter de l'organisation correspondant + aux exigences de la lutte gigantesque de notre époque + et assurer un rayonnement permanent et infiniment plus + large à ses idées. + § tout l'ensemble de l'activité d'information et de + propagande de la CGT et de ses organisations doit être + adapté à cette responsabilité,à cette obligation d'information, +d'explication et d'éducation de masse; + c'est dire qu'il convient de donner à la propagande + syndicale les moyens,l'efficacité,la diversité qui + correspondent à ces exigences en adoptant les méthodes + modernes et en consacrant les forces nécessaires pour + y parvenir. + § et d'abord l'effort de diffusion de toute la presse + confédérale et principalement du moyen central et + permanent d'expression de la CGT auprès de l'ensemble + des travailleurs : "la Vie-Ouvrière " . + § ce qui vaut pour la conception du recrutement qui doit + prévaloir vaut pour celle de la diffusion de "la Vie-Ouvrière". + car l'organisation en masse des travailleurs + dans la CGT doit aller de pair avec leur connaissance, + en masse des idées de la CGT et par conséquent avec la + lecture régulière de son hebdomadaire de masse. + + la solidarité ouvrière internationale et l'unité d'action + syndicale en Europe .. + + § les progrès de la détente _ fait principal de la situation + internationale _ sont un succès pour les travailleurs, + les peuples,toutes les forces de progrès.ils traduisent + le recul des positions de l'impérialisme dans le monde; + les résultats,dans leur édification,des pays socialistes, + qui ne connaissent ni crise,ni inflation,ni chômage, + le renforcement des luttes de classe des travailleurs + dans les grands pays capitalistes,les nouveaux succès + du mouvement de libération nationale caractérisés par la + victoire historique des travailleurs et des peuples du + Viêt-Nam et du Cambodge contre l'impérialisme + américain,le renforcement de l'indépendance économique + et politique contre le néocolonialisme de différents + pays libérés. + § à cet égard,la CGT considère parfaitement légitimes + les mesures prises par les pays producteurs de pétrole + et d'autres matières premières pour obtenir des prix + normaux.elle exprime sa solidarité à ceux qui sont + engagés dans une voie démocratique et anticapitaliste. + § elle agit pour la sauvegarde de la paix,la sécurité + en Europe et dans le monde,la coopération internationale. + § elle exige du gouvernement une politique active de paix + et d'indépendance nationale. + § le courant pour la démocratie se renforce.il s'est + manifesté en particulier par le renversement de la + dictature fasciste au Portugal et en Grèce . + § contraint au recul,l'impérialisme s'acharne pourtant + à préserver sa domination par tous les moyens lorsqu'il + en a la possibilité $: la bestialité des généraux putschistes + au Chili en est l'illustration et les menaces d'intervention + militaire contre les pays producteurs de pétrole. + § la CGT renforcera son action de solidarité avec les + travailleurs,les syndicats,les démocrates du Chili , + d'Espagne et tous ceux qui subissent la répression, + le joug fasciste,le racisme à travers le monde. + § la CGT poursuivra son action avec les autres forces + progressistes de France pour la solidarité aux peuples + du Viêt-Nam et du Cambodge . + § elle se prononce pour un règlement des problèmes du + Moyen-Orient qui,mettant fin à la politique agressive + des dirigeants d'Israël ,restitue leurs territoires + aux pays arabes,rétablisse,conformément aux décisions de + l'ONU,le peuple palestinien dans ses droits nationaux + et assure le droit à l'existence et la sécurité de tous + les *états de cette région,y compris l'*état d'Israël . + § affirmant la permanence de son attitude anticolonialiste + et antinéocolonialiste,la CGT salue les victoires + remportées par les peuples d'Angola ,du Mozambique + et de Guinée-Bissau ,et se déclare solidaire des + peuples d'Afrique en lutte pour conquérir ou consolider + leur indépendance économique. + § elle appuie la lutte des travailleurs et des peuples + des *départements d'Outre-Mer et des *territoires + d'Outre-Mer pour la liquidation du colonialisme français + et l'octroi aux DOM du statut d'autonomie réclamé par + les populations de ces pays. + § des changements importants et positifs se produisent + dans le mouvement syndical à travers le monde. + § dans les pays capitalistes,frappés par la crise et + où sévissent les sociétés multinationales,les travailleurs + en subissent les mêmes conséquences $: inflation, + chômage,attaques contre leur niveau de vie et leurs + droits. + § les luttes de classe s'y aiguisent partout et elles + trouvent leur reflet au sein même d'organisation dont + l'orientation est traditionnellement axée vers la + collaboration de classe et où l'on constate la progression + des idées et de la pratique d'une attitude plus combative + dans la défense des intérêts de classe des travailleurs. + § sur cette base,ainsi qu'en conséquence de l'évolution + internationale,se développe un mouvement favorable au + rapprochement entre organisations syndicales de + différentes affiliations internationales et entre les + centrales internationales elles-mêmes. + § la CGT contribue,par ses initiatives directes et + par sa participation active à l'action de la FSM,à + favoriser cette évolution,pour aboutir à un vaste + développement de l'unité d'action internationale + pour des objectifs concrets communs répondant aux intérêts + des travailleurs,de la démocratie et de la paix et par + des actions effectives. + § elle attache la plus grande importance au renforcement de + l'influence de la FSM dont le rôle et le prestige + international grandissent en raison de son action et des + idées de lutte conséquente qu'elle représente.la CGT + renforcera en particulier son soutien aux UIS de la + FSM dont le rôle est capital pour l'organisation + concrète de la défense internationale effective des intérêts + des travailleurs contre les sociétés multinationales. + § la CGT qui entretient de longue date une coopération + fraternelle avec les syndicats des pays socialistes, + entend la développer encore et contribuer à faire + connaître avec objectivité la réalité et les résultats + des pays socialistes qui intéressent au plus haut point + les travailleurs français. + § c'est naturellement en Europe que les responsabilités + de la CGT sont les plus grandes.c'est aussi sur notre + continent que l'on assiste à des évolutions parmi les + plus importantes dans le mouvement syndical. + § une première rencontre unitaire des centrales syndicales + de tous les pays d'Europe ,capitalistes et socialistes, + sans considération d'affiliation internationale s'est tenue + en janvier 1974. + § une deuxième rencontre de toutes ces centrales a eu + lieu en février-mars 1975.des perspectives concrètes + existent pour que s'instaurent au-delà des relations + bilatérales,des relations multilatérales,collectives, + sans discrimination pour étudier des problèmes syndicaux, + économiques et sociaux d'intérêt commun. + § la CGT y attache une très grande importance et entend + y coopérer de son mieux,dans un esprit constructif de + compréhension mutuelle.elle considère qu'il est nécessaire + et possible d'établir des rapports et une coopération + suivis entre toutes les centrales des pays d'Europe , + quel que soit leur régime économique et social. + § en Europe occidentale il est urgent d'aller de + l'avant.dans tous ces pays,les travailleurs se heurtent à la + même situation économique,à des politiques gouvernementales + et patronales similaires et subissent le poids des + sociétés multinationales. + § au sein de la CEE,qui s'est avérée incapable de + promouvoir une véritable politique sociale malgré les + promesses réitérées,les travailleurs sont appelés au + "partage des sacrifices" et subissent les mêmes méthodes + d'austérité.ils se heurtent à l'emprise accrue des grandes + féodalités financières et industrielles de chaque pays + et internationales,notamment américaines. + § la coopération syndicale est urgente,pour des initiatives + communes dans les institutions de la CEE,pour + démocratiser ces institutions.cette coopération est + nécessaire pour promouvoir une Europe antimonopoliste, + démocratique et pacifique. + § au-delà des problèmes propres aux pays membres de la + CEE,se pose avec acuité la recherche de l'unité d'action +entre les syndicats de tous les pays d'Europe + occidentale . + § la constitution de la CES a représenté un événement + nouveau.son ouverture aux centrales affiliées à la CMT + (dont la CFDT) puis à la CGIL marque un progrès. + § si l'évolution unitaire est le trait dominant,il n'en + reste pas moins que demeurent encore dans certaines + centrales des attitudes héritées de la guerre froide + qui maintiennent des blocages artificiels. + § la CGT souhaite participer à la CES dans un + esprit constructif et réaliste.elle ne saurait évidemment + admettre des conditions discriminatoires d'aucune sorte. + § de la même manière qu'elle trouve naturel que les + organisations affiliées à la CISL ou à la CMT + aient conservé leur affiliation internationale,elle + entend conserver librement son affiliation à la FSM, + sans aucune espèce de "distance".la CGT entend être + un partenaire syndical loyal,sérieux mais égal en tous + points. + § des tâches urgentes et communes sollicitent les organisations + syndicales en Europe occidentale .les revendications + essentielles de défense des intérêts des travailleurs + sont communes.sous une forme ou sous une autre,il faut + faire face ensemble avec tout l'esprit de compréhension + nécessaire.il faut développer des initiatives d'action + unitaires;le plus tôt sera le mieux. + + conclusion .. + + § l'année 1975 est celle du 80ème anniversaire de la + *confédération générale du travail . + § dès sa création,la CGT a inscrit dans ses statuts les + orientations essentielles qui guident aujourdhui sa + vie et son action. + § organisation de masse ouverte à tous les salariés, + elle affirmait en 1895 la nécessité de la lutte pour + défendre leurs intérêts de classe et son but $: la suppression + de l'exploitation des salariés par les patrons. + § depuis cette période,la CGT a été au coeur des luttes + et de l'histoire du mouvement ouvrier, + du mouvement syndical,et de l'histoire de la + France tout particulièrement lors du *front populaire , + pendant la *résistance à l'occupant nazi,et dans les + années qui ont suivi la *libération . + § les connaissances,la conscience,l'expérience historique + acquises dans les luttes de classe,dans la vie nationale, + dans la solidarité internationale et les rapports avec + le mouvement syndical du monde entier ont profondément + transformé la CGT en conservant le meilleur de ses + orientations initiales. + § au cours des trente années qui ont suivi la deuxième + guerre mondiale,la CGT a connu les épreuves de la scission + et de la guerre froide,la lutte contre le colonialisme + français,le combat entrepris dès le début contre la + mainmise des monopoles sur l'*état et contre le pouvoir + personnel en France . + § des éléments historiques nouveaux sont apparus dans ce + combat. + § l'unité d'action entre la CGT et la CFDT est devenue + un élément important de la vie et des luttes syndicales. + § mai 1968 a été le premier grand affrontement à l'échelle + nationale entre les travailleurs et le pouvoir des grandes + sociétés capitalistes.mouvement revendicatif,il posait + par sa dimension même le problème d'un changement radical + de politique et de transformations profondes dans la + société.il a servi de révélateur de la crise.depuis, + l'approfondissement de celle-ci fait apparaître + davantage que c'est tout le système actuel,le capitalisme + monopoliste d'*état ,qui est en cause. + § l'*union de la gauche sur le *programme commun , + voulue par la CGT et les succès considérables qu'elle + a remportés offrent aux travailleurs et à la France + la perspective proche de profondes réformes démocratiques + et d'un progrès économique et social qui peuvent,si + la réussite de cette expérience est réalisée,gagner + la grande majorité des travailleurs et du pays à l'idée + de la transformation socialiste de la société. + § cette perspective se situe dans un monde en pleine + évolution et transformation,et ce contexte contribue à + la rendre possible. + § le capitalisme est,au sein même des grands pays + les plus développés,dans une crise profonde qui durera; + le socialisme progresse et se construit,le colonialisme + direct est en voie de liquidation complète,et les pays + du Tiers-Monde luttent pour leur indépendance économique. + plusieurs régimes fascistes sont tombés et l'impérialisme + est en recul. + § cette évolution est le résultat d'une lutte longue et + difficile menée par les travailleurs,les forces + progressistes et les peuples du monde entier.la classe + ouvrière,dans chaque pays et à l'échelle internationale + a toujours été l'élément le plus solide et le plus résolu + dans le combat pour la démocratie,la paix,l'indépendance + des peuples et le progrès.dans les heures les plus + difficiles elle n'abandonne pas la lutte. + § la CGT est consciente d'avoir,pour sa part syndicale + et nationale,contribué à ce mouvement historique dans le + monde entier,au long des 80 ans de sa propre histoire.elle + reste et restera fidèle à sa mission,conforme aux + intérêts et au rôle de la classe ouvrière et de l'ensemble + des travailleurs. + + + + + + + + + programme d'action .. + l'action pour la satisfaction des grands objectifs + revendicatifs .. + + § dans une période marquée par la crise profonde du + système capitaliste et la volonté du pouvoir de renforcer + par tous les moyens la puissance des groupes financiers + et industriels les plus importants,la politique du + gouvernement et du patronat est fondée sur une + accentuation de l'exploitation capitaliste.l'inflation + constitue un moyen d'accentuer et de généraliser cette + exploitation. + § peser sur le pouvoir d'achat,limiter sa progression, + constitue l'objectif avoué du patronat et de l'*état + patron. + + pouvoir d'achat .. + salaires .. + + § dans ces conditions,le problème des salaires et du + pouvoir d'achat est plus que jamais la préoccupation + première et permanente des travailleurs et du mouvement + syndical,parce qu'il détermine,dans une mesure décisive, + le niveau de vie du salarié et qu'il est l'enjeu de la + lutte quotidienne avec le capital.la progression du + pouvoir d'achat représente un moyen efficace pour assurer + le plein emploi et le développement de l'économie. + § la CGT développe son action conjointement pour $: + _l'augmentation des salaires compte tenu,tout à la fois, + de leur niveau scandaleusement insuffisant pour certaines + catégories et dans certains secteurs professionnels et + de l'écart qui s'est creusé,en général,entre les salaires + et les prix; + _la garantie du pouvoir d'achat s'appliquant aux salaires + ainsi revalorisés; + _la progression du pouvoir d'achat; + _la remise en ordre des salaires et systèmes de rémunération. + + garantie du pouvoir d'achat des salaires .. + + § la poussée inflationniste que l'on observe dans notre + pays conduit naturellement les travailleurs à revendiquer + des mesures de protection de leur pouvoir d'achat. + § la garantie effective du pouvoir d'achat des salaires, + pour tous les salariés,suppose l'établissement d'un + véritable système national et interprofessionnel d'échelle +mobile,assurant périodiquement et à intervalles + rapprochés le relèvement automatique des salaires et + traitements,en fonction des hausses des prix intervenues,avec + compensation pour les pertes subies dans la période + antérieure. + § elle suppose aussi la suppression dans la législation + des interdictions ou limitation des clauses d'indexation. + § l'évolution du coût de la vie doit être établie par un + nouvel indice reflétant la réalité des prix,qui doit être + élaboré en accord avec les organisations syndicales et + familiales. + + progression du pouvoir d'achat des salaires .. + + § la progression du pouvoir d'achat doit permettre la + satisfaction des besoins nouveaux qui apparaissent comme + des exigences de la vie à l'étape actuelle de la société, + pour toutes les catégories de travailleurs. + § elle est un impératif du développement économique + et social de la *nation et contribue à assainir la + situation de l'emploi. + § cette progression se justifie pleinement par l'ampleur + des profits capitalistes,le développement du revenu + national,les progrès de l'économie et l'accroissement + considérable de la productivité du travail;elle doit être + assurée quelle que soit l'évolution de la situation + économique. + § le pouvoir d'achat des salaires de tous les travailleurs doit + progresser. + § cette progression,plus importante pour les bas et moyens + salaires,donc différenciée,doit être négociée au niveau + des branches professionnelles et des entreprises,et + pour tous les secteurs d'activité,public et privé. + § cette progression différenciée doit s'inscrire dans une + politique de remise en ordre des systèmes de rémunérations, + ramenant les classifications et coefficients à un nombre + raisonnable avec,entre deux coefficients successifs, + des écarts significatifs,revalorisant la hiérarchie des + catégories ouvriers employés et techniciens et tendant + à réduire l'écart hiérarchique réel par un resserrement + vers le haut. + + remise en ordre des salaires et des systèmes de + rémunérations .. + + § cette remise en ordre,qui s'inscrit dans notre + objectif de statut unique du manoeuvre à l'ingénieur, + doit être établie en fonction des principes suivants $: + _établissement,dans chaque branche,d'une grille + nationale unique de classifications et de salaires + garantis,couvrant toutes les catégories de salariés,du + manoeuvre au cadre,et s'appliquant à tous,sans discrimination + d'aucune sorte. + _ces grilles uniques,nationales et professionnelles, + devront comporter une définition des classifications, + tenant compte des changements intervenus dans tous les + domaines (scientifiques,techniques,technologiques) + des diplômes,de la place et du rôle des hommes dans + le processus de production.ces définitions se référeront + aux connaissances acquises par le travailleur,qu'elles + soient sanctionnées ou non par un diplôme,à l'expérience + qu'il possède,aux initiatives qu'il peut prendre et aux + responsabilités qui lui incombent. + _les barèmes nationaux de salaires garantis seront + calculés,pour chaque classification et coefficient + correspondant par rapport à une valeur de point unique, + affectée au coefficient 100.ces salaires garantis par + conventions collectives et accords devront exclure + toutes les primes et représenter l'essentiel de la + rémunération. + § la réalisation de ces dispositions essentielles + suppose $: + _la suppression de tous les systèmes de rémunération + basés sur les études de postes; + _l'intégration dans le salaire garanti des primes aléatoires + ayant le caractère de fait d'un complément de salaire + ou portant atteinte à la dignité des travailleurs; + _l'élimination des disparités existantes entre des + salariés de même qualification; + _la suppression des abattements de zones et des disparités + régionales; + _la suppression de toute discrimination basée sur l'âge, + le sexe ou la nationalité; + _la limitation des éléments de la rémunération liés + au rendement par leur intégration partielle dans le + salaire garanti;leur suppression,par voie contractuelle, + dans les branches et les entreprises où les conditions + existent pour les intégrer en totalité dans le salaire + garanti; + _la garantie de la classification et du salaire,en cas de + mutation ou de changement de poste de travail; + _la suppression de la rémunération au rendement pour les + femmes enceintes,leur classification et leur salaire + antérieur leur étant garantis. + § lorsqu'une partie du salaire restera liée au rendement, + la partie mobile du salaire venant s'ajouter au salaire + garanti devra être calculée à partir de celui-ci,d'une + manière contrôlable et claire pour les travailleurs + concernés,et assurer obligatoirement une rémunération + supérieure au salaire garanti dans la catégorie. + + salaire minimum interprofessionnel .. + + § la CGT estime qu'il est indispensable de donner + au salaire minimum interprofessionnel de croissance + (SMIC) une valeur telle qu'elle constitue une + véritable garantie permettant une vie décente aux salariés + dont les rémunérations sont les plus faibles.c'est + pourquoi,elle demande que le SMIC soit porté à + 1700 francs par mois (valeur mai 75) qu'il soit mensualisé + sur la base de la durée légale du travail (40 heures + par semaine),que cette garantie mensuelle soit assurée à + tous les salariés,en cas de réduction d'horaire au-dessous + de 40 heures,et que son pouvoir d'achat soit garanti par + référence à un indice des prix rénové et établi par + voie de négociation. + § cette garantie minimale mensuelle devra s'appliquer + à l'ensemble des salariés et servir de référence à + l'évolution des retraites et pensions,ainsi que des + diverses allocations sociales.cette dernière mesure suppose la + suppression du minimum garanti,qui sert d'indexation à + plusieurs indemnités et ne cesse de se dévaloriser depuis + 1970. + § la CGT demande que la loi du 2 janvier 1970,portant + réforme du salaire minimum interprofessionnel,soit + modifiée pour que la commission supérieure des conventions + collectives procède,deux fois par an,à une véritable + discussion sur la progression du SMIC,dont le taux + doit être fixé en tenant compte de l'avis émis par la + commission. + § la CGT estime,en outre,qu'il convient de rendre au + SMIC le sens qu'il avait à son origine,c'est-à-dire + qu'il devrait être fixé net de toutes primes ou majorations + de quelque nature que ce soit. + § par ailleurs,la loi doit interdire la fixation dans les + conventions collectives de salaires garantis inférieurs au + SMIC. + + mensualisation et statut unique .. + + § la CGT considère que la mensualisation des ouvriers, + qui ne se limite pas au seul paiement au mois du salaire, + n'est pas encore réalisée. + § pour que cette mensualisation soit réelle,elle doit + apporter les mêmes garanties à toutes les catégories de + salariés,et permettre aux ouvriers de chaque branche + professionnelle de bénéficier de tous les droits et + avantages dont ils sont encore exclus. + § cette généralisation sans restriction des droits,leurs + améliorations,doivent se traduire,dans chacun des secteurs + professionnels,par l'élaboration d'un statut unique + national,comportant des avantages substantiels,applicable + à toutes les catégories de travailleurs et trouver place + dans les *conventions collectives . + + prestations,allocations,rentes,pensions .. + + § la politique de démantèlement de la *sécurité sociale + engagée par le *pouvoir et le *patronat particulièrement + depuis 1958 se poursuit sans relâche.après les + *ordonnances de 1967 la loi sur la compensation et + l'harmonisation des régimes de *sécurité sociale + constitue une nouvelle et grave atteinte à la + *sécurité sociale .le plan de démantèlement de cette + institution,fondamentale pour les travailleurs,est + progressivement réalisé. + § cette politique a pour conséquence une dévalorisation + continue des prestations et des services rendus aux + assurés,allocataires et pensionnés.compte tenu de l'inflation + ceux-ci connaissent une dégradation constante de leur + pouvoir d'achat. + § face à cette situation,la CGT revendique en tout + premier lieu le relèvement automatique et périodique + des allocations,rentes,pensions et retraites,en fonction + de la hausse des prix enregistrée par un nouvel indice + élaboré en accord avec les organisations syndicales et + familiales. + § la CGT exige $: + pour les prestations sociales et les rentes $: + _ le remboursement à 80 et 100% des dépenses de santé, + y compris celles résultant de l'interruption de grossesse, + remboursement garanti par une *convention médicale + issue d'une véritable négociation entre les médecins + et les représentants des assurés sociaux; + _l'exonération totale du ticket modérateur pour la longue + maladie,les personnes âgées et les enfants de moins + de six ans,première étape vers la gratuité des soins; + _l'extension du tiers payant supprimant l'avance + d'argent pour l'hospitalisation,la pharmacie,les soins + dentaires,les analyses et examens de laboratoire; + _la fixation de l'indemnité journalière maladie et de + la pension d'invalidité 2ème catégorie à 75% du salaire + avec un minimum égal à 80% du SMIC.s'agissant de + l'indemnité journalière versée à la suite d'un accident + du travail ou d'une maladie professionnelle,elle devrait + être portée à 100% du salaire; + _l'établissement d'un minimum de ressources égal au + SMIC pour les handicapés qui travaillent et à 80% du + SMIC pour ceux dans l'incapacité de travailler. + pour les prestations familiales $: + _afin de rattraper les retards accumulés par les + *allocations familiales ,la CGT demande qu'elles soient + revalorisées immédiatement de 30% et que leur progression + soit assurée en fonction de l'évolution des salaires; + _elle exige leur versement aux travailleurs immigrés + dans les mêmes conditions que celles requises pour les + nationaux,quel que soit le pays de résidence des familles; + _elle se prononce pour une refonte du système des + prestations familiales,notamment par $: + _la fusion du salaire unique et des allocations familiales, + _l'attribution de la prestation dès le premier enfant + sans aucune discrimination et sans conditions de + ressources; + _elle revendique l'attribution aux femmes salariés d'une + indemnité de garde pour les enfants de moins de trois + ans quel que soit le mode de garde adopté. + § pour les pensions et retraites $: + les travailleurs retraités connaissent des conditions de vie + très difficiles résultant du trop faible niveau des + retraites et de leur insuffisante progression face à + l'évolution du coût de la vie.pour ces raisons et aussi parce + que pour la CGT il est fondamental de reconnaître le + droit à la retraite dans des conditions permettant de vivre + décemment,elle exige $: + _une retraite égale à 75% de tous les éléments de la + rémunération,avec un montant minimum égal au SMIC,à + 60 ans pour les hommes et 55 ans pour les femmes et les + salariés effectuant des travaux pénibles ou insalubres; + _une pension de reversion fixée,pour tous les secteurs, + à 75% de la pension principale; + _la suppression des restrictions interdisant le cumul + d'une pension propre et d'une pension de reversion; + _la revalorisation des pensions et retraites en fonction + de l'évolution réelle du coût de la vie et de la + progression des salaires; + _le paiement mensuel et d'avance des pensions et + retraites; + _la reconnaissance pour les travailleurs immigrés de droits + identiques à ceux des travailleurs français,quels que + soient leur origine et le pays de résidence des familles. + § l'amélioration de la situation des retraités passe + également pour un très grand nombre d'entre eux par une + juste progression des retraites complémentaires,progression + qui doit tenir compte ,elle aussi,de l'évolution du coût + de la vie et de celle des salaires. + § la satisfaction de ces revendications essentielles + qui doit permettre d'accorder à tous les salariés en + activité ou retraités,un meilleur système de protection + sociale,ne peut résulter de transferts financiers entre + catégories.elle suppose que le problème du financement + de la *sécurité sociale fasse l'objet d'un réexamen + d'ensemble dans le respect de ce principe et dans le cadre + d'une négociation avec les organisations syndicales.la réforme + du financement comporte notamment pour la CGT $: + _la suppression des charges indues et des transferts + effectués au détriment de la sécurité sociale; + _le déplafonnement progressif des cotisations; + _la nationalisation de l'industrie pharmaceutique qui + permettrait de réduire les coûts et les dépenses de l'assurance +maladie en supprimant les gaspillages et en + réduisant le nombre des produits; + _la suppression et la réduction du taux de la TVA sur + les biens et services de santé ouvrant droit aux + prestations de *sécurité sociale . + § de telles dispositions doivent s'inscrire dans le cadre + d'une véritable réforme démocratique de la *sécurité sociale + restituant aux représentants élus des assurés la gestion + de leur régime,fixant de façon satisfaisante la participation + budgétaire de l'*état et créant les conditions d'une + harmonisation concertée des différents régimes dans + l'intérêt de leurs bénéficiaires. + § s'agissant des retraites complémentaires ,la CGT + réclame $: + _un réexamen du financement des régimes permettant + à ceux-ci,au moyen notamment d'une meilleure participation + patronale,de faire face aux impératifs d'évolution des + retraites en liaison avec celle du coût de la vie et aussi + de l'abaissement de l'âge de la retraite; + _l'harmonisation des règlements,la coordination entre + les différents systèmes en vue de rendre possible leur + unification dans le respect intégral des droits individuels + et des droits collectifs acquis; + _la démocratisation des *institutions de retraites + complémentaires à la gestion desquelles les retraités + doivent être associés. + + la fiscalité .. + + § le système fiscal actuel représente par son caractère + de classe une des injustices les plus flagrantes du + régime.les exonérations et avantages substantiels,accordés + au cours des dix dernières années aux grandes sociétés et aux + gros porteurs de capitaux,ont été compensés par un + alourdissement de la charge fiscale supportée par les + salariés. + § très durement frappés par la TVA et les impôts + indirects qui atteignent fréquemment l'intégralité des + ressources familiales,converties en dépense de consommation, + les ménages de salariés en activité ou retraités sont en + nombre croissant assujettis à l'impôt sur le revenu,celui-ci + évoluant plus rapidement que les salaires.ainsi,les + foyers d'ouvriers et de retraités sont de plus en plus + nombreux à acquitter cet impôt.les familles de cadres + moyens ou supérieurs,et plus généralement celles où les + femmes travaillent,supportent,du fait de sa forte + augmentation,une charge fiscale très lourde.pour une + grande partie des salariés,le poids de la charge fiscale, + liée à la stagnation,voire à la diminution ,des prestations + familiales et sociales,aboutit à une régression de leur + pouvoir d'achat global. + § pour ces raisons,la CGT se prononce en faveur d'une + refonte démocratique de l'ensemble du système fiscal. + cette refonte devrait reposer sur quelques grands principes + essentiels $: + _une répartition différente entre les différents impôts + afin notamment de réduire la part résultant de la TVA, + d'assurer un meilleur rendement de l'impôt sur les + sociétés et une imposition du capital; + _une plus juste connaissance des revenus de toutes les + catégories de contribuables; + _des conditions d'imposition différentes pour les revenus + du travail,les revenus du capital et les revenus mixtes, + la rémunération de la force de travail ne pouvant par exemple + être comparée aux revenus du patrimoine foncier acquis sans + effort. + § dans ce cadre la CGT se prononce pour substituer + au système du quotient familial un dispositif de + réduction fixe étudié de manière à tenir compte des + charges réelles de famille. + § dans l'immédiat la CGT exige l'adoption des mesures + qui suivent : + + impôt sur la consommation $: + + _la réduction ou la suppression sur les produits alimentaires + et pharmaceutiques,les biens et services d'intérêt social. + la répercussion intégrale dans les prix de ces + dispositions fiscales doit être assurée par des mesures + de contrôle. + + impôt sur le revenu $: + + _une refonte complète du barème assurant l'exonération des + revenus inférieurs au SMIC et allégeant l'imposition + pour les petits et moyens salariés; + _la révision annuelle du barème en fonction de l'indice + des prix reconnu par les organisations syndicales; + _le relèvement de la déduction pour frais professionnels + de 10 à 15% avec plafonnement.cette mesure étant justifiée par + l'aggravation et la multiplication de ces frais.l'indexation + du plancher de déduction des frais professionnels sur les + prix; + _l'institution d'une réduction spéciale de 15% sur les + revenus des retraités avec établissement d'un + plafonnement; + _dans l'attente de l'attribution aux femmes salariées + d'une indemnité,prenant en compte les frais résultant + de la garde des enfants en bas âge,la déduction des + frais des revenus imposables; + _pour les jeunes salariés effectuant leur année de + service militaire,exonération de l'impôt sur les revenus + de l'année précédant celui-ci;possibilité de reporter le + paiement des impôts et des tiers provisionnels dûs pour + l'année suivant le service militaire;possibilité d'étalement + du paiement de l'impôt pour certains salariés ayant + des revenus irréguliers ou intermittents. + § la CGT rappelle son opposition au paiement de l'impôt + sur le revenu par le système de la retenue à la source,que + le *gouvernement essaie d'introduire en partant du paiement + mensuel de l'impôt.ce système en effet ,ne réglant + aucun des véritables problèmes (poids et répartition + de l'impôt) favoriserait en outre de nouveaux transferts + de charge au détriment des salariés. + + impôts locaux .. + + § la fiscalité locale ne cesse de s'alourdir et elle + frappe de plus en plus durement les foyers de travailleurs, + même ceux ne disposant que de ressources modiques. + § les modifications actuellement en cours dans ce domaine, + que le gouvernement présente comme une amélioration, + se traduisent au contraire par une aggravation des + impôts payés par les ménages. + § il est nécessaire de limiter la pression des impôts locaux + sur les ménages par une réforme démocratique se situant + dans le cadre d'une refonte des finances locales et + entrainant une répartition plus juste,notamment entre + les entreprises et les particuliers. + § en contrepartie des allégements demandés,la CGT + propose dans le but d'aboutir à une répartition plus + équitable de la charge fiscale et d'assurer des recettes + nouvelles,les mesures suivantes : + § imposition des sociétés et actionnaires $: + _élargissement de la base de l'impôt sur les sociétés par + l'abrogation des régimes de faveur (amortissements + dégressifs,provisions injustifiées,régimes spéciaux + d'imposition $...); + _abrogation des mesures bénéficiant aux revenus du + capital (suppression du prélèvement libératoire,de + l'avoir fiscal,de l'abattement,applicable aux revenus + fixes $...). + § imposition du capital $: + _création d'un impôt progressif sur le capital et l'actif + net des grandes sociétés. + § lutte contre la fraude fiscale $: + la CGT demande de véritables mesures de nature à mettre + fin à la fraude fiscale qui se situe essentiellement + au niveau des grandes sociétés,de leurs actionnaires et + de leurs dirigeants. + le problème déterminant étant celui de la connaissance + exacte des revenus de toute nature,il est indispensable + (indépendamment des mesures de publicité de l'impôt) + que l'*administration dispose de moyens suffisants pour + exercer sa mission de contrôle contre la véritable fraude. + + le droit au travail + le droit à l'emploi,sa garantie,l'indemnisation du chômage .. + le droit à l'emploi .. + + § la politique économique et sociale actuelle aggrave + l'insécurité de l'emploi et le chômage. + § les moyens fondamentaux de renverser cette tendance sont + contenus dans l'ensemble du présent programme. + § dans l'immédiat,la CGT se prononce à nouveau en faveur + de mesures générales efficaces permettant d'améliorer + sensiblement la situation de l'emploi $: + _progression du pouvoir d'achat (stimulant pour l'économie); + _avancement de l'âge ouvrant droit à la retraite; + _réduction du temps de travail sans diminution de salaire + et allègement de la charge de travail individuelle + devant entraîner l'embauche d'effectifs supplémentaires. + § ces mesures sont indissociables de la mise en oeuvre d'une +véritable politique de développement économique qui + offrirait les débouchés nécessaires à toutes les personnes + désirant occuper un emploi notamment aux jeunes et aux + femmes. + § _les textes légaux et contractuels sont susceptibles + d'apporter certaines protections appréciables mais ne + résolvent pas le problème décisif de la garantie de l'emploi + et ne règlent que partiellement celui des garanties + de ressources dont de nombreux salariés sont exclus. + § pour atteindre ces deux objectifs,la CGT formule + les revendications suivantes,pour l'ensemble des salariés + des secteurs public,nationalisé et privé,quels que soient + leur âge,leur sexe ou leur nationalité. + + la garantie de l'emploi .. + + § _droit à l'information complète et contrôlable faite + en temps utile des salariés,de leurs représentants et des + organisations syndicales sur tous les problèmes concernant + l'emploi. + _droit réel de discussion pour les syndicats et les + représentants du personnel sur les mesures susceptibles + d'entraîner des compressions d'effectifs,des licenciements ou + des modifications d'emploi,envisagées par les employeurs. + _droit de recours,pour les syndicats et les représentants + du personnel,à des instances paritaires et à des instances + juridiques habilitées à cet effet en cas de difficultés + dans l'entreprise $: le recours suspend toute décision de + licenciement. + _interdiction de tout licenciement non accompagné d'une + mesure de reclassement préalable,garantissant pleinement + les droits des travailleurs et leur assurant une + situation équivalente. + _protections équivalentes des salariés licenciés en cas + de faillite (liquidation de biens,règlement judiciaire) + par la mise en oeuvre de la responsabilité collective + du patronat. + _réemploi obligatoire des femmes dès leur retour du + congé légal d'un an pour élever un enfant et des jeunes à + l'issue du *service national avec maintien des avantages + acquis. + _interdiction de tout licenciement prioritaire basé sur + l'âge,le sexe ou la nationalité. + _application intégrale et extension à l'ensemble des + salariés des droits découlant des accords nationaux + interprofessionnels,lois et règlements,sur la sécurité de + l'emploi,la formation et le perfectionnement professionnels. + _droit de contrôle (et moyens réels de l'assurer), + sur l'utilisation des fonds publics alloués aux entreprises + pour création ou évolution d'emplois. + _suppression des contrats à durée limitée. + _personnel permanent en nombre suffisant permettant + d'assurer les travaux courants de l'entreprise et excluant + dans ces domaines le recours à des entreprises extérieures + de main d'oeuvre intérimaire ou temporaire. + _révision profonde des conditions d'introduction de + séjour et d'emploi de la main-d'oeuvre immigrée et prise + en compte des revendications formulées à cet égard par la + CGT garanties par un statut à caractère social et + démocratique. + _protection des immigrés contre les trafics et les abus + dont ils sont victimes,quels qu'en soient les auteurs et + stricte application de la loi du 6 juillet 1973 relative à + la répression des trafics de main-d'oeuvre. + _l'*office national d'immigration doit être le seul + organisme compétent chargé du recrutement à l'étranger, + de l'introduction et de l'accueil des immigrés et de leurs + familles. + + garantie des ressources .. + + § lorsqu'un emploi ne peut être donné à ceux qui veulent + travailler,il faut leur garantir des ressources décentes + sans limitation de durée : + _tout salarié privé d'emploi par son employeur et qui est + inscrit comme demandeur d'emploi doit bénéficier de + ressources égales à son salaire antérieur. + _tous les autres demandeurs d'emploi ,y compris ceux qui + recherchent un premier emploi doivent être assurés d'un + minimum de ressources égal au SMIC. + _garantie des ressources sur la base de l'horaire et du + salaire habituels pour les salariés touchés par des réductions + d'horaires. + _garantie de ressources égales au salaire antérieur à tous + les salariés dont le reclassement dans un emploi équivalent + n'a pu être assuré. + _revalorisation des allocations d'aide publique en matière + de chômage total ou partiel au taux de 50% du SMIC, + et élévation substantielle des plafonds de ressources. + _généralisation de l'action du *fonds national de l'emploi. + _généralisation de l'accord national interprofessionnel + du 14 octobre 1974,sur l'allocation supplémentaire d'attente +à tous les salariés victimes de licenciement. + _généralisation et amélioration de l'accord national + interprofessionnel du 27 mars 1972 sur la garantie + de ressources aux salariés privés d'emploi de plus de + 60 ans. + _attribution de délais de paiement et aide en matière + d'impôts,de loyer,de dettes et crédits pour les salariés + et leurs familles pendant la période où ils sont sans + emploi et inscrits comme demandeurs d'emplois. + _suspension immédiate de toutes poursuites saisies et voies + d'exécution à l'encontre des chômeurs. + _cotisation ASSEDIC à la charge exclusive des + employeurs. + + l'abaissement de l'âge de la retraite .. + + § alors que des centaines de milliers de travailleurs + connaissent le chômage et que les jeunes sont de plus en plus + nombreux à ne pouvoir trouver un emploi à l'issue de leur + temps de scolarité,*pouvoir et *patronat contraignent + des salariés âgés de plus de 60 ans à continuer leur activité + professionnelle. + § l'abaissement de l'âge de la retraite se justifie + pleinement $: + _pour des raisons humaines $:les statistiques font + clairement apparaître que dans leur grande masse les + travailleurs,et parmi eux tout particulièrement les + ouvriers de l'industrie et de l'agriculture,ont une durée + moyenne de vie plus brève que les autres catégories de + la population,ceci étant dû notamment aux conditions de + travail dont la CGT demande l'amélioration.le droit doit + leur être reconnu de pouvoir bénéficier véritablement et + dans des conditions décentes de leur retraite. + par ailleurs,les femmes de plus en plus nombreuses parmi + les salariés,connaissent dans le contexte actuel une + fatigue accrue du fait de leur double fonction de + travailleuse et de mère de famille,et de l'insuffisance + notoire des équipements sociaux collectifs qui devraient + être créés afin d'alléger leurs tâches familiales + de ménagères.dans ces conditions,la possibilité doit leur + être offerte,ainsi qu'aux travailleurs des professions les + plus pénibles de pouvoir bénéficier d'une retraite + anticipée. + _pour des raisons économiques et sociales $:les emplois + libérés par les travailleurs admis à faire valoir leurs + droits à la retraite au taux plein pourraient être + occupés par des salariés présentement en chômage.ceci apparaît + plus sain sur le plan économique et plus juste sur le plan + social. + § pour ces deux motifs essentiels,la CGT entend faire + aboutir la revendication de l'âge de la retraite au taux + plein à 60 ans pour les hommes et 55 ans pour les femmes + et les salariés effectuant des travaux pénibles ou insalubres, + en garantissant les avantages acquis par certaines + catégories des secteurs public et nationalisé. + + la réduction de la durée du travail .. + + § la nécessité d'un allègement de la charge de travail, + élément essentiel de l'amélioration des conditions de + travail,les besoins croissants de temps libre pour le + repos,les loisirs,l'information,l'accès à la culture, + l'aggravation de la situation de l'emploi,font de la réduction + de la durée du travail sans diminution des salaires une + revendication qu'il est urgent de satisfaire. + § elle peut s'appliquer notamment à l'échelle de la + semaine,par la réduction et la limitation de la durée + hebdomadaire,et à l'échelle de l'année,par l'allongement + des congés payés. + § les engagements pris par le patronat en mai 1968 n'ont + pas été tenus $: le retour à la semaine de 40 heures sans + diminution des salaires n'a été rendu effectif que pour + une minorité de salariés. + § la durée du travail demeure très élevée dans certains + secteurs et certaines entreprises,alors que se multiplient + les licenciements et les réductions d'horaires entrainant + d'importantes diminutions de salaires. + § la durée maximale légale du travail demeure fixée + à un niveau inadmissible. + § en conséquence,la CGT demande $: + _retour rapide et effectif aux 40 heures dans toutes les + branches et pour toutes les catégories de travailleurs, + avec compensation intégrale des effets de la diminution + des horaires sur les salaires. + _attribution à tous les salariés d'une cinquième + semaine de congés payés,pouvant être prise en dehors de + la période légale. + _augmentation des effectifs pour permettre la réduction + de la durée du travail pour toutes les catégories de + travailleurs,sans accroissement de l'intensité du travail. + _semaine de travail de cinq jours suivis de deux jours + de repos consécutifs obligatoires. + _abaissement progressif de la durée du travail en dessous + de 40 heures pour les salariés dont les conditions de travail + sont particulièrement pénibles. + _limitation à 45 heures de la durée hebdomadaire maximale + du travail .les heures supplémentaires effectuées dans + cette limite et seulement dans des cas exceptionnels + seront obligatoirement rémunérées comme telles et + récupérées en repos compensateurs. + _suppression des dérogations permanentes et du système + des équivalences. + _limitation de l'amplitude de la journée de travail. + + la formation et le perfectionnement professionnels .. + + § la rapidité de l'évolution technologique transforme + les conditions d'exercice de l'ensemble des professions. + la politique de concentration des entreprises contraint + les travailleurs à des reconversions profondes.la crise + aggravée du système capitaliste et la détérioration + de la situation de l'emploi rendent ces demandes + de conversion encore plus nombreuses et plus difficiles. + § les travailleurs formulent l'exigence légitime $: + _d'acquérir un savoir plus large,plus complet correspondant + à l'état présent des connaissances, + _de pouvoir se perfectionner afin d'être mieux garantis + dans leur emploi et d'accéder à une promotion réelle, + _de pouvoir se reconvertir à d'autres activités + professionnelles,avec le maintien,au minimum,de leur + niveau de qualification antérieure. + § résultat des luttes, l'*accord du 9 juillet 1970 a + ouvert aux travailleurs le droit à la formation.il a donné + également aux apprentis des garanties nouvelles.les lois du + 16 juillet 1971,malgré leurs insuffisances et leurs + aspects restrictifs ont dû confirmer ce droit et ces + garanties.cependant,la mise en application se heurte à + l'attitude négative du patronat et du gouvernement + qui entendent faire de ces textes des instruments au + service de leurs seuls intérêts. + § afin de permettre aux travailleurs du secteur privé + et du secteur public d'exercer ce droit et aux apprentis + de disposer des nouvelles garanties,la CGT préconise les + revendications suivantes : + + apprentissage .. + + § la situation des jeunes sous contrat d'*apprentissage doit + être améliorée par $: + _l'augmentation du minimum légal des rémunérations des + apprentis avec maintien du versement des allocations + familiales aux parents (rémunération égale à 40% du + SMIC pendant la durée du premier tiers + de l'apprentissage,60% durant le deuxième tiers,80% + pendant le troisième); + _l'application ,sans dérogation,de l'horaire annuel + de 360 heures dans les *centres de formation d'apprentis + (horaire porté progressivement à 400 heures); + _la garantie de recevoir dans l'entreprise une formation + pratique complète et préalablement définie; + _la reconnaissance du plein droit syndical. + § les *centres de formation d'apprentis doivent être + placés sous la tutelle et le contrôle directs de l'éducation + *nationale . + + formation professionnelle continue .. + + § cette formation est un droit ouvert à tous les travailleurs + des secteurs privé,public et nationalisé. + § pour assurer la formation continue des travailleurs,la + CGT pose les revendications suivantes : + _des mesures sociales doivent être prises concernant $: + _la généralisation et la simplification du maintien + de la rémunération des travailleurs en congé formation + ou des demandeurs d'emploi allant en stage, + _une protection sociale complète des stagiaires $: + _le remboursement intégral des frais de transport et + d'hébergement, + _la prise en charge intégrale par l'état ou l'entreprise + du coût des stages, + _les dispositions particulières permettant aux travailleuses + d'accéder sans discrimination à la formation et au + perfectionnement professionnels. + _ des opérations de mise à niveau sont nécessaires pour + certaines catégories dont l'accès à une formation et à une + qualification est freiné par l'insuffisance du niveau + de formation générale.ces opérations doivent relever + essentiellement de l'*éducation nationale et faire + l'objet d'un financement particulier. + § ces actions de mise à niveau sont particulièrement + nécessaires $: + _pour les femmes désirant prendre un emploi ou reprendre + une activité professionnelle après une interruption + pour raisons familiales;ces sessions de rattrapage doivent + être rémunérées; + _pour les travailleurs immigrés,afin de permettre le + développement de leur formation professionnelle et leur + promotion sociale $: les cours d'alphabétisation et d'apprentissage +du français doivent être généralisés,sur + le temps de travail et rémunérés comme tel.ces actions + doivent être à la charge de l'*état ,des employeurs et + des pays d'origine,sous la responsabilité de l'éducation + *nationale ,indépendamment des lois et des + accords relatifs à la formation professionnelle + continue; + _pour les jeunes sans formation professionnelle $: + _pour ceux qui sont sous contrat de travail,doit être + rendue effective l'application des dispositions législatives + prévoyant 200 heures de formation pendant le temps de travail + et avec le maintien intégral du salaire (ces 200 heures + devant être considérées comme un minimum), + _pour ceux qui sont sans travail,il faut développer et + améliorer les actions de préformation de l'*éducation + nationale et de l'AFPA,et revaloriser les indemnités + des stagiaires. + _un développement important de l'AFPA doit être + réalisé pour lui permettre de répondre sans délai + aux besoins de formation des demandeurs d'emploi et de + participer à la mise en oeuvre du congé formation, + y compris par la création de sections mobiles opérant hors + des centres,au plus près des travailleurs.l'accès des + femmes et des travailleurs immigrés dans toutes les + spécialités doit être rendu possible par des mesures + d'adaptation des *centres de l'AFPA.le libre + exercice du droit syndical doit être reconnu aux stagiaires de + l'AFPA. + _les établissements de l'*éducation nationale doivent + être systématiquement ouverts à la formation continue, + ce qui implique des moyens nouveaux et des structures + appropriées (dotation supplémentaire de crédits de + fonctionnement et d'équipement,création de postes d'enseignants +et d'autres personnels). + _la reconnaissance des diplômes,des connaissances + acquises et des niveaux de qualification atteints, + doit être assurée en s'appuyant sur l'inscription + désormais prévue dans les clauses obligatoires des + conventions collectives. + _dans le secteur public,le droit des personnels à la + formation doit s'exercer sans entrave. + _pour les non-titulaires de l'*état ,exclus jusque-là de la + formation continue,le droit doit être immédiatement + ouvert et les stages doivent avoir,parmi leurs objectifs, + de contribuer à la titularisation. + + financement .. + + § en ce qui concerne le financement,la CGT réaffirme + sa proposition d'un *fonds national de formation + et de perfectionnement,alimenté parallèlement par des + versements des employeurs et des crédits d'*état . + § ce *fonds serait soumis au contrôle syndical et + son institution est le seul moyen d'éviter les gaspillages. + § dans le système actuel,le taux de la participation + patronale à la formation continue doit être portée à 2% + du montant des salaires en 1976,comme le prévoit la loi + du 16 juillet 1971,que le gouvernement doit appliquer. + § la taxe d'apprentissage doit revenir au taux,antérieur à + 1972,de 0-6% des salaires. + + contrôle des organisations syndicales des travailleurs .. + + § le contrôle syndical doit être accru sur toutes les + actions de formation,aussi bien en ce qui concerne la + formation initiale que la formation continue.cela implique + le renforcement $: + _des prérogatives des représentants des travailleurs + dans toutes les instances traitant de la formation; + _des prérogatives des *comités d'entreprise ainsi que des + délégués du personnel en l'absence de *comité d'entreprise ; + _des moyens donnés à leurs membres et à ceux de la + *commission d'emploi et *formation professionnelle , + (crédit suffisant d'heures rémunérées). + + faire appliquer et élargir .. + + § la CGT engage ses organisations et l'ensemble + des travailleurs $: + _à exiger partout l'application intégrale des dispositions + contractuelles et légales,ce qui doit permettre + actuellement de faire bénéficier,au minimum,un travailleur + sur cinq d'un mois de formation,chaque année; + _à réclamer l'élargissement de ces dispositions, + notamment des clauses de l'accord interprofessionnel du + 9 juillet 1970 qui peuvent être améliorées à tous les + niveaux,notamment au plan des conventions collectives; + _à faire accélérer l'établissement des listes de stages + paritairement agréés sur des critères précis; + _à poursuivre l'action à tous les niveaux,et particulièrement + à celui des entreprises,pour obtenir les conditions et + les moyens nécessaires au plein exercice du droit au + congé formation. + + le respect de la vie des travailleurs .. + l'amélioration des conditions de travail .. + + § l'aggravation des conditions de travail se généralise.elle + atteint,sous des formes et à des degrés divers,toutes + les catégories de salariés $: ouvriers,employés,techniciens, + ingénieurs,cadres. + § l'emploi des techniques nouvelles au lieu d'alléger + la peine des hommes s'accompagne d'une accélération + des cadences,d'une tendance accentuée à la déqualification + du travail et à la parcellisation des tâches,du développement + du travail en continu,de l'inadaptation des locaux de + travail,de l'absence ou de l'insuffisance des moyens de + protection de la santé et de la sécurité.il en découle une + usure intensive des forces des travailleurs,une augmentation + importante du nombre et de la gravité des accidents et + maladies,situation qui contribue à aggraver l'insécurité de + l'emploi,de la classification et des ressources. + § les 28 millions de journées de travail perdues + annuellement pour incapacités temporaires traduisent les + conséquences extrêmement graves des conditions actuelles de + travail sur la santé et l'intégrité physique des travailleurs. + § les revendications de la CGT ont été présentées dans le + document adopté le 2 février 1972 par la *commission + exécutive et précisées en vue des négociations avec le + CNPF.elles tendent à réduire la pénibilité du travail, + à prémunir les travailleurs contre les exigences de + rendement accru,à s'opposer à la déqualification et à + la parcellisation extrême du travail,à obtenir une + protection efficace de la santé et de la sécurité des + travailleurs,à ouvrir des possibilités de promotion + professionnelle. + § leur satisfaction exige notamment $: + _l'affectation d'un pourcentage minimum des investissements + annuels à l'étude et à la réalisation de l'amélioration des + conditions de travail; + _la mise à la disposition des travailleurs,de leurs + représentants élus,des syndicats,des moyens d'information, + de contrôle,d'expression et d'intervention sur tous les + sujets concernant les conditions de travail,lesquels doivent + obligatoirement,sur demande des syndicats,faire l'objet + de négociations aux différents niveaux. + § outre la réduction de la durée du travail et l'augmentation +des effectifs,éléments essentiels de + l'amélioration des conditions de travail,la révision des + classifications,le droit à la formation et au + perfectionnement professionnels,qui trouvent sur ce plan + une justification particulière,la CGT défend les + revendications suivantes : + + § charge de travail .. + + la charge de travail physique ou intellectuelle doit + être ramenée ou contenue dans des limites n'entrainant + pas une fatigue excessive pour le travailleur. + les cadences de travail notamment doivent être limitées + ou réduites en conséquence. + ce résultat peut être obtenu par $: + _l'accroissement des effectifs,lesquels doivent tenir + compte notamment des absences probables, + _la limitation du nombre de pièces à produire ou d'opérations + à réaliser, + _la réduction du nombre de machines ou d'appareils à + conduire ou à surveiller, + _la réduction de la vitesse de la chaîne, + _l'affichage dans les ateliers ou services des temps + alloués,de la vitesse de la chaîne,des effectifs occupés, + de la définition des opérations à effectuer sur chaque + poste de travail ou du nombre de machines ou d'appareils + à conduire ou à surveiller doit être rendu obligatoire; + _toute modification ayant pour effet d'accroître la charge + de travail individuelle doit être interdite; + _les délégués syndicaux,du personnel et du CE,les + travailleurs concernés,doivent être informés au préalable + et consultés sur toutes modifications du processus de travail. + + § organisation du temps de travail .. + + _temps de repos payés en cours de journée,avec arrêt + effectif,le cas échéant,de la machine ou des appareils ou + de la chaîne; + _mise en place,pour les travaux sur chaîne,de remplaçants + en nombre suffisant pour permettre des arrêts individuels; + _temps de repos supplémentaires pour les femmes enceintes + et allongement à 18 semaines du congé légal de maternité; + _installation de salles de repos à proximité des lieux + de travail; + _pour les travailleurs en équipes $: allongement du temps + de pause payé et paiement,comme temps de travail,du temps + total de présence dans l'entreprise; + _limitation du travail en continu et en semi-continu + aux seuls postes de travail où existent réellement des + impératifs techniques; + _compensation pour les travailleurs postés en continu + ou semi-continu,des conséquences de cette forme de travail + par $: + l'abaissement de la durée du travail en dessous de + 40 heures par $: + l'introduction d'une cinquième équipe (continu) ou d'une +quatrième équipe (semi-continu), + l'avancement de l'âge de la retraite, + l'allongement des congés payés; + _organisation des systèmes de rotation des postes par + discussion entre la direction et les organisations + syndicales et avec l'accord des intéressés; + _pour les travaux particulièrement éprouvants ou + comportant des risques pour la santé,changement de poste + en cours de journée,avec maintien du salaire et + renforcement de la surveillance médicale; + _préalablement à toute application des horaires variables + ou du travail à temps partiel,établissement de garanties + portant notamment sur les avantages acquis et l'exercice + des droits syndicaux,ces garanties devant faire l'objet + de négociations avec les organisations syndicales. + + formation et promotion professionnelles .. + + § la lutte contre les effets du caractère épuisant et + asservissant du travail comporte l'exigence du droit + à la formation et à la promotion pour tout travailleur, + du manoeuvre à l'ingénieur,selon les aptitudes et + capacités de chacun. + § ce qui implique $: + _la modification de l'organisation du travail de façon + à en diminuer la pénibilité,à en réduire la parcellisation et + à en augmenter l'intérêt et le degré de qualification; + _la possibilité pour tous les ouvriers spécialisés + qui en feront la demande de changer de poste de travail, + après un an d'ancienneté,afin d'étendre leur expérience + ou d'acquérir une polyvalence donnant accès à une + qualification supérieure; + _des dispositions particulières pour favoriser l'accès + à une formation de base des travailleurs et travailleuses + n'en ayant pas reçue; + _la garantie pour tous les travailleurs de pouvoir + franchir,au bénéfice de l'expérience et de l'enrichissement + de leurs connaissances,les échelons dans la hiérarchie + des classifications et des salaires,leur assurant ainsi + une carrière normale. + + rôle de l'encadrement .. + + § il importe qu'en matière de conditions de travail,les + ingénieurs,cadres,techniciens et agents de maîtrise + aient toutes possibilités de donner leur avis sur le + plan professionnel,même lorsqu'il est en opposition avec + l'orientation officielle de l'entreprise,ce qui suppose $: + d'une part,les modalités d'application des garanties + collectives,les protégeant contre les pressions de leurs + employeurs, + d'autre part,les garanties liées à leurs responsabilités + sur les conditions de travail des autres salariés et + d'en fixer les limites. + + sécurité des personnes .. + + § sécurité des travailleurs assurant les paiements, + encaissements et transports de fonds. + § toutes dispositions matérielles doivent être prises + pour prémunir les travailleurs concernés contre les + risques d'agressions. + § les effectifs de personnel,en particulier,doivent être + en nombre suffisant. + + l'hygiène et la sécurité du travail .. + + § liée étroitement aux problèmes posés par les conditions + de travail,l'amélioration des conditions d'hygiène et + de sécurité implique en tout premier lieu que la + réglementation existante soit strictement appliquée + sur tous les lieux de travail,qu'elle soit adaptée aux + conditions et exigences actuelles et qu'elle évolue + constamment en fonction des conditions et exigences + nouvelles. + § les dispositions et l'action,en matière d'hygiène et + sécurité,doivent avoir avant tout un caractère préventif, + ce qui suppose notamment que la sécurité soit intégrée + dès le stade de l'élaboration des projets de construction, + de la mise au point des méthodes de travail,de la + conception et des études de machines,locaux,produits + et processus de fabrication. + § les organisations syndicales,les comités d'entreprises, + les délégués du personnel ont pleine compétence pour + l'ensemble de ces problèmes touchant aux conditions de + travail.les *comités d'hygiène et de sécurité ont un + rôle particulièrement important. + + comité hygiène et sécurité .. + + § à cet égard,leur efficacité doit être renforcée par les + dispositions suivantes : + § _institution de *comités d'hygiène et de sécurité dans + toutes les entreprises et établissements industriels et + commerciaux du secteur privé,comme des secteurs public et + nationalisé.leurs membres doivent disposer de pouvoirs + réels,notamment celui d'obtenir l'interruption du travail dans + tous les cas où celui-ci présente un caractère dangereux + et de saisir les juridictions compétentes. + § la liberté de circulation doit leur être garantie + dans tous les lieux de travail.ils doivent disposer du + temps nécessaire pour l'accomplissement de leur mission + et en toute hypothèse d'un minimum au moins égal au crédit + d'heures des délégués du personnel. + § _les membres des *comités d'hygiène et de sécurité + doivent être élus par l'ensemble des salariés concernés. + ils doivent bénéficier d'une protection identique + à celle des délégués du personnel dans toutes les + entreprises.le secrétaire du *comité d'hygiène et de sécurité + doit être un représentant des travailleurs désigné + par les membres élus du *comité d'hygiène et de sécurité. + § _le *comité d'hygiène et de sécurité a compétence + pour l'ensemble du personnel travaillant dans l'entreprise + qui comprend également le personnel intérimaire et + intermittent. + § la responsabilité juridique en matière d'accidents du + travail ou de maladies professionnelles incombe + exclusivement à l'employeur.elle ne peut en aucun cas + être imputée au personnel d'encadrement. + § outre les conditions qui leur sont faites,les ingénieurs, + cadres,techniciens et agents de maîtrise jouent un rôle + important dans le développement de la sécurité au sein + de l'entreprise.ils doivent pouvoir travailler en liaison avec + le médecin du travail et l'ingénieur de sécurité et + avoir connaissance de toutes les remarques des CHS,ainsi + que des autres représentants des salariés et des organisations + syndicales. + § toutes dispositions,telles que le contrôle médical + organisé à l'initiative des employeurs,tendant à exercer + une pression sur les salariés malades ou accidentés, + en vue de leur imposer une reprise prématurée du travail, + sont vigoureusement combattues par la CGT et doivent + être interdites. + § les consignes de sécurité doivent être adaptées et + traduites dans leur langue maternelle pour les travailleurs + immigrés. + § des stages d'information sur les questions relatives à la + sécurité doivent être organisés pour les travailleurs + nouvellement embauchés,le temps passé à ces stages étant + considéré comme temps de travail et payé comme tel, + sans imputation sur le temps du congé formation + professionnelle ni sur les fonds dévolus à celle-ci. + § la compétence du *comité d'hygiène et sécurité + doit s'étendre sans restriction aux problèmes de la + pollution $: toutes dispositions seront prises pour qu'il + puisse veiller au respect des normes nationales ou + internationales concernant le bruit et la teneur + en produits nocifs non seulement de l'atmosphère des + ateliers mais aussi des gaz,liquides et solides rejetés + par l'entreprise. + § dans ce domaine,la CGT dénonce vigoureusement le + chantage exercé sous la forme des faux dilemnes $: + usine insalubre (ou polluante) ou fermeture (ou non + installation). + + médecine du travail .. + + § la médecine du travail est un élément important du + système de protection de l'homme sur le lieu de travail. + § il convient d'établir avec l'ensemble des parties + intéressées un statut du médecin du travail. + § ce statut devra notamment fixer les conditions de + rémunération et définir une protection qui assurent au médecin + du travail une indépendance totale à l'égard de l'employeur. + _détermination du nombre des vacations du médecin + du travail de telle sorte que le tiers de son temps + lui permette réellement de remplir les tâches qui sont + les siennes en matière de prévention de la pathologie du + travail,connaissance des conditions concrètes de réalisation + du travail,recherche des moyens d'améliorer l'hygiène + et la sécurité. + _modification du décret du 13 juin 1969,notamment + en ce qui concerne la gestion des services médicaux + interentreprises.les représentants élus des établissements + concernés,ainsi que ceux des organisations syndicales + représentatives doivent participer de plein droit à la gestion + des centres médicaux interentreprises,ce qui implique $: + _que leur représentation au sein du *conseil d'administration + soit assurée dans des conditions leur permettant une + intervention effective dans les décisions et sur l'activité + des centres; + _qu'ils disposent du temps,des possibilités de déplacement + et des moyens d'information nécessaires à l'accomplissement + de leur mandat,l'indemnisation du temps passé étant + assumée par les employeurs. + § le médecin du travail sera obligatoirement consulté + pour toutes les questions relevant des conditions de + travail,de la prévention,de l'hygiène et de la sécurité + du travail. + + les comités techniques régionaux et nationaux .. + + § de par leurs attributions,les *comités techniques + régionaux et nationaux peuvent prendre des mesures + comblant le retard de la réglementation sur le + développement des sciences et des techniques influençant les + conditions de travail,de prévention,d'hygiène et de sécurité. + § les conditions actuelles de composition et de fonctionnement + des *comités techniques régionaux ne leur permettent pas + de jouer correctement et pleinement leur rôle.il est + nécessaire d'imposer $: + _l'augmentation du nombre de *comités techniques régionaux et + le regroupement des activités professionnelles tout en + assurant aux représentants salariés le temps et les + moyens d'assurer leur mandat. + + dispositions législatives .. + + § la CGT demande que tous les produits présentant + un danger de quelque nature que ce soit avant d'être + utilisés dans l'industrie,soient subordonnés à un visa + délivré par un organisme national compétent dont il + convient de débattre avec les *pouvoirs publics.le même + organisme devrait être chargé de déterminer des normes + nationales fixant la teneur maximale tolérable de + l'atmosphère des lieux de travail en substances + nuisibles,ainsi que les limites du bruit et de la + radioactivité. + § ces dispositions s'appliquent aux produits actuellement + en usage qui entraînent des conséquences nuisibles pour + la santé. + _création d'une sous-commission au sein de la + *commission d'hygiène industrielle chargée d'établir, + de tenir à jour et de communiquer les listes de + substances et agents cancérigènes à interdire dans la + production,à contrôler ou à soumettre à autorisation avant + utilisation. + _établir pour chaque travailleur exposé à des substances + et agents cancérigènes ou autres substances nocives, + un livret médical mentionnant les produits dangereux + avec lesquels il est en contact durant sa carrière. + _la CGT demande,en outre,le renforcement du corps de + l'*inspection du travail et de l'*inspection médicale + qui devraient être dotés de pouvoirs accrus en matière + de contrôle et de sanction à l'encontre des employeurs + violant les règles de sécurité. + + les droits et libertés des travailleurs .. + les droits .. + + § l'action de classe a libéré le travailleur d'un certain + nombre de contraintes imposées par le patronat + dans l'entreprise capitaliste,et lui a permis de conquérir + certains droits. + § sans perdre de vue que ces contraintes ont leur origine + dans l'exploitation capitaliste et que seule la suppression + de celle-ci permettra leur disparition complète, + sans perdre de vue également que des prétendus nouveaux + "droits" suggérés ou offerts (telle "la participation" + sous ses diverses formes),visent en fait à l'intégration + du travailleur dans le système et constituent par là même + une duperie,il est possible et nécessaire d'élargir + les droits existants. + § la CGT entend promouvoir aussi bien les droits + des travailleurs pris individuellement que les droits de + la collectivité des travailleurs,représentés par le + syndicat et les diverses institutions existantes ou à + créer,y compris dans les petites entreprises. + § dans cet esprit,elle oeuvre pour une législation + interdisant aux employeurs de demander au personnel d'encadrement +d'exercer sur les travailleurs des pressions + directes ou indirectes non relatives à l'accomplissement + de l'activité professionnelle. + + § la CGT réclame concernant .. + information .. + + _droit pour le travailleur d'être préalablement informé, + avant toute décision,de toute mesure le concernant + (qu'il s'agisse de la détermination de ses conditions + de travail,de modification à son contrat de travail, + de sanctions,y compris le licenciement $...); + _droit de débattre (assisté s'il le désire d'un délégué + syndical ou d'un délégué du personnel) avec la direction + des intentions de cette dernière à son égard; + _toute mesure prise en violation de ces droits,comme + toute disposition dont les motivations seraient reconnues + inexactes,doivent entraîner leur annulation. + + promotion .. + + _droit effectif à la promotion par la priorité absolue + donnée aux travailleurs de l'entreprise en cas de poste + d'une qualification à pourvoir. + + rémunérations .. + + _droit pour chacun à la connaissance des salaires de + tous les membres du personnel de l'entreprise. + + règlement intérieur .. + + _suppression du règlement intérieur dans sa conception + actuelle qui permet à l'employeur d'édicter souverainement + des sanctions et de se rendre ainsi justice à lui-même + par la voie de décisions unilatérales. + + information économique,consultation,contrôle .. + + _droit à l'information à la consultation et au contrôle + sur tout ce qui concerne l'activité de l'entreprise,en + priorité absolue par le canal des représentants du + personnel.cette pratique permettant d'analyser l'information + et de combattre,le cas échéant,tout caractère de mise en + condition. + _mise en place des *comités d'entreprise de tous les + éléments d'informations économiques,en particulier $: + _tous les documents permettant une connaissance approfondie + et véridique des éléments comptables de la gestion passée + et d'avenir au niveau de l'entreprise,du groupe,de la + branche d'industrie sur le plan national et international. + ces documents doivent être fournis dans toutes les + sociétés quelle qu'en soit leur forme juridique. + _toutes les informations relatives au travail et la + gestion du personnel. + _suppression de toute obligation de discrétion dans + l'information économique. + _droit à l'assistance d'un expert-comptable dans toutes + les sociétés et pouvant être choisi en tout lieu. + _dotation des *comités d'entreprise en moyens matériels + et financiers leur permettant l'étude des questions + économiques. + _mise en place de *comités centraux de groupes . + + information syndicale .. + + _droit à un temps suffisant selon les besoins constatés + dans chaque entreprise _et en aucun cas,inférieur à + une heure par mois_pris sur le temps de travail et payé + comme tel,pour participer à des réunions organisées par les + syndicats,dans des locaux mis à leur disposition par + l'entreprise. + + représentation .. + + _dans les grandes entreprises et dans celles où la nature du + travail aboutit à la dispersion des salariés ou à leur + rotation en équipes successives,augmentation du nombre des + délégués du personnel,des membres du *comité d'entreprise + et du nombre des délégués au CHS. + § la CGT combat les tentatives répétées du patronat + et du pouvoir,de mettre en place des organisations de + collaboration de classe n'ayant de syndicales que le nom + telle par exemple la CFT. + § elle rappelle que l'une des garanties essentielles + de la liberté syndicale réside dans le droit pour les + seules organisations syndicales représentatives de + présenter des candidatures au premier tour des élections + professionnelles.afin de renforcer ce droit et pour déjouer + les manoeuvres patronales la CGT réclame $: + _un contrôle plus strict et une aggravation des pénalités + encourues par les employeurs portant atteinte à la + liberté de vote; + _l'abrogation des dispositions légales,telles celles relatives + aux *comités centraux d'entreprises,qui déforment + la représentation proportionnelle à l'entreprise; + _que seules les organisations syndicales représentatives + soient habilitées à présenter des candidatures y compris + au deuxième tour des élections quand celui-ci s'avère + nécessaire; + _que les candidats soient élus dans l'ordre de présentation + de la liste. + § la CGT demande également que la représentation + des organisations syndicales dans les organismes + paritaires,tripartites ou de caractère officiel,soit établie + proportionnellement à l'influence réelle de chacune d'elle, + et soit réservée aux seules organisations représentatives à + l'exclusion de toute autre;qu'en conséquence il soit procédé + à l'éviction des organisations telles que la CFT. + + les libertés .. + libertés syndicales .. + + § amélioration et extension des dispositions de la loi du + 27 décembre 1968,soit $: + _reconnaissance de l'organisation syndicale et des + conséquences légales de cette reconnaissance dans tous + les établissements et entreprises quel que soit l'effectif + du personnel; + _reconnaissance de la représentation spécifique de + toutes les organisations représentatives d'ingénieurs,cadres + et techniciens; + _révision des textes législatifs ou réglementaires + restreignant le rôle des organisations syndicales de + salariés; + _libre accès et liberté de circulation en tout lieu + de l'entreprise et à tout moment,aux délégués élus,aux + délégués et représentants syndicaux; + _possibilité pour les délégués représentants locaux + régionaux ou nationaux des organisations syndicales + représentatives d'avoir accès dans les entreprises pour + y rencontrer les travailleurs, y compris là où n'existe + pas d'organisation syndicale; + _collecte des cotisations et diffusion des publications + syndicales sur les lieux et pendant les heures de travail. + § mise à la disposition des organisations syndicales d'un + contingent d'heures nécessaires à leur fonctionnement + attribué proportionnellement à leur influence telle + qu'elle ressort des élections professionnelles. + + protection .. + + § interdiction et nullité du licenciement et de toutes + les formes de répression patronale visant les élus + et représentants du personnel,les salariés exerçant un mandat + ou une fonction confiés par l'organisation syndicale ou + exercé en son nom,et,tout salarié en raison de ses + opinions,croyances ou appartenance à une organisation + syndicale ou à un parti ou prononcé en violation des + droits et libertés syndicales. + + mandat syndical .. + + § droit inconditionnel pour tout salarié à l'exercice d'un + mandat électif et de délégué syndical,cela exige que + la charge de travail de l'intéressé soit diminuée + dans la même proportion que le temps qu'il doit consacrer + à son travail ou qu'il soit remplacé pendant l'exercice + de ses fonctions.cela exige également que les + dispositions soient prises pour que l'élu des travailleurs + puisse continuer à exercer son activité professionnelle. + § éligibilité pour les travailleurs immigrés dans les mêmes + conditions que celles s'appliquant aux travailleurs + français,et levée de toutes restrictions concernant leur + accès aux responsabilités de représentation,de direction + et d'administration des organisations syndicales. + + grève .. + + § abrogation de toutes les restrictions à l'exercice du + droit de grève,y compris celle résultant de l'utilisation + abusive de la notion de "liberté du travail". + § interdiction de toute retenue sur le salaire ou les primes + excédant le prorata de la durée de la grève. + § interdiction du lock-out,qu'il soit ou non camouflé sous + l'appellation de chômage technique. + + libertés et informatique .. + + § en cas d'établissement de fichiers de renseignements, + notamment informatisés par des services administratifs + publics ou privés,qu'il soit interdit de recueillir et de + mémoriser des informations sans rapport direct avec l'objet + spécifique du fichier,et en particulier des données + ou appréciations susceptibles de nuire au travailleur + dans sa vie professionnelle ou de porter entrave + à l'exercice des libertés individuelles ou collectives + dont il est en droit de se réclamer. + § institution de système de contrôle permettant de veiller + à la stricte application et au respect du principe + énoncé ci-dessus. + + l'éducation syndicale .. + + § étant donné le rôle et les responsabilités des syndicats + dans la société moderne,l'éducation syndicale est un + élément de l'éducation dans son ensemble. + § son développement pose de nombreux problèmes au premier + rang desquels le financement de ces activités et + l'amélioration du congé éducation. + § s'agissant du financement,la CGT estime qu'en premier + lieu le patronat doit prendre en charge le paiement + de la perte de salaire qu'entraîne l'utilisation des + congés éducation.les comités d'entreprise versant,quant + à eux,des bourses d'études aux bénéficiaires des congés + éducation,bourses d'un montant suffisant pour couvrir les + frais de séjour et les voyages des intéressés.plus + globalement enfin,la subvention annuelle du *ministère + du travail doit connaître une augmentation notable + pour tenir compte de l'augmentation des charges,du + développement important de l'ensemble des réalisations + éducatives de la CGT,ainsi que de sa représentativité + réelle. + § s'agissant du congé éducation,des modifications + réglementaires doivent intervenir pour le fractionnement + de ce congé,pour l'augmentation du nombre des bénéficiaires, + notamment dans les grandes entreprises,et,enfin,pour + l'octroi aux centrales syndicales les plus représentatives + et proportionnellement à leur représentativité,d'un + contingent annuel de congés éducation de longue durée + pour répondre aux besoins des éducateurs et à la nécessité de + renforcer les stages de niveau supérieur. + + la législation du travail .. + + § l'application et le respect des droits des travailleurs + à l'entreprise nécessitent que les instances responsables + de la législation sociale disposent de moyens de contrôle et + de réparation suffisants et adaptés. + § en effet,les violations des droits des travailleurs + prennent un aspect intolérable,du fait même de leur + fréquence et de leur gravité,et appellent un certain nombre + de réformes qui,au jugement de la CGT,devraient + comporter les points suivants : + + § inspection du travail .. + + _augmentation sensible du nombre des inspecteurs et + contrôleurs du travail qui devrait être doublé. + _accroissement de leurs pouvoirs d'intervention,de contrôle et + de sanction à l'encontre des employeurs,notamment par la + possibilité d'intervenir devant toutes les instances + compétentes,le droit de faire arrêter les machines en + cas de danger flagrant et le droit de convoquer tout + témoin. + _extension de leur compétence à toutes les professions + et à tous les secteurs d'activité. + _institution de délégués salariés à l'inspection du travail, + élus par les travailleurs et dotés des attributions et des + pouvoirs nécessaires à l'accomplissement de leur tâche de + contrôle dans les entreprises,de répression et de sanction + des violations de la loi. + + § juridiction prudhomale .. + + _création obligatoire de *conseils de prudhommes dans + tous les centres importants et couvrant tout le + territoire national. + _extension sans exception de la juridiction prudhomale à + tous les travailleurs ne relevant pas de la fonction + publique. + _accès à l'électorat et à l'éligibilité de tous les + travailleurs sans distinction de nationalité. + _élection des conseillers prudhommes un jour ouvrable, + pendant le temps de travail,au scrutin proportionnel sur + des listes présentées par les organisations syndicales + les plus représentatives. + _suppression des sections et catégories en tant que telles, + et liberté d'organisation interne des conseils en sections + professionnelles ou chambres selon leurs besoins particuliers. + _gratuité,accélération et simplification de la procédure + prudhomale. + _prise en charge par l'*état ,au titre du *ministère de + la justice ,de la création et du fonctionnement des + *conseils de prudhommes et de l'attribution d'une + subvention spéciale aux organisations syndicales + pour la formation de leurs conseillers prudhommes. + _élargissement de la compétence des *conseils de + prudhommes aux conflits collectifs d'ordre juridique; + institution d'un véritable référé prudhomal. + _établissement d'un statut de conseiller prudhomme + garantissant le libre exercice de son activité et sa + couverture contre tout préjudice,de quelque ordre qu'il + puisse être. + + code du travail .. + + § une réforme profonde de la législation sociale s'impose + pour la débarrasser des conceptions antisociales + héritées du *code Napoléon .un *code du travail moderne + doit élargir et garantir efficacement les droits des + travailleurs dans les conditions actuelles de l'exploitation +capitaliste. + + les conventions collectives .. + + § la garantie des droits collectifs et des revendications, + imposée par l'action syndicale,nécessite des *conventions + collectives efficaces. + § trop souvent,ces conventions sont vidées de leur + contenu,notamment en ce qui concerne les salaires. + dans de nombreux cas,elles sont même inexistantes. + § la CGT lutte pour de véritables conventions collectives $: + _la négociation des conventions collectives,avenants + et accords paritaires,doit être ouverte obligatoirement à + toutes les *organisations syndicales représentatives; + _les conventions collectives,avenants et accords + paritaires ne doivent s'appliquer que s'ils sont signés + par des organisations syndicales représentatives représentant + ensemble la majorité des travailleurs concernés; +_tous les travailleurs d'une même branche du manoeuvre + à l'ingénieur doivent être couverts par une convention + collective unique,comportant des avenants traitant + les questions spécifiques qui concernent les diverses + catégories.cela implique l'extension automatique + de chaque convention à toutes les entreprises d'une + profession déterminée; + _les problèmes généraux intéressant l'ensemble des + salariés doivent être réglés par des accords + interprofessionnels.des conventions collectives + nationales doivent couvrir toutes les branches et + régler les problèmes d'ensemble du secteur professionnel; + _les accords et conventions d'entreprises doivent être + considérés comme des compléments aux accords nationaux + ou aux conventions collectives nationales,leur objet + étant de les adapter et de les améliorer; + _accélération de la procédure d'extension des conventions + collectives et accords,la décision devant être rendue + dans un délai maximum de trois mois à dater du dépôt de la + demande d'extension. + § pour répondre pleinement à la protection qu'elle doit + apporter aux travailleurs,toute convention collective doit + couvrir dans ses dispositions l'ensemble des problèmes + soulevés par l'exercice de la profession,dans le sens + des revendications définies par le présent programme. + tout particulièrement,elle doit assurer une véritable garantie + des salaires. + § la CGT s'oppose à toute disposition visant à limiter + les droits syndicaux et le droit de grève,et refuse + toute clause se référant à des conceptions de collaboration + de classes. + § conclue à la fois en fonction des conditions économiques + sociales et politiques et du rapport des forces entre + les salariés et le patronat existant au moment de la + signature,la convention collective représente un + avantage minimum pour tous,qui ne saurait être considéré comme + immuable. + § son contenu doit être amélioré en tenant compte des + besoins nouveaux et de l'évolution du rapport des forces + en présence. + § aussi une action de caractère permanent est elle + nécessaire pour assurer l'application correcte des + avantages acquis et les préserver de toute atteinte, + et conquérir des avantages et des droits nouveaux. + § sur la base des principes énoncés ci-dessus,la CGT + réclame l'ouverture rapide,dans toutes les branches, + de négociations aux fins de conclure des conventions + collectives nationales,ou,le cas échéant,de mettre à + jour et d'améliorer celles qui existent. + + les statuts .. + + § les statuts des personnels sont le résultat des luttes + nombreuses des organisations syndicales pour obtenir + l'établissement de garanties.ils ont été acquis + ou améliorés à l'occasion d'un rapport de forces + favorable à l'ensemble de la classe ouvrière,notamment + lors de la libération de notre pays avec le progrès du + mouvement démocratique. + § la prise en considération des revendications générales + de la CGT constitue un élément important de la lutte + pour la sauvegarde et l'amélioration des garanties statutaires + mises en cause par la politique du pouvoir visant à + favoriser les monopoles. + § cette politique a les plus lourdes conséquences dans le + secteur public $: + _compression maximum des dépenses de fonctionnement + au détriment des conditions de vie et de travail des + personnels et de la qualité de service rendu aux + usagers; + _transferts de plus en plus nombreux et variés des + activités publiques rentables vers le secteur privé + et démantèlement des services publics,utilisation de + personnels hors statuts pour certains secteurs d'activité. + § cela s'accompagne d'attaques constantes,ouvertes ou + insidieuses contre les statuts des personnels.sous + couvert de réformes,d'adaptation ou de réorganisation, + l'objectif final est de remettre en cause les avantages + acquis dans tous les domaines. + § ainsi,défense du service public,défense et amélioration + des garanties statutaires sont étroitement liées. + § cette action reste une préoccupation importante de la + CGT. + + respect des garanties acquises .. + + § la CGT lutte pour le respect intégral des garanties + acquises et le rétablissement de celles qui ont été + remises en cause.elle exige notamment $: + _l'extension du rôle et de la compétence des organismes + paritaires de la *fonction publique (commissions + administratives,comités techniques,*conseil supérieur + de la *fonction publique )et des *comités mixtes du + secteur nationalisé; + _leur consultation obligatoire; + _l'amélioration de leur fonctionnement dans le sens d'un + développement de prérogatives des représentants des + personnels et des facilités nécessaires à l'exercice de + leur mandat. + § la CGT exige que soit mis un terme au recrutement + de personnel auxiliaire ou hors statut $: + _les auxiliaires doivent être titularisés; + _les personnels écartés du bénéfice des droits statutaires + doivent être intégrés dans le cadre du statut; + _les situations particulières pouvant justifier le recrutement + de personnel sous contrat doivent être déterminées en accord + avec les organisations syndicales.dans ce cas,des garanties + équivalentes à celles des personnels à statut doivent + être accordées à ces personnels.des règles similaires seront + appliquées aux personnels des entreprises assurant une + concession de service public. + + garanties nouvelles .. + + § des garanties fondamentales nouvelles doivent être + obtenues,notamment en ce qui concerne $: + _ les modalités de négociations afin de respecter les + prérogatives syndicales.à ce sujet $: + _les représentants du gouvernement ou des directions + nationales doivent avoir réellement le pouvoir de négocier + et de traiter sans être enfermés dans les limites + de décisions prises au préalable et arbitrairement; + _la référence à des instruments dont le gouvernement + possède le contrôle exclusif (indice officiel des prix) + ou à des formules liées à la productivité,à l'évolution + des recettes,ou à la production doit être exclue; + _les réformes de caractère fondamental,ou les mesures + de caractère pluriannuel doivent être négociées en dehors + des discussions salariales annuelles; + _les organisations syndicales représentatives doivent + être associées à toutes les discussions intéressant + les travailleurs dont elles ont mission de défendre les + intérêts,qu'elles soient ou non signataires des accords. + § les droits syndicaux,les prérogatives des organisations + syndicales dans l'entreprise,l'établissement ou le service, + en particulier pour ce qui concerne le temps et les moyens + des élus,doivent être respectés et étendus. + § les comités d'entreprise ou organismes similaires + financés par les administrations ou les directions et + gérés par les représentants élus du personnel doivent + être créés dans tous les secteurs .là où ils existent,les + droits des travailleurs dans la gestion doivent être + étendus. + + la formation et le développement de l'homme .. + l'enseignement et l'éducation permanente .. + + § la CGT attache la plus grande importance à la + formation des hommes.l'acquisition des connaissances + pour tous et au niveau le plus élevé,en fonction des aptitudes + de chacun,commande largement le développement du progrès + scientifique,technique,économique,social et culturel. + § il est un facteur important du développement de la + démocratie. + § l'éducation des enfants et des jeunes doit viser tout + à la fois à l'épanouissement de l'individu,à son insertion + dans la société pour qu'il soit utile à la collectivité + nationale,à sa préparation au rôle de citoyen + responsable. + § une telle formation étalée de l'école maternelle à + l'enseignement du second degré et à l'enseignement + supérieur,doit se prolonger au cours de la vie active + par le moyen d'une éducation permanente ouverte à tous + les champs de la connaissance. + § le *pouvoir en place ne permet pas la réalisation + d'un tel objectif. + § le système éducatif actuel est conçu à partir des + besoins des couches dominantes.il limite les connaissances + au minimum requis pour assurer le profit.il freine la + recherche scientifique et l'asservit au patronat.il + perpétue la ségrégation sociale.il diffuse largement + l'idéologie de la classe au pouvoir. + § les réformes successives entreprises depuis 15 ans + _même si elles doivent tenir compte de la pression + populaire_ recherchent les adaptations que nécessitent l'évolution +des techniques et surtout la crise du + capitalisme. + § la crise de l'école française,la pauvreté de ses moyens, + les jeunes,les étudiants diplômés sans emploi,sont des + reflets de la crise du capitalisme dans notre pays. + § la CGT estime qu'un autre système éducatif réaliste, + progressiste,inspiré de la réforme Langevin-Wallon + doit être mis en place. + § il donnerait aux jeunes tout à la fois la possibilité de + s'instruire sans autre limitation que celle des + aptitudes et celle d'utiliser leur savoir dans des + emplois rendus disponibles par le renouveau économique. + § il effacerait largement les discriminations nées + des différences de situation de fortune et aussi de race en + permettant notamment aux immigrés et à leurs enfants + d'apprendre leur langue maternelle et de mieux connaître + la culture du pays d'origine et du pays de travail. + § il rétablirait l'égalité entre la formation des hommes + et des femmes. + § il se prolongerait dans une véritable formation continue, + assurant notamment l'entretien et le perfectionnement + professionnels,qu'un enseignement technique rénové + et développé rendrait possible et efficace. + § ainsi serait assuré,dans le cadre d'une éducation + nationale laïque,unifiée associant les maîtres et les + utilisateurs,un développement réel d'un enseignement + de qualité,effectué par des maîtres qualifiés et + rémunérés en conséquence. + § la CGT continuera de se battre pour un tel projet, + solution réaliste et globale à la crise de l'enseignement. + § d'ores et déjà,sans attendre une réforme complète du + système éducatif,un certain nombre de revendications peuvent + être satisfaites. + § le développement à l'école maternelle pour tous en milieu + rural et urbain,en s'opposant à tout "plan" qui tendrait + à dénaturer le caractère éducatif et social de cet + enseignement. + § la rénovation de l'école élémentaire dans son contenu + et son fonctionnement et assurant notamment la réduction + des effectifs par classe et la formation élevée et le + perfectionnement des maîtres. + § le respect intégral de la loi sur la scolarisation + obligatoire jusqu'à 16 ans en garantissant à chaque jeune + une formation complète dans les structures de l'éducation + *nationale . + une telle exigence implique l'abrogation des articles + 56 et 57 de la *loi Royer ,l'abandon des formules de + cloisonnement structurel ou pédagogique conduisant + des élèves à des impasses dramatiques.elle implique + également des actions de rattrapage des retards + scolaires. + § la mise en oeuvre d'un enseignement secondaire de valeur, + associant aux connaissances scientifiques et littéraires + fondamentales,l'éducation civique et morale,l'initiation + à la technologie et à l'économie,l'éducation artistique + et la formation physique. + § un tel enseignement,sanctionné par un baccalauréat doit + s'ouvrir librement et sans discrimination vers les + enseignements supérieurs,ou vers l'exercice d'un métier. + § l'expansion sans précédent d'un enseignement technique + public,ouvert également aux garçons et aux filles, + rénové,moderne,diversifié,favorisant l'épanouissement + des jeunes,leur donnant les bases fondamentales des + adaptations ultérieures,les préparant concrètement à + l'emploi.cela implique $: + _d'assurer le développement des moyens d'accueil,de + fonctionnement,d'orientation et d'enseignement des jeunes, + garçons et filles,en fonction des besoins réels de + l'économie et de la société; + _de supprimer tous les moyens et toutes les structures + ségrégatives,empêchant un recrutement normal dans les + collèges d'enseignement technique; + _de procéder à l'aménagement des structures de l'enseignement +technologique pour permettre $: + _la mise à niveau des jeunes,garçons et filles,victimes + de handicaps scolaires, + _la diversification des formations, + _l'accès facilité vers des formations supérieures ; + _de prendre des mesures incitatives pour faire venir + vers l'enseignement technologique un grand nombre de + jeunes; + _de réaliser une rénovation totale de l'enseignement + technique,la promotion de ses enseignants et leur + perfectionnement continu. + § la suppression des barrages ségrégatifs et l'accès + des étudiants à un enseignement supérieur de haut niveau, + en assurant la liaison entre l'enseignement et la recherche + dans les *universités ,et en étendant les moyens de la + recherche. + § en conquérant le droit à la formation et le congé + éducation les travailleurs ont réalisé un important + progrès.la CGT exige que ce droit soit pleinement + respecté et que la formation continue s'élargisse à tous + les besoins professionnels et culturels des salariés. + § elle estime que l'*éducation nationale doit être le + maître d'oeuvre principal d'une telle politique, + notamment en créant auprès de chaque établissement + public des départements de formation continue animés + par des enseignants préparés en conséquence. + § pour la réalisation de ces mesures,la CGT demande + la mise à la disposition de l'*éducation nationale des + moyens nécessaires permettant $: + _de construire et d'équiper convenablement,et en toute + sécurité,les écoles de tous niveaux; + _de recruter,de former et de perfectionner les maîtres, + de résorber l'auxilariat; + _d'assurer aux familles et aux jeunes l'aide sociale + nécessaire sous forme de bourses,de primes de scolarité + ou d'allocations d'études indexées sur l'indice des prix + accepté par les organisations syndicales; + _de mettre en place un véritable service de protection sociale + et médicale,relevant de l'*éducation nationale ,ainsi + qu'un véritable service d'orientation scolaire et + professionnelle. + § enfin la CGT réaffirme son attachement à l'école + laïque.elle dénonce l'augmentation constante des subventions + et des aides aux écoles privées,confessionnelles ou + patronales.elle confirme sa volonté de voir regrouper + au sein d'un grand service public de l'*éducation nationale + tous les enseignements et services actuellement dispersés + comme l'enseignement agricole par exemple. + § elle appelle toutes ses organisations,ses militants, + les travailleurs à agir,aux côtés des enseignants, + des organisations et partis démocratiques pour promouvoir + toutes les mesures conformes à l'intérêt d'un enseignement + national et pour s'opposer à toutes les attaques contre + l'école. + + la culture,les sports,les loisirs .. + + § le développement harmonieux de l'individu sur le plan + culturel,sportif et des loisirs,est un droit qui depuis + longtemps est partie intégrante des revendications de la + classe ouvrière. + § consciente que la possibilité pour les travailleurs + d'accéder à une véritable vie culturelle,sportive ou de + loisirs est largement déterminée par leurs conditions + générales de vie,la CGT agit pour l'amélioration des + conditions de travail,la réduction de la durée du travail, + la garantie et la progression du pouvoir d'achat. + § afin de permettre aux travailleurs d'accéder massivement + à la culture,aux sports et aux loisirs,la CGT définit + ses revendications $: + _au niveau de la collectivité nationale pour exiger + une véritable politique de crédits,d'investissements, + d'infrastructure et d'équipement pour l'ensemble de ces + activités; + _au niveau des entreprises pour obtenir $: + _la gestion pleine et entière de ces activités par les + représentants élus du personnel au sein des *comités + d'entreprise et organismes assimilés,dans toutes les + entreprises,y compris dans les secteurs public et + nationalisé,sans ingérence du patronat et du gouvernement. + § le financement par l'employeur $: + _de l'ensemble des activités sociales par une contribution + au *comité d'entreprise qui ne saurait être inférieure + à 3% de la masse globale des salaires et appointements, + ce qui permettrait notamment le développement des + réalisations culturelles,sportives et de loisirs au + bénéfice des travailleurs et de leur famille, + _des investissements pour la réalisation d'installations + sportives,culturelles,de loisirs et de vacances; + _l'octroi par l'*état de subventions et de crédits sans + intérêt aux *comités d'entreprise et organismes + équivalents pour le développement des activités sociales; + _la mise à disposition de locaux convenables et d'un accès + facile; + _la suppression de la TVA pour les infrastructures et + les équipements culturels,sportifs,de loisirs et de + vacances. + § la CGT appuie l'activité des associations démocratiques + culturelles sportives et de tourisme,des organisations + d'éducation populaire et de jeunesse et appelle les + organisations confédérées et leurs élus dans les CE + et équivalents à renforcer leur coopération avec elles. + § l'essor sans précédent des sciences et des techniques, + la multiplication des contacts entre les peuples et + des échanges économiques,la prolifération des grands moyens + d'information,la prolongation de la scolarité,les + nécessités du recyclage professionnel font que le droit + à la culture,dans le prolongement du droit à l'instruction, +à la formation et au perfectionnement + professionnels,est devenu un phénomène social + de notre époque et une revendication primordiale des + travailleurs.ils développent chez les travailleurs le + besoin d'approfondir leurs connaissances,leur capacité + de réflexion,de discussion sur tous les sujets de la vie + quotidienne et sociale. + § les besoins croissants des travailleurs,donnent une + acuité plus grande à ces revendications que le grand + capital tente de détourner à des fins mercantiles,de + rabaisser à des évasions illusoires,individualistes + ou primaires,de canaliser à son profit pour faire pénétrer + son idéologie de collaboration de classes.le pouvoir porte + atteinte à la liberté de création,d'expression,et de + diffusion culturelle.les mesures prises,concernant + les activités de l'audiovisuel visent à renforcer + sa pression idéologique sur les masses.il en est de même + de certaines opérations de prestige qui risquent d'aboutir +à la définition d'une culture officielle alors + même que sévit la censure,que des subventions sont + supprimées et des animateurs licenciés. + § pour répondre à la volonté d'accéder et de participer + à la culture,mettre un terme à la dégradation du patrimoine + artistique de notre pays et pour l'enrichir,la CGT + agit pour obtenir $: + _l'augmentation des crédits d'*état accordés à toutes + les branches des activités culturelles,afin de permettre + notamment de développer le réseau des théâtres populaires + des maisons de la culture et des conservatoires et de + donner à l'art cinématographique les moyens financiers + qui lui font défaut; + _la liberté de création,d'expression,de diffusion des + oeuvres artistiques et littéraires; + _une radio-télévision répondant à l'intérêt national et non + aux impératifs de conditionnement idéologique et de + profit. + § la CGT soutient la revendication des artistes, + écrivains et interprètes pour un statut social élaboré + avec eux,leurs représentants et leurs organisations + syndicales. + § elle considère indispensable d'associer les travailleurs + y compris les travailleurs immigrés à toutes les formes + de la vie culturelle et à toutes les réalisations + culturelles existantes $: maisons de la culture,maisons + de jeunes,en les intéressant également à la gestion. + § elle participe au développement de ces activités à divers + niveaux par la mise en oeuvre d'initiatives prises par + les organisations confédérées,par l'impulsion que donnent + ses militants aux multiples réalisations culturelles + des comités d'entreprise ou organismes équivalents + des secteurs public et nationalisé. + + les activités sportives de masse .. + + § le sport n'est pas seulement le moyen le plus sûr + de garantir la santé et l'équilibre psychique des + individus,c'est aussi un des éléments de la culture + générale et de l'éducation. + § les conditions de notre temps,conditions aggravées + des travailleurs menacent gravement leur santé et celle + de leur famille,interdisent l'épanouissement de leur + personnalité.la pratique des activités physiques et + sportives devient un besoin social indispensable de plus + en plus ressenti par les travailleuses et les travailleurs. + § la CGT agit pour l'attribution de crédits permettant + le développement de la pratique du sport de masse, + et également pour que les activités sportives occupent + toute leur place dans l'éducation des enfants sur la base + de la gratuité et dans des établissements scolaires + dotés d'installations modernes et d'éducateurs + qualifiés. + § l'organisation des activités physiques et sportives sur la + base de l'entreprise doit permettre à chaque travailleuse + et à chaque travailleur qui le désire de pratiquer le + sport de son choix. + § c'est pourquoi la CGT demande que des dispositions + soient prises dans les statuts,accords nationaux et + conventions collectives. + § elle demande $: + _des mesures particulières concernant les jeunes sous + la forme de cinq heures rétribuées prises sur le temps de + travail légal,leur permettant de fréquenter une école + d'initiation sportive omnisports; + _des installations à l'intérieur ou à proximité + immédiate de l'entreprise; + _la formation d'animateurs et de moniteurs choisis parmi + les travailleurs. + + les activités touristiques,les loisirs .. + + § les conditions de la vie moderne et les servitudes + qu'elle impose,la pollution qui corrompt l'atmosphère et + le milieu de vie,les nuisances de toutes sortes,atteignent le + travailleur sur le plan physique et moral. + § tous ces facteurs contribuent à faire des loisirs, + des vacances et du tourisme un phénomène social, + économique et culturel de notre temps. + § alors que les vacances et le tourisme sont conçus + par le patronat et le pouvoir comme éléments d'évasion + et source de profits,qu'ils sont l'objet d'opérations + spéculatives,la CGT lutte pour que les travailleurs + puissent exercer pleinement le droit aux congés, + aux loisirs et à la détente. + § la CGT entend susciter et favoriser tout ce qui + conduit à l'enrichissement culturel,à la découverte des + sites et des modes de vie,à la connaissance des réalités + socio-économiques y compris dans les autres pays. + § attachant une très grande importance au tourisme social et + aux activités de loisirs,elle agit pour $: + _étendre le réseau de centres de vacances familiales + et de parcs de loisirs; + _réaliser une véritable politique de crédits et + d'investissements pour le tourisme social,ses infrastructures + et ses équipements; + _obtenir la réservation par l'*état et les collectivités + locales de sites privilégiés au profit du tourisme + social avec bail de longue durée; + _exiger la réduction de 50% pour les billets de congés + payés quel que soit le moyen de transport ainsi que + l'octroi d'un second billet; + _supprimer toutes les restrictions concernant l'utilisation + de certains moyens de transport ainsi que les péages sur + les autoroutes pour les salariés en congés. + + les conditions de vie .. + les équipements collectifs,sanitaires et sociaux .. + le logement .. + + § la politique de l'habitat aboutit à l'accentuation + de la crise du logement dont les travailleurs et leur + famille sont les principales victimes.cette crise est + à la fois quantitative et qualitative.tout d'abord + la pénurie de logements accessibles persiste (particulièrement + dans les agglomérations urbaines);la charge logement + ponctionne lourdement le pouvoir d'achat,égalant et souvent + même dépassant les 25% du budget familial.les logements + existants ou réalisés ne sont ni assez spacieux,ni + suffisamment équipés,ni correctement implantés. + § tandis que des menaces de plus en plus lourdes pèsent + sur l'institution HLM,et que la spéculation immobilière + est source de profits scandaleux,le prétexte de la lutte + contre l'inflation aboutit à réduire le nombre des + logements sociaux construits. + § la CGT considère que la politique sociale du logement + ne peut s'insérer dans la pratique d'un urbanisme fondé + sur la réalisation du profit. + § pour ce qui la concerne,une véritable politique sociale + du logement comporte $: + _la définition d'un urbanisme d'ensemble procédant de la + volonté de satisfaire des besoins réels.cela implique + d'une part,d'assurer des liaisons correctes entre + l'habitat et l'emploi,des transports collectifs rapides + et confortables et financés principalement par les + entreprises,d'autre part,la réalisation d'un cadre de vie + agréable permettant la détente et la satisfaction correcte + des besoins sociaux et culturels; + _la reconnaissance du droit au logement,assurée par un service + public basé sur l'institution HLM,ce qui suppose une + gestion démocratique des organismes d'HLM,celle-ci + étant assurée majoritairement par les élus locaux et + les représentants des usagers (locataires,syndicats), + ainsi qu'un ensemble de mesures leur permettant de remplir + efficacement leur rôle; + _la maîtrise de l'usage des sols avec droit de préemption + public sur les transactions de terrains bâtis ou non bâtis + à l'intérieur des zones d'urbanisation et fixation de prix + de référence stables pour éliminer la spéculation; + _le financement des programmes par l'*état , à l'aide de prêts + de longue durée à faible taux d'intérêt; + _l'octroi de subventions permettant aux collectivités locales + et aux offices HLM de réaliser les réserves financières + nécessaires; + _l'exonération totale de la TVA et diminution du taux de + celle-ci sur les fournitures et travaux d'entretien; + _la réalisation de programmes annuels permettant + de faire face aux besoins; + _la réglementation des loyers et charges.suppression du + surloyer,garantie du droit au maintien dans les lieux, + abrogation de la loi permettant la vente des HLM + locatives; + _la refonte complète et la réforme du financement + de l'allocation logement; + _l'affectation prioritaire,sous le contrôle des + *comités d'entreprise ,de la cotisation du 1% des + entreprises au financement du logement social.cette + cotisation doit s'appliquer à l'*état et aux collectivités + publiques pour les personnels qu'ils emploient;elle doit + être portée à 2% pour les grandes entreprises; + _le développement de la construction de logements + sociaux pour les travailleurs immigrés et les retraités, + ainsi que des foyers pour les jeunes travailleuses et + travailleurs;résorption de l'habitat insalubre; + _la mise en oeuvre d'une véritable politique de rénovation + urbaine et d'amélioration de l'habitat ancien,à l'initiative +des collectivités locales,avec dotations + budgétaires convenables permettant l'intervention + prioritaire des organismes d'HLM et le respect du droit + au relogement sur place des habitants concernés. + + transports et circulation .. + + § c'est une même politique monopoliste qui conduit aux + déséquilibres régionaux de l'économie,au développement + incohérent des grandes concentrations urbaines,qui + dégrade des secteurs entiers de l'équipement ferroviaire, + routier,de l'aviation civile et de la marine marchande. + elle utilise le secteur nationalisé des transports + dans l'intérêt des grands financiers,domine par la + sous-traitance les transports routiers,détériore + gravement les services publics urbains,liquide des trafics + maritimes ou aériens.confrontée avec le problème du + développement de la circulation automobile elle accumule + les retards dans les infrastructures de circulation. + elle dilapide le potentiel humain et matériel de + construction des moyens de transports (aéronautique, + automobile,etc).enfin,elle mène une politique énergétique + portant préjudice aux transports et déplacements. + § cette politique atteint la vie quotidienne de la + population laborieuse,le développement de l'économie + nationale et les échanges internationaux favorables + à notre pays. + § l'insuffisance notoire et grandissante des moyens de + transports collectifs,leur manque de rapidité et leur + inconfort portent atteinte à la santé et à la vie + familiale,sociale et culturelle des travailleurs. + § la politique des monopoles tend de plus en plus à faire + peser sur les travailleurs les frais de l'équipement + en moyen de transports et de circulation remettant en cause + leur rôle de services publics. + § pour la CGT,les transports de marchandises et de + personnes au niveau national et international doivent + être adaptés aux besoins sociaux et culturels,au + développement équilibré de l'économie,à l'aménagement + cohérent du territoire,à l'intérêt national. + § loin de s'opposer,les différentes techniques de + transports (terrestres,aériens,maritimes ou fluviaux) + les différents moyens individuels ou collectifs + doivent répondre à des besoins,à des conditions,à des + domaines spécifiques permettant de faire face à la + complexité,à la diversité et à la mouvance des nécessités + de la vie économique et sociale,tout en assurant une + cohérence et une efficacité de l'ensemble. + § sachant l'importance que représentent les conditions +de transports et de circulation pour l'existence + quotidienne des travailleurs,la CGT demande $: + _une politique coordonnée de l'emploi,du logement et des + équipements sociaux et culturels (ce qui supposerait + la suppression de la spéculation foncière); + _un véritable service public de transports en commun, + desservant l'ensemble des agglomérations et assurant + les services rapides,confortables,peu coûteux et + fonctionnant aux heures permettant l'activité économique, + sociale et culturelle de la population; + _l'amélioration des conditions de circulation dans les + agglomérations permettant d'élargir l'accès aux transports + collectifs notamment par l'adaptation des voieries, + des constructions de parkings à proximité des gares ou + stations ; + _le développement de l'équipement en transports et en + voies de circulation entre les communes isolées et les + agglomérations.ce qui implique par conséquent,de cesser + le démantèlement des réseaux de transports existants, + tels la SNCF et la RATP; + _la prise en charge de l'essentiel des équipements,de + leur renouvellement et de leur extension par des + investissements de l'*état .des taxes progressives étant + prélevées sur les grosses entreprises commerciales, + industrielles et la grosse propriété foncière; + _le paiement des frais de transports des travailleurs + (cartes hebdomadaires ou autres)par les employeurs; + _la création de cartes de réduction pour les chômeurs,les + retraités et vieux travailleurs,sur l'ensemble des + transports publics; + _la gratuité des transports pour les jeunes soldats; + _l'extension des réductions de transports accordées + aux familles nombreuses,aux familles de travailleurs + immigrés; + _l'amélioration des transports scolaires,la sécurité + des enfants devant être rigoureusement assurée et les + frais en résultant pris en charge par l'*état ; + _la création ou le développement des moyens de transports + en rapport avec les besoins en loisirs.extension + des billets congés payés sur les transports aériens + et maritimes,création de navires de croisières,etc; + _une politique de développement des différents modes de + transports sur la base de leur qualité complémentaire, + associée à une politique nationale de la construction + des moyens de transports. + + la santé .. + + § la santé constitue un besoin humain essentiel en même temps + qu'un impératif de progrès économique,social et culturel. + elle suppose d'abord des conditions de vie et de travail + correctes pour lesquelles lutte la CGT. + § il appartient avant tout à l'*état de fournir + les moyens nécessaires à la satisfaction de ces besoins. + § le droit à la santé doit comporter pour toute la + population l'accès aux méthodes de prévention,d'investigation, +de traitement,de rééducation et de + réadaptation.cet accès devrait se réaliser dans le cadre + d'une véritable sectorisation sanitaire mettant,au service + de tous,les progrès des techniques médicales et des sciences + biologiques. + § pour cela la CGT exige $: + _la mise en oeuvre d'une véritable réforme de la santé + reposant sur le principe du service public; + _la reconnaissance du rôle de premier plan occupé + par l'hôpital public; + _la création de nouveaux hopitaux et la modernisation + de ceux qui existent;l'implantation des unités hospitalières + au plus près des lieux d'activité de la population + avec des équipements permettant de prévenir et de + traiter les maladies telles que notamment le cancer, + les affections nerveuses et cardiaques,les maladies + mentales et pulmonaires; + _la formation d'urgence,et en nombre suffisant,des + personnels qualifiés notamment au niveau des infirmiers et + des médecins et le renforcement massif des effectifs des + hopitaux,les personnels bénéficiant de plus justes + salaires et de meilleures conditions de travail; + _un statut pour le secteur privé de l'hospitalisation + garantissant les malades et les personnels; + _la multiplication des centres de secours hospitaliers + d'urgence; + _le développement de la recherche médicale; + _la promotion de formes nouvelles d'exercice de la médecine + dans le respect de ses principes fondamentaux $: secret + professionnel,liberté de prescription,indépendance + technique et professionnelle. + § dans ce but,il convient que les moyens financiers soient + assurés permettant le développement et le fonctionnement + des *centres de santé ,des *collectivités locales, + de la *sécurité sociale,des organisations mutualistes, + de maisons médicales permettant l'exercice d'une véritable + médecine d'équipe. + § la mise en oeuvre de ces mesures devrait s'effectuer + après une large concertation avec les organisations + syndicales et mutualistes,le corps médical et les + représentants des collectivités locales,et dans le cadre + d'une véritable carte sanitaire. + § ainsi seraient créées les conditions d'une réelle + humanisation de l'hôpital,de la continuité des soins + et de la permanence du service de santé. + + les équipements sociaux et l'action sociale .. + + § la CGT attache une très grande importance aux + différents aspects de " l'action sociale" maintenue,malgré les + déclarations officielles,dans la plus grande indigence. + § pour une politique d'action sociale conforme aux exigences + actuelles la CGT revendique $: + _des équipements et des mesures de protection de + l'enfance et en tout premier lieu $: + _des crèches $: compte tenu des graves carences qui existent + dans ce domaine il convient de mettre en oeuvre + un programme d'urgence.pour assurer le financement de + la construction et le fonctionnement des crèches,il + importe qu'à la participation des caisses d'allocations + familiales et des collectivités locales,vienne s'ajouter + un versement de 0-5% de toutes les sommes payées au titre + des traitements et salaires et la contribution de + l'*état ; + _une véritable médecine scolaire; + _des maisons et hôtels maternels; + _des foyers de l'enfance; + _des maisons d'enfants à caractère social; + _l'ouverture de centres d'orthogénie et de consultations + spécialisées permettant la connaissance et l'accès aux + problèmes de la sexualité et de la contraception; + _des équipements et des mesures spéciales pour les + personnes âgées et en particulier $: + _la création de centres de gériatrie et de gérontologie; + _l'augmentation des effectifs des aides-ménagères; + _la construction de foyers d'habitation comportant + les équipements sociaux et le personnel médical + nécessaire; + _la rénovation des "hospices" existants et l'édification + d'établissements chargés d'accueillir tous ceux qui + nécessitent des soins constants et une assistance + permanente; + _le développement du réseau d'accueil pour les travailleurs + immigrés,qui doit être placé sous la seule responsabilité + de l'*office national d'immigration ,avec le contrôle + syndical et financement par le gouvernement et le + patronat; + _la mise en oeuvre d'une politique conséquente en faveur + des handicapés qui implique un effort budgétaire particulier + de l'*état et comporte en tout premier lieu $: + _la reconnaissance du droit à la santé permettant de mieux + prévenir les handicaps et de mieux les soigner; + _l'intégration des enfants handicapés dans le système + scolaire de l'*éducation nationale ,en créant un éventail + complet d'établissements offrant tous les moyens d'éducation + correspondant aux différents handicaps; + _la reconnaissance du droit à l'emploi sur la base du + principe de l'insertion du travailleur handicapé dans le + cadre normal des entreprises,et de la garantie des + dispositions légales et de celles définies dans les + conventions collectives; + _la juste rétribution de la force de travail du travailleur + handicapé qui doit au minimum percevoir le SMIC et + l'attribution d'une allocation égale à 80% du SMIC pour + ceux qui sont dans l'incapacité de travailler; + _la refonte des prestations familiales versées aux familles + ayant à leur charge un enfant handicapé. + + le cadre de vie .. + + § aujourdhui,ce que l'on appelle les "nuisances" +atteignent un niveau insupportable pour la population et +spécialement pour les travailleurs,ce sont $: le bruit,l'air vicié + l'eau polluée,les forêts détruites,le paysage enlaidi, + les cités dortoirs inadaptées. + § mais ce n'est pas la "vie moderne" qui en est responsable. + le grand responsable c'est l'anarchie d'un système + basé sur le profit qui gaspille les biens naturels + et néglige les besoins fondamentaux de l'homme;c'est l'anarchie +de l'urbanisation qui se fait en fonction de + la spéculation foncière et du profit immobilier;c'est + l'anarchie de l'industrialisation qui se fait en fonction + de calculs de rentabilité à court terme;c'est l'anarchie + de la production qui consomme des biens comme l'eau + et l'air et les restitue sous forme de déchets pollués, + sans que personne ne limite cette consommation ni oblige + les vrais pollueurs à empêcher cette dégradation. + § les salariés,exploités dans leur travail,ne veulent pas, + à leur sortie du travail,que ce soit dans leur localité + ou dans leur lieu de vacances,retrouver le même univers + inhumain,souillé par la recherche du profit immédiat. + § la CGT demande $: + _que l'urbanisation et l'industrialisation se fassent + en fonction d'un plan élaboré démocratiquement; + _que soit mis en oeuvre un urbanisme respectant les + besoins et aspirations de la population tant en matière + esthétique qu'en matière sociale; + _qu'aucune construction d'ensembles immobiliers n'ait + lieu sans que soient,en même temps,édifiées les installations + sociales,culturelles,sportives nécessaires à la population; + _que les syndicats aient leur mot à dire,à l'échelon + local,départemental ou régional sur les équipements + collectifs nécessaires à la population; + _que les mesures nécessaires soient imposées aux industriels + pour que leurs activités préservent les conditions de vie + de la population et les sites de repos et qu'elles respectent + des normes antipollution efficaces; + _que toute nouvelle installation ou fabrication fasse l'objet +d'un examen,notamment des *comités d'hygiène et de + sécurité ,en liaison avec les représentants de la + population concernée; + _qu'une contribution financière,prélevée sur le chiffre + d'affaires des grandes entreprises en fonction des + atteintes au cadre de vie,soit affectée à la réparation des + préjudices causés. + + + + + + + + + la CGT définit son action face à la situation générale + du pays .. + + § la crise du système capitaliste s'est aggravée. + elle engendre un niveau élevé et permanent d'inflation + et un chômage massif.elle s'accompagne d'un ralentissement + de l'activité économique,de difficultés croissantes de + débouchés. + § la France est profondément affectée par le développement + de la crise qui entraîne des atteintes sérieuses au + pouvoir d'achat et approfondit et généralise l'insécurité. + § mais la crise n'est pas fatale.le dérèglement de + l'économie capitaliste a pour cause l'accumulation de + profits extraordinaires par les grandes sociétés + capitalistes et en particulier par les sociétés + multinationales avec le soutien de l'*état . + § la politique du pouvoir vise à faire supporter la crise + aux travailleurs et au peuple.l'austérité n'est pas un remède + permettant de sortir de la crise.elle l'accentue.elle + accélère le gâchis des forces productives humaines et + matérielles,entraînant la destruction et l'abandon + de secteurs décisifs,aggravant les déséquilibres de + l'appareil productif et des économies régionales.le + "redéploiement" que met en oeuvre le pouvoir pour + renforcer les monopoles va encore les accélérer. + il vise à soutenir l'expansion multinationale des groupes + monopolistes basés en France et il accélère la pénétration + de l'économie française par les multinationales + étrangères. + § les orientations du *7ème plan visent à prolonger + et à accentuer la politique d'austérité. + § cette politique est profondément nocive,contraire à + l'intérêt national et à l'établissement d'une coopération + et d'échanges économiques internationaux sur une base + saine. + § concentrant toutes les forces de conservation sociale, + la politique du pouvoir renforce l'autoritarisme du + système et en accentue toutes les contraintes majeures. + § en s'appuyant sur la montée de la volonté populaire + de changement,il est nécessaire de développer les luttes + sociales pour assurer la défense des conditions de + travail et de vie des travailleurs.en même temps l'action + est indispensable pour imposer des mesures économiques, + s'attaquant à l'inflation,assainissant l'économie et + assurant son développement.elle est intimement liée + à la défense des intérêts des travailleurs. + + la politique économique .. + + § pour faire face à la crise,des mesures essentiellement + différentes de celles adoptées par le patronat et le + gouvernement,dont la responsabilité dans la situation + actuelle est écrasante,sont à mettre en oeuvre. + § il est indispensable d'assurer le développement prioritaire + du marché intérieur et d'élever la consommation populaire + pour répondre aux besoins des travailleurs et des grandes + masses de la population. +pour assurer un développement économique plus sain,fondé + sur l'élargissement de la consommation populaire et + du marché intérieur,sauvegarder l'emploi et rééquilibrer + nos échanges,il faut promouvoir une politique + industrielle s'appuyant sur le secteur public.il faut + utiliser toutes les ressources et potentialités du + pays.il faut s'attaquer aux sources de l'inflation. + § à cet effet il est nécessaire $: + _de réduire la TVA sur les produits de première + nécessité; + _de bloquer les prix de certains produits de grande + consommation,des produits industriels les plus importants + à la production ainsi que les tarifs publics,les loyers + et les charges; + _de réduire et de contrôler les marges bénéficiaires des + grandes sociétés; + _de mettre en oeuvre une politique sélective du crédit + s'attaquant aux facilités inflationnistes de crédit + offertes aux grandes entreprises,sans porter atteinte + au fonctionnement normal des PME ni à l'emploi; + _de défendre l'épargne populaire contre l'inflation et + d'indexer le montant des livrets A- de *caisse + d'épargne sur l'évolution réelle des prix. + § pour s'opposer à la dégradation de l'emploi et assurer + son développement,sont nécessaires des mesures de réduction + de la durée du travail,d'abaissement d'âge de la retraite, + la garantie des ressources,l'interdiction des décisions + de licenciement sans reclassement préalable,le droit + et les moyens de discuter du bien fondé des décisions + de licenciement et de fermeture d'entreprises. + conjointement,il est indispensable de mettre en oeuvre + une politique économique et sociale assurant le + développement économique et qui soit créatrice d'emplois. + ceci exige notamment le développement des services et + activités directement utiles à l'économie ou indispensables + à l'amélioration des conditions de vie (enseignement, + santé,services sociaux,etc). + § il faut stopper l'abandon,la liquidation et la + subordination au capital étranger de secteurs ou d'entreprises +indispensables au développement de l'économie + française qu'entraîne la politique actuelle,assurer + leur maintien et leur développement,notamment dans les + secteurs de pointe,vitaux pour la souveraineté nationale + et la définition de la place de notre pays dans la + civilisation internationale du travail. + § la politique industrielle doit s'appuyer sur l'extension + du secteur public pour assurer le développement de + productions nationales nécessaires au développement + de l'économie,indispensables à son équilibre interne + et à celui de ses échanges extérieurs. + § indépendamment des mesures visant à une réforme + de la fiscalité qui aurait une portée économique + positive,les subventions et autres transferts effectués + au bénéfice du grand capital doivent être supprimés. + un impôt sur le capital des grandes firmes françaises doit + être instauré. + § les ressources dégagées doivent être,en priorité, + affectées aux équipements sociaux.le budget de l'*état + doit être équilibré.il convient de réduire + substantiellement les dépenses militaires avant tout + par la suppression de la force de frappe nucléaire + et en prévoyant la reconversion des industries d'armement et + des activités qui leur sont liées vers des fabrications + civiles en utilisant pleinement le potentiel scientifique + technologique devenu ainsi disponible. + § une nouvelle orientation de la fiscalité et du budget et + des fonds publics ou parapublics (conjugués avec le + contrôle des prix et du crédit) est indispensable + pour s'attaquer à l'inflation qui pèse lourdement + sur les travailleurs et les titulaires de petits revenus + et qui a également des effets négatifs sur les échanges + extérieurs. + § il est immédiatement nécessaire d'augmenter rythme et + réalisation des équipements sociaux et collectifs + afin de combler les retards considérables accumulés + dans ce domaine. + § ces mesures sont de nature à impulser l'activité dans + de nombreux secteurs de production et à favoriser la mise + en oeuvre de techniques nouvelles. + § un changement radical de la politique énergétique + de la France est urgent.il faut en finir avec le + pillage et la domination des sociétés multinationales sur + la politique énergétique. + § une politique nouvelle fondée sur la diversification + et la coordination des sources d'énergie doit être appliquée. + elle doit comporter $: + _l'arrêt immédiat des fermetures de puits dans les + mines de charbon encore en exploitation et l'utilisation + à plein des capacités actuelles d'extraction; + _un plan d'augmentation de la production charbonnière + utilisant pleinement les ressources nationales; + _l'utilisation des potentialités nationales pour la + production hydraulique d'électricité,notamment par + l'énergie marémotrice; + _le développement de la production d'électricité + d'origine nucléaire en orientant le choix entre les + différentes techniques de réacteurs,dans le but d'assurer + une meilleure utilisation possible des réserves naturelles + en matériaux fissiles pour la production d'électricité; + _"aucune considération de rentabilité économique ne doit + être opposée aux mesures indispensables pour assurer + la sécurité de la population et du personnel"; + _la suppression des privilèges des sociétés pétrolières + et l'abaissement des taxes à la consommation sur les + produits pétroliers; + _l'établissement avec les pays producteurs de pétrole + et de gaz naturel de contrats sur la base de l'intérêt + mutuel des peuples,en bannissant toute pratique + néo-coloniale et sans interférence des compagnies; + _la nationalisation de l'ensemble du secteur pétrolier et, + dans l'immédiat,la nationalisation des groupes pétroliers + français Elf-Erap CFP-Total; + _le développement de la recherche,par le secteur public + et nationalisé,sur les sources d'énergie de l'avenir $: + hydrogène,énergie solaire,géothermie,fusion + thermonucléaire contrôlée. + § la remise en cause généralisée du rôle du service + public,le démantèlement de certaines activités des + administrations et entreprises nationalisées par leur + transfert,soit pour les faire effectuer par des personnels + hors statut,soit pour faire bénéficier les monopoles + de leur rentabilité,la pénétration accélérée de ces + administrations et entreprises par les capitaux privés + doivent être stoppés.au contraire,il convient de + développer le secteur public et nationalisé et de le + mettre au service de l'intérêt national,ce qui implique + une politique de tarifs mettant fin aux transferts + considérables opérés au bénéfice des monopoles et au + détriment de la grande masse des usagers et qui pèsent + sur les prix à la consommation. + § une politique coordonnée des transports,combinant le + développement des infrastructures nouvelles et l'utilisation + des capacités existantes répondant aux besoins des + usagers,des régions,du développement économique national + et des échanges internationaux de la France ,est à mettre + en oeuvre. + § cette politique doit s'insérer dans un plan de développement + à long terme des infrastructures nécessaires pour satisfaire + au mieux et au moindre coût économique et social + les besoins prévisibles.il est urgent de développer les + transports collectifs d'usagers,notamment les transports + urbains. + § il est nécessaire d'organiser une recherche scientifique + dégagée de la pression matérielle et morale des intérêts + privés qui s'efforcent d'en monopoliser les résultats et + compromettent son avenir à long terme. + § l'enseignement supérieur et les établissements publics de + recherche scientifique doivent recevoir les moyens + nécessaires au développement des différents secteurs de la + recherche,conformément à l'intérêt national. + § en ce qui concerne l'aménagement du territoire,il faut + en premier lieu assurer un niveau d'activité permettant + de réaliser le plein emploi,s'attaquer aux facteurs de + régression que sont les disparités en matière de + salaires,d'équipements collectifs et sociaux. + § les investissements publics,ceux du secteur nationalisé, + doivent être orientés en vue de rééquilibrer les + économies régionales.il est urgent de prendre des mesures + pour arrêter le dépérissement des régions du Centre de + la France ,de l'Ouest-Sud-Ouest .des mesures + spécifiques doivent être adoptées à cet effet. + § les objectifs généraux suivants doivent être assignés + à la politique d'aménagement du territoire. + § infrastructures $: + _accélération des liaisons de désenclavement des régions + et de jonctions radiales interrégions,notamment + autoroutières sous le contrôle et avec le financement + de l'*état ; + _arrêt des fermetures de liaisons ferroviaires et + accélération des programmes d'investissements; + _participation accrue de l'*état et du FDES + (*fonds développement économique et social ) à la + modernisation des installations portuaires et fluviales; + _modernisation et extension prioritaire du réseau de + télécommunications. + § industrie $: + _développement diversifié des activités économiques + régionales prenant appui sur les ressources propres de + chaque région et leur vocation; + _utilisation de l'ensemble des ressources industrielles, + énergétiques,minières,agricoles et humaines de chaque + région. + § dans le domaine législatif et réglementaire,il est + nécessaire de prendre les mesures suivantes $: + _élection au suffrage universel direct et à la + proportionnelle des *conseils régionaux et accroissement + des ressources des régions par transfert du budget + de l'*état et suppression de la fiscalité supplémentaire + prévue par la loi du 5 juillet 1972; + _augmentation de la représentation des organisations + représentatives des salariés dans les CESR (*conseils + économiques et sociaux régionaux ) et répartition des + sièges attribués à ces organisations proportionnellement + à leur influence respective; + _suppression des sièges attribués aux organisations non + représentatives. + § il est indispensable de cesser les encouragements + sous des formes diverses visant à favoriser les exportations + de capitaux et il faut viser à se prémunir contre leurs + effets inflationnistes et à contrôler les mouvements de + capitaux pour défendre la monnaie.les investissements + de capitaux étrangers doivent faire l'objet d'un strict + contrôle et être interdits dans tous les cas où ils mettent + en cause la maîtrise de l'économie du pays et la + souveraineté nationale. + § il est nécessaire de procéder,progressivement,à une + diversification de nos relations économiques extérieures + tant en ce qui concerne le commerce extérieur que la + coopération technique et scientifique en les fondant + sur l'intérêt mutuel et en les étendant à un nombre plus + grand de pays,notamment les pays socialistes et les pays en + voie de développement. + § ces mesures ne peuvent être imposées que par les luttes + des salariés et des grandes masses de la population. + elles s'inscrivent en opposition avec la politique + réactionnaire du pouvoir dont les effets néfastes + s'expriment dans la crise actuelle. + + les libertés .. + + § luttant pour l'instauration d'un véritable régime + démocratique,la CGT s'oppose au caractère de plus en + plus autoritaire du pouvoir qui tente de le dissimuler + dans un libéralisme de façade. + § elle dénonce la propagande antisyndicale du patronat + et des hommes du pouvoir et les campagnes racistes + de leurs officines. + § la CGT s'élève contre l'accroissement des contraintes, + directes et indirectes du pouvoir et du patronat + dirigées contre les libertés individuelles et publiques + et mettant en cause les droits syndicaux,notamment le + droit de grève et les autres droits des travailleurs. + + libertés collectives et individuelles .. + + § elle juge que le respect des libertés fondamentales dans + notre pays exige,dans l'immédiat,l'ensemble des mesures + suivantes $: + _respect absolu du droit de pétition et de manifestation; + _abrogation de la loi du 8 juin 1970,dite loi + "anticasseur"; + _droit d'expression des syndicats sur les antennes de + la radio et de la télévision; + _abrogation de la loi du 7 août 1974 portant suppression + de l'ORTF et remplacement de cette loi par un ensemble + législatif garantissant l'indépendance,la démocratisation + et la qualité de la radio et de la télévision française; + _mise en oeuvre d'un statut démocratique du jeune soldat + assurant le droit d'association de libertés d'expression, + de respect de la dignité de l'homme citoyen et l'arrêt + de toutes sanctions prises arbitrairement; + _suppression des juridictions d'exception telle la + *cour de sûreté de l'*état ; + _modification profonde de la loi 1963 pour aboutir à + un véritable statut des objecteurs de conscience; + _rattachement de la police judiciaire au ministère de + la justice; + _démocratisation de la police dans son recrutement + sa formation et son utilisation; + _suppression des polices parallèles; + _rétablissement et respect des franchises universitaires; + _réforme de la procédure de flagrant délit; + _abrogation de la garde à vue; + _droit immédiat et gratuit,en cas d'arrestation,à + l'assistance d'un avocat; + _droit pour tout inculpé de connaître son dossier aussi bien + que le procureur; + _réforme des règles d'enquête judiciaire; + _levée du secret de l'instruction judiciaire; + _abolition du pouvoir discrétionnaire du *ministre de + l'intérieur en matière d'expulsion,de refoulement et + d'assignation à résidence; + _garantie des libertés individuelles et collectives des + travailleurs immigrés,de leur dignité,de leurs droits + d'expression,d'association et de leurs droits + politiques; + _réforme du système pénitentiaire dans le sens d'une + véritable humanisation des conditions de détention et de + la garantie de la sécurité des gardiens; + _répression sévère des attentats,violences et campagnes + racistes et stricte application de la loi antiraciste + du 1er juillet 1972. + + liberté de la presse et des autres moyens d'information .. + + § la crise que connaît actuellement la presse écrite + a son origine dans l'entreprise délibérée du pouvoir et + des quelques journaux à grand tirage,propriété de groupes + industriels et financiers,pour s'assurer le monopole de + l'information. + § c'est le même objectif que poursuit le pouvoir en + démantelant l'ORTF et en s'assurant plus complètement + le contrôle des radios périphériques. + § il s'agit de la volonté délibérée de mettre en cause + une liberté essentielle $: la liberté d'expression. + § le droit à l'information est une donnée essentielle et + permanente de la démocratie. + § la CGT demande une discussion générale de toutes + les parties intéressées _ y compris les représentants + des organisations syndicales de travailleurs en vue de + rechercher une solution d'ensemble pour assurer l'existence de + l'indépendance des moyens d'information. + § en outre,elle réclame $: + _une industrie nationale du papier de presse; + _l'abrogation des mesures fiscales et postales amputant + les aides consenties à la presse à la *libération ; + _une réglementation des ressources publicitaires; + _des garanties pour le libre exercice de la fonction + de journaliste aussi bien à la radio,à la télévision que + dans la presse écrite. + + + + + + + + + la CGT définit son action face aux grands problèmes + internationaux et au marché commun .. + la solidarité internationale,la paix,l'indépendance + nationale .. + + § l'accentuation de la crise générale du capitalisme + fait obligation au mouvement syndical de lier étroitement + la lutte pour les revendications économiques et sociales + des travailleurs aux niveaux national et international + ainsi qu'au combat plus général pour le maintien de + la paix,pour le développement de rapports internationaux + permettant l'établissement d'un climat mondial de + coopération entre les peuples. + § notre époque est caractérisée par des grandes luttes + des travailleurs et des peuples pour l'indépendance + nationale et la démocratie,le progrès social et la paix, + pour le socialisme.la solidarité internationale acquiert + des dimensions inconnues jusqu'ici. + § d'importants succès ont été obtenus dans ces domaines. + après avoir été contraint de signer les accords + de Paris ,l'impérialisme US a été chassé du Viêt-Nam et + du Cambodge qui ont été définitivement libérés. + des pays anciennement colonisés ont acquis leur + indépendance politique,certains acquièrent ou consolident + leur indépendance économique,au Portugal et en Grèce + le fascisme a subi un échec;des progrès sont enregistrés + pour l'établissement de la coexistence pacifique dans + le *monde ,pour la détente et la coopération + européenne. + § l'impérialisme est en crise profonde et s'affaiblit. + il est contraint à des reculs.mais,en vue de maintenir et si + possible de renforcer sa domination et son exploitation + sur les travailleurs et les peuples,il intervient de plus + en plus contre la liberté des peuples,emploie la violence + la plus bestiale comme au Chili pour s'opposer + au développement de la démocratie.il relance l'alliance + atlantique,dangereuse pour la paix mondiale et l'indépendance + des peuples,il fomente complots et agressions. + § de plus,il favorise le développement des sociétés + multinationales et l'internationalisation de l'exploitation + des travailleurs,il organise l'intégration monopoliste + comme dans le *marché commun . + § la CGT considère que la lutte anti-impérialiste + et antimonopoliste est un impératif pour la défense des + intérêts des travailleurs. + § en se félicitant qu'en France des actions unitaires + se manifestent pour l'affirmation de la solidarité + internationale des travailleurs et la défense de la paix, + la CGT s'efforce de faire progresser l'action unie + de la classe ouvrière et des organisations syndicales + dans le monde et plus spécialement en Europe . + § constatant que la politique extérieure du *pouvoir + en France s'efforce d'enchaîner notre pays à la + stratégie planétaire de l'impérialisme US,la CGT + exige le respect et la défense de l'indépendance + et de la souveraineté nationale,que soient prises par + notre pays des initiatives pour la coexistence pacifique, + pour le désarmement général et contrôlé,pour l'établissement + d'une action et durable entente entre les peuples du + monde. + § la CGT se prononce et déploie son action $: + _pour la participation active de la France à la détente + internationale,aux règlements par voie de négociations + des litiges internationaux,à l'organisation de la coexistence + pacifique et du désarmement général; + _pour la suppression de toute force de frappe atomique,qu'elle + soit nationale,multinationale ou européenne et des + armes de destruction massive,pour la réduction des + dépenses d'armement et l'utilisation des fonds ainsi + disponibles à la solution des grands problèmes de notre + temps (aide aux pays sous-développés,lutte contre le + chômage et pour l'emploi,contre la pollution,etc); + _pour la dissolution simultanée de tous les blocs + militaires.la France ne doit pas participer à un bloc + militaire quel qu'il soit, ce qui implique son + désengagement du *pacte atlantique ; + _pour le respect de l'indépendance des peuples,la + non-ingérence dans leurs affaires intérieures et l'établissement + sur un pied d'égalité d'une véritable politique de + coopération avec les peuples nouvellement indépendants; + _après la victoire historique des peuples du Viêt-Nam et + du Cambodge ,la CGT exigera que ces peuples qui + ont eu à supporter durant de longues années une guerre + de destruction massive puissent faire valoir leurs droits +à de justes réparations et pour une reconstruction + rapide des régions dévastées.la France doit élargir + et développer ses rapports,avec la *république + démocratique du Viêt-Nam ,avec le GRP du Sud-Viêt-Nam , + avec le Laos et le GRUNC du Cambodge ; + _pour le règlement politique du conflit au Moyen-Orient sur + la base des résolutions de l'ONU prévoyant,en premier + lieu,l'évacuation des territoires occupés par l'armée + israélienne,la reconnaissance des droits nationaux + du peuple arabe de Palestine ,le droit à l'existence + de tous les états de la région y compris l'*état + d'Israël .la CGT souhaite que la *conférence de + Genève permette un tel règlement écartant à l'avenir + toute ingérence impérialiste et que s'instaure un climat + de détente et de coopération entre les *états et les + *communautés du Moyen-Orient ; + _pour l'organisation d'une véritable sécurité collective + entre tous les *états d'Europe sans distinction + de régime politique.la CGT soutient les diverses + initiatives qui tendent à créer sur notre continent + un véritable climat de coexistence pacifique.elle + souhaite que rapidement soient menés à bien les travaux + de la *conférence européenne de sécurité et de + coopération ; + _pour la liquidation totale du colonialisme et pour + la condamnation de toute politique néo-colonialiste + tendant à maintenir sous la dépendance du système + capitaliste de nombreux pays,particulièrement en ce qui + concerne l'exploitation de leur richesse nationale. + la CGT soutient l'action des peuples concernés + pour la libre disposition et la mise en valeur de leurs + richesses naturelles,leur commercialisation et leur + utilisation.elle dénonce la politique de l'impérialisme qui + vise à maintenir de nombreux pays dans des zones de + dépendance économique et politique portant ainsi + entrave à la lutte pour une véritable indépendance + nationale. + § la CGT s'est félicitée et a salué les succès des + forces démocratiques au Portugal et la liquidation + du régime fasciste en Grèce .elle est solidaire + et apporte un appui sans réserve à la lutte des travailleurs + et du *peuple d'Espagne pour un changement radical + de régime,pour l'amnistie,pour la démocratie et la + liquidation du franquisme. + § de même,elle continuera d'être aux côtés des peuples + d'Afrique du Sud ,de Zimbabwe ,de Namibie dont + l'action est renforcée par les succès anticolonialistes + arrachés par les peuples de Guinée-Bissau ,d'Angola + et du Mozambique . + § la CGT,en dénonçant les interventions répétées des + USA et,plus précisément d'organismes comme la CIA + en Amérique latine ,affirme sa solidarité aux travailleurs + et aux peuples de cette région du monde.elle développera + avec plus de force le soutien et l'aide aux travailleurs + et au peuple du Chili ,dans leur détermination pour la + liquidation de la junte fasciste et le rétablissement + des libertés démocratiques dans leur pays. + § les récentes luttes dans les pays dits départements + d'Outre-Mer ont posé avec force la nécessité du + changement des rapports entre la France et ces pays. + la CGT soutient leurs revendications nationales + et leur demande légitime d'accéder à un statut d'autonomie. + § face au développement des sociétés multinationales + la CGT considère que chaque pays a le droit $: + _de prendre des mesures pour que les sociétés + multinationales investissent leurs bénéfices dans le pays + où ils ont été obtenus; + _d'orienter les investissements d'origine extérieure + vers tel ou tel secteur ou vers telle ou telle région, + suivant les nécessités de son développement; + _d'instaurer un contrôle public et démocratique des + importations et exportations de capitaux; + _de nationaliser les entreprises implantées sur son + territoire et de disposer librement de ses ressources + nationales afin de créer ou d'assurer les bases d'un + développement indépendant et d'une coopération + internationale fondée sur les avantages mutuels. + § s'appuyant sur le soutien des travailleurs,la CGT + agit pour la reconnaissance et la pleine application + de ces principes par les gouvernements,les groupements + interétatiques et les organisations internationales + (ONU,OIT,etc).elle considère que les politiques + communes et les mesures arrêtées au niveau de la CEE + doivent respecter les principes énoncés ci-dessus. + § pour assurer la défense des intérêts des travailleurs, + face à l'internationalisation du capital et de la + production,la CGT exige également des mesures + économiques,à savoir $: + _les organisations syndicales doivent avoir le droit et + les moyens de discuter avec la direction des entreprises + multinationales des problèmes qui se posent à l'ensemble + des travailleurs d'une même société (ou d'un groupe). + le droit de négociations collectives internationales + pour les travailleurs appartenant à des groupes économiques + multinationaux,sans que cela affecte le plein exercice des + droits syndicaux au niveau de chaque entreprise et de + chaque état.il est nécessaire de promouvoir en ce + domaine,une réglementation communautaire.aucune + négociation,à un niveau international,ne saurait remettre + en cause les avantages acquis,ni porter atteinte au + droit de négociations des syndicats au niveau de chaque + pays. + _les travailleurs doivent avoir le droit effectif et les + moyens de participer pleinement aux activités syndicales, + nationales et internationales.ils doivent disposer + pleinement du droit de grève sans restriction d'aucune + sorte.les organisations internationales et groupements + interétatiques (OIT,CEE,etc) doivent promouvoir les + instruments nécessaires à un libre exercice du droit + syndical et des droits sociaux et veiller à leur + application. + _des organismes représentatifs doivent être constitués + au niveau des sociétés multinationales avec droit + d'information et de consultation des représentants élus + des travailleurs et des organisations syndicales + de chaque pays,sur la politique sociale,la gestion + économique et notamment les résultats économiques,financiers + et la politique d'investissement menée par la société. + _pour assurer des garanties minimales aux travailleurs + en relation avec les problèmes nouveaux posés par le + développement accéléré des sociétés multinationales, + il est nécessaire de donner une portée plus effective et un + champ plus large aux normes internationales du travail + élaborées par l'OIT. + _les organisations internationales et groupements + interétatiques (OIT,CEE,etc) doivent promouvoir + les instruments nécessaires à un libre exercice du + droit syndical à l'extension des droits sociaux rendus + indispensables par le développement des sociétés + multinationales et veiller à leur application. + + le marché commun .. + + § favorable à une coopération englobant tous les pays + européens,y compris les pays socialistes,la CGT + réaffirme son opposition à la division actuelle de l'Europe . + § la CGT tient compte de la réalité que représente + le *marché commun ,mais elle considère que l'intérêt + national est d'assurer un meilleur équilibre et une + croissance plus saine de ses échanges,ce qui exige que + ses relations économiques,techniques et scientifiques + s'établissent avec tous les pays et soient réellement + fondées sur la base de l'avantage réciproque. + § assujetties aux plus puissants monopoles,les politiques + communautaires visent au renforcement de la domination + des grandes féodalités économiques et financières, + s'opposent à la maîtrise de l'économie nationale et + comportent des atteintes et des risques pour l'indépendance + nationale. + § face au *marché commun qui a favorisé un tel renforcement + et accentué les déséquilibres sectoriels et régionaux + mais s'est avéré incapable d'instaurer une politique + sociale prenant en compte les intérêts des travailleurs, + la CGT agit pour l'action commune des travailleurs et + des organisations syndicales d'Europe . + § les revendications et les réformes à partir desquelles + l'unité d'action doit se réaliser sont nombreuses.elles + concernent notamment $: + _s'agissant des revendications à avancer $: + _la garantie et la progression du pouvoir d'achat des + salaires,retraites,pensions et allocations;ce qui suppose + des mesures concrètes de nature à juguler la hausse des + prix et l'inflation; + _la sécurité de l'emploi et la garantie des revenus; + _la réduction de la durée du travail; + _l'allongement du temps de congés payés; + _l'amélioration des conditions de travail,de la protection + de l'hygiène et de la sécurité du travail,en général de + la qualité de la vie essentiellement dans les grandes + concentrations urbaines et industrielles; + _l'extension des libertés syndicales et des droits + démocratiques des travailleurs dans les entreprises ou + dans la vie publique; + _l'abolition de toute forme de discrimination entre + femmes et hommes,jeunes et adultes; + _l'égalité des droits dans tous les domaines pour les + travailleurs immigrés des pays membres et des pays + tiers; + _une véritable formation professionnelle et continue + en rapport avec les conditions actuelles; + _la mise en oeuvre d'une politique progressiste dans les + domaines de la sécurité sociale,de la santé,des prestations + familiales,de la retraite (sous le double aspect de + l'âge et des ressources garanties). + _s'agissant des réformes à proposer $: + _de convenir d'objectifs communs à atteindre dans le + domaine de la démocratisation des *institutions + communautaires; + _de présenter et de soutenir ensemble des propositions + concrètes de nature à faire échec à l'activité dominatrice + des firmes multinationales et dans l'immédiat,compte tenu + de la situation énergétique,de soumettre le cartel + international du pétrole à de strictes mesures de contrôle + conformément à l'intérêt général; + _de favoriser les échanges commerciaux,économiques, + scientifiques et culturels entre *états ; + _de stimuler la coopération,notamment dans l'informatique, + l'aéronautique et le nucléaire,de telle façon que + prédominent les intérêts généraux,ce qui implique la mise + en cause de l'utilisation des fonds publics pour le + financement de sociétés privées; + _de soutenir d'un commun accord l'idée de nouvelles + relations entre les pays de l'Europe et les pays en voie + de développement sans que ces relations puissent gêner + en aucune façon les relations bilatérales; + _de contribuer ensemble à la détente,à la sécurité collective + et à la coexistence pacifique des pays d'Europe de + systèmes économiques et sociaux différents. + § il s'agit d'un ensemble de revendications urgentes + et cohérentes qui peuvent être prises en compte par le + mouvement syndical au niveau de la CEE et qui s'inscrivent +dans le développement des luttes de la classe + ouvrière en Europe occidentale .la défense de ces + revendications exige une coopération accrue et l'action + unie des syndicats de l'ensemble des pays de la + *communauté . + + + + + + + + + la CGT poursuit son action pour une démocratie économique + et politique et pour le socialisme .. + + § accentuant tous ses effets nocifs,la crise qui + s'approfondit rend plus que jamais nécessaire de promouvoir + un type de développement économique et social reposant + sur une large participation des travailleurs et des masses + populaires et apportant une réponse véritable à leurs + besoins. + § pour réaliser des changements réellement novateurs dans + le domaine économique,politique et social correspondant + à l'intérêt national,à celui des travailleurs et des + grandes masses de la population,il est urgent et + indispensable d'imposer des solutions d'un contenu + fermement dirigé contre la domination des monopoles. + § la CGT a longuement déployé tous ses efforts pour + que se réalise l'alliance des forces de gauche sur une + telle base. + § elle s'est félicitée de la conclusion du *programme commun de + gouvernement entre le PCF,le PS et le mouvement des + *radicaux de gauche qui a ouvert les perspectives + d'une démocratie économique et politique réellement + nouvelle,permettant de retirer aux monopoles les moyens + de leur puissance,de maîtriser des leviers de commande + essentiels de l'économie et de les remettre à la *nation + et d'assurer ainsi la mise en oeuvre des mesures sociales + hardies répondant aux revendications des travailleurs. + § la CGT a apporté et elle apporte au *programme commun , + son plein soutien.par ses dispositions fondamentales, + il correspond, en effet,aux objectifs élaborés par les + instances de la CGT et définis à partir de ses propres + préoccupations syndicales. + § ces dispositions fondamentales du *programme commun + sont rendues encore plus urgentes pour apporter une + issue positive à la crise et elles constituent la base + indispensable à la réalisation d'un changement profond et + durable qui soit réellement novateur.à partir de ces + dispositions fondamentales,il est possible de le + perfectionner et de l'enrichir encore,ainsi que d'actualiser +ses dispositions conjoncturelles. + § assurer la satisfaction des revendications populaires, + fonder le développement économique sur le progrès social, + établir un cadre institutionnel démocratique dans lequel + les masses populaires et avant tout la classe ouvrière + pourront exercer leur influence,c'est l'objectif de + la démocratie économique et politique dont le contenu et + les moyens ont été précisés par les précédents congrès + de la CGT. + § le 39ème *congrès confédéral rappelle les mesures + essentielles,qui sont indispensables pour promouvoir + un autre type de développement économique et social + et qui sont maintenant substantiellement prises en + compte dans le *programme commun . + + démocratie économique .. + + § les changements à promouvoir visent à dégager les moyens + indispensables pour répondre aux revendications des + travailleurs et à faire de la politique sociale un facteur + de plus en plus essentiel du développement économique. + les mesures déterminantes à mettre en oeuvre sont : + + la nationalisation démocratique .. + + § la maîtrise des instruments décisifs du développement + économique doit être donnée à la *nation .ce qui exige que les + grands moyens de production et de contrôle du crédit + soient soustraits à l'emprise des féodalités économiques + et financières. + § c'est pourquoi la CGT s'est prononcée pour la + nationalisation démocratique des secteurs clés du + crédit,des banques et des compagnies d'assurances, + de la sidérurgie,de l'industrie du pétrole et de + l'énergie atomique,dans toutes ses composantes des groupes + dominants de l'électronique,de la grande industrie + chimique et pharmaceutique,de la construction des grands + moyens d'équipement,des industries aéronautiques, + aérospatiales,d'armement,de la construction automobile et + de la marine marchande. + + la gestion démocratique .. + + § la large et effective participation des travailleurs + et des organisations syndicales à la gestion des + entreprises publiques et nationalisées,constitue + un élément décisif pour assurer leur pleine efficacité + économique et pour répondre aux besoins des travailleurs + et des masses populaires.elle répond pleinement aux + aspirations légitimes des travailleurs à participer + à l'orientation,à la gestion et au contrôle des entreprises + nationalisées. + § assurant leur intervention active dans la détermination + des objectifs économiques de la politique sociale de l'entreprise +nationalisée,la gestion démocratique est une + condition primordiale de la démocratie économique. + § en ce domaine,le 37ème *congrès de la CGT et + ultérieurement le document de "réflexions et de propositions + de la CGT sur la gestion démocratique dans les + entreprises",ont précisé,de manière détaillée,les mesures + à mettre en oeuvre pour assurer et garantir le + caractère pleinement démocratique de la gestion des + entreprises nationalisées.à cet effet,il convient + essentiellement de promouvoir $: + _de larges droits pour les travailleurs,leurs représentants + élus et les organisations syndicales,leur donnant les + moyens d'exercer un contrôle efficace dans l'orientation, + la conduite et le contrôle de la politique générale et + sociale de l'entreprise.ce qui requiert des prérogatives + étendues comportant le droit et le devoir d'information + sur la politique de la marche de l'entreprise dans tous + les domaines de son activité; + ce qui nécessite des droits suffisants permettant la + consultation et l'intervention active des travailleurs + et de leurs représentants élus et la création des + instances nécessaires à l'exercice de ces droits aux + divers échelons de l'entreprise.un statut du personnel + de contenu progressiste,élaboré avec les organisations + syndicales,garantira l'emploi,la rémunération,les droits + du personnel,l'exercice du droit syndical et des droits + des travailleurs et donnera les moyens pour qu'ils participent + au règlement des questions relatives aux conditions de + travail sous tous leurs aspects; + _une autonomie effective de gestion des entreprises + nationalisées dans le cadre du plan et leur assurant + une large initiative dans les divers domaines de la + gestion financière,technique et commerciale et de la + politique sociale; + _une pleine et entière responsabilité du *conseil d'administration +qui aura notamment dans ses attributions + la nomination du personnel de direction; + _une composition démocratique de ce *conseil d'administration +comprenant des représentants du pouvoir + central,des représentants syndicaux élus par les + travailleurs,des représentants de certaines catégories + d'usagers et des collectivités locales ou territoriales. + + une planification démocratique .. + + § la nationalisation des secteurs clés,la maîtrise des + moyens d'action économique essentiels de l'*état par + un pouvoir démocratique fondent la possibilité de + promouvoir une planification démocratique.cette planification + est indispensable pour permettre un développement + progressiste d'ensemble de l'économie pour réaliser + sa cohérence,pour s'attaquer aux déséquilibres engendrés + par les monopoles et pour assurer le respect des + objectifs sociaux et pour élever d'une manière + continuelle le niveau et les conditions de vie. + § en matière économique,la planification démocratique + est le complément nécessaire et indispensable de la + nationalisation démocratique,pour réaliser une véritable + démocratie économique et politique à l'échelle de la + *nation ,pour assurer la cohérence d'ensemble du + développement économique,pour éliminer les disparités + et distorsions engendrées par les monopoles dans le + domaine économique et social. + § la participation des travailleurs et de leurs + organisations syndicales à l'élaboration du plan, + au contrôle de son exécution est indispensable et constitue + une condition essentielle de son contenu réellement + démocratique et de la réalisation des objectifs sociaux + qui doivent constituer le fondement même de la planification + démocratique.ce qui implique à tous les échelons la + participation des organisations syndicales et qu'elles + disposent des informations les plus complètes. + la participation démocratique des travailleurs et de leurs + organisations syndicales s'exercera à l'échelon national + dans les grandes entreprises nationalisées,mais également + au plan régional,départemental,et municipal ainsi que + dans les institutions de recherche et d'enseignement. + les attributions des diverses instances de la planification + devront être définies démocratiquement,assurer une + représentation satisfaisante des travailleurs et prévoir + les droits et moyens leur permettant d'assumer pleinement + leur rôle. + § l'élaboration du plan,son adoption et le contrôle + de son exécution devront constituer une attribution + essentielle de l'*assemblée nationale . + § la démocratisation de l'économie est inséparable de + l'élargissement des droits en matière économique des + comités d'entreprise et des organismes similaires + tant dans les entreprises nationalisées,les administrations + que dans les entreprises privées.dans ces dernières, + l'extension des attributions des comités d'entreprise + devra leur permettre de contrôler que l'activité de + l'entreprise est conforme aux options du plan démocratique + et respecte la politique économique assurant sa mise + en oeuvre,notamment dans le domaine des prix,du crédit + et de la fiscalité. + + démocratie politique .. + + § démocratie économique et démocratie politique sont + étroitement liées et complémentaires.s'attaquer à la + domination des monopoles,mettre en oeuvre les changements + structurels indispensables,satisfaire les revendications + des travailleurs nécessitent un pouvoir politique + d'origine et d'orientation démocratique et des changements + institutionnels correspondants. + § ceci exige conjointement $: + _un cadre institutionnel démocratique,ce qui suppose l'abrogation +de toutes les dispositions sur lesquelles + se fonde le pouvoir personnel; + _la séparation et l'équilibre des pouvoirs issus du + suffrage universel; + _une extension des libertés fondamentales et leurs + garanties tant en ce qui concerne les libertés collectives + qu'individuelles; + ce qui implique $: + _la garantie du droit de grève,de manifestation et de + réunion; + _la garantie du droit d'association et pour les partis et + groupements politiques,la garantie de pouvoir se former + librement et de déployer leur activité dans le respect + de la légalité; + _la liberté de la presse et un droit à l'information + assurant notamment l'attribution d'un temps d'antenne + régulier aux grandes centrales syndicales; + _le renforcement de la protection des libertés individuelles + et des droits du citoyen. + + rassemblement populaire pour la victoire du programme + commun .. + + § la CGT a engagé toutes ses forces dans la lutte + pour la démocratie économique et politique.le soutien + massif que le peuple de France a apporté au *programme + commun lors de l'élection présidentielle,le grand espoir + soulevé par la possibilité de voir accéder la gauche + au pouvoir pour y appliquer son programme,créant une + situation nouvelle,favorable pour gagner des millions + de consciences nouvelles à la nécessité du changement + démocratique. + § dans ces conditions nouvelles,la CGT poursuivra + inlassablement son action pour une démocratie économique + et politique.elle déploiera tous ses efforts pour + développer l'action commune sur des buts concrets et + promouvoir le grand rassemblement populaire,indispensable + à la victoire du *programme commun . + § la CGT développera son activité pour s'opposer à + toutes les tentatives et manoeuvres que développe et que + multipliera la bourgeoisie pour tenter de dissocier +l'alliance de la gauche et surtout pour s'efforcer de la + vider de son contenu antimonopoliste. + + les perspectives du socialisme pour la France .. + + § le régime capitaliste fait apparaître d'une manière + aiguë et massive,ses tares et ses absurdités,son + incapacité profonde à résoudre les problèmes fondamentaux + de notre époque. + § le socialisme représente l'avenir de notre société. + son idée progresse dans les consciences et prend un + caractère de masse. + § dès sa fondation,la CGT s'est assignée de transformer + la société capitaliste en mettant un terme à l'exploitation + capitaliste.son 37ème *congrès a encore précisé ce but + dans les statuts.le socialisme est le système économique + et social où l'exploitation de l'homme par l'homme est + bannie.son but est de répondre aux besoins matériels + et intellectuels grandissants des travailleurs et du + peuple,de créer les conditions susceptibles de libérer + l'homme de toutes les oppressions économiques,sociales + et culturelles et de permettre l'épanouissement complet + de ses facultés et de sa personnalité. + § la CGT estime que la définition des voies et moyens + pour parvenir au socialisme en France ,ainsi que des + mécanismes,organes,institutions et modalités de la gestion + et de la vie sociale qui sont à promouvoir pour son + édification,doivent être l'oeuvre commune des formations + politiques et syndicats intéressés. + § pour sa part,elle est prête,en tant qu'organisation + de classe la plus intéressée à l'instauration du socialisme, + à y contribuer dans le respect de son caractère d'organisation + de masse et avec ses vues propres résultant de sa spécificité + d'organisation syndicale. + § le document "thèmes de réflexion sur les perspectives du + socialisme pour la France et le rôle des syndicats" + a exposé les principales idées communes aux organisations + de la CGT.sa discussion a conduit à une large approbation + de son contenu par les organisations de la CGT et + par les travailleurs.il conserve pleinement sa valeur. + § les réflexions exposées dans ce document constituent + la base commune aux organisations de la CGT pour + la poursuite de la réflexion et de la discussion tant + avec les travailleurs qu'avec les forces intéressées + à ce but et pour laquelle la CGT demeure disponible. + § elles constituent la base de sa contribution à la + nécessaire élaboration de positions communes rassemblant + les forces qui luttent pour le socialisme. + § en même temps qu'elle engage toutes ses forces dans + la lutte pour la démocratie économique et politique + afin de réaliser les changements qu'il est urgent + d'apporter à la société,la CGT agit pour gagner toujours + plus de travailleurs à l'objectif du socialisme et + pour que mûrissent les conditions susceptibles d'en + rapprocher le terme pour notre pays. diff --git a/autres/Rlib/textometrieR/data/bfm.R b/autres/Rlib/textometrieR/data/bfm.R new file mode 100644 index 0000000..8411f35 --- /dev/null +++ b/autres/Rlib/textometrieR/data/bfm.R @@ -0,0 +1,4 @@ +## Adv in the 5 discourse types of the BFM corpus (Base de français médiéval). +bfm <- matrix(c(103000, 23429, 15345, 11, 16517, 1370887, 413441, 194894, 119, 270676), nrow=2, byrow=TRUE); +rownames(bfm) <- c("ADV", "other"); +colnames(bfm) <- c("litteraire","historique","didactique","juridique", "religieux"); diff --git a/autres/Rlib/textometrieR/data/corpus.tiny.cooccurrences.R b/autres/Rlib/textometrieR/data/corpus.tiny.cooccurrences.R new file mode 100644 index 0000000..0de3b1a --- /dev/null +++ b/autres/Rlib/textometrieR/data/corpus.tiny.cooccurrences.R @@ -0,0 +1 @@ +corpus.tiny.cooccurrences <- factor(c("S", "S", "F", "G", "S", "F", "F", "G", "S", "S", "F", "G", "F", "S", "S", "S", "F", "S", "G", "F", "S", "S")); diff --git a/autres/Rlib/textometrieR/data/robespierre.R b/autres/Rlib/textometrieR/data/robespierre.R new file mode 100644 index 0000000..b29e4fb --- /dev/null +++ b/autres/Rlib/textometrieR/data/robespierre.R @@ -0,0 +1,17 @@ +de <- c(464, 165, 194, 392, 398, 235, 509, 96, 58, 662); +peuple <- c(45, 18, 15, 14, 53, 30, 42, 16, 4, 59 ); +republique <- c(35, 10, 16, 29, 29, 9, 21, 14, 2, 42 ); +ennemi <- c(30, 13, 11, 19, 22, 10, 16, 7, 2, 35 ); +patrie <- c(6, 5, 16, 8, 23, 10, 35, 8, 3, 39 ); + +robespierre <- matrix(c(de, peuple, republique, ennemi, patrie, rep(0, 10)), nrow=6, byrow=TRUE) +tokens <- c("de", "peuple", "republique", "ennemi", "patrie"); +rownames(robespierre) <- c(tokens, "others"); +colnames(robespierre) <- paste("D", 1:10, sep=""); + +partSize <- c(8395, 2558, 3920, 6903, 7896, 4555, 10142, 2063, 1084, 13933); +robespierre[6,] <- partSize - colSums(robespierre); + +rm(list=c(tokens, "partSize")); +rm("tokens"); + diff --git a/autres/Rlib/textometrieR/inst/CITATION b/autres/Rlib/textometrieR/inst/CITATION new file mode 100644 index 0000000..2810e9a --- /dev/null +++ b/autres/Rlib/textometrieR/inst/CITATION @@ -0,0 +1,14 @@ +citHeader("To cite 'textometrieR' in publications use:") + +citEntry(entry="article", + title="The textometrieR software package for textual corpora description", + author=personList(as.person("Sylvain Loiseau"), as.person("Matthieu Decorde")), + journal="", + volume="", + pages="", + year="", + url="", + textVersion=paste("", + "", + "", + "", sep="")) diff --git a/autres/Rlib/textometrieR/man/bfm.Rd b/autres/Rlib/textometrieR/man/bfm.Rd new file mode 100644 index 0000000..8bb2dd7 --- /dev/null +++ b/autres/Rlib/textometrieR/man/bfm.Rd @@ -0,0 +1,28 @@ +\name{bfm} +\alias{bfm} +\docType{data} +\title{ ~~ data name/kind ... ~~} +\description{ + Contingency table of the frequency of adverbs in the BFM (Base de Francais + M \' e di \' e val) \emph{vs} all other parts of speech in each of the five genre + (literary, historical, didactic, law, religious). +} +\usage{data(bfm)} +\format{ + The format is: + num [1:2, 1:5] 103000 1370887 23429 413441 15345 ... +} +%\details{ +% ~~ If necessary, more details than the __description__ above ~~ +%} +\source{ + BFM : http://w3.ens-lsh.fr/egerstenkorn/bfm/ +} +%\references{ +% +%} +\examples{ +data(bfm) +%## maybe str(bfm) ; plot(bfm) ... +} +\keyword{datasets} diff --git a/autres/Rlib/textometrieR/man/cooccurrences.Rd b/autres/Rlib/textometrieR/man/cooccurrences.Rd new file mode 100644 index 0000000..4b5990d --- /dev/null +++ b/autres/Rlib/textometrieR/man/cooccurrences.Rd @@ -0,0 +1,30 @@ +\name{cooccurrences} +\alias{cooccurrences} + +\title{ compute association score beteen tokens } +\description{ +Compute association between pairs of words in a text. Not implemented yet. +} +\usage{ +cooccurrences(corpus) +} + +\arguments{ + \item{corpus}{ The number of cooccurrences found in a given unit (phrase, sentence, paragraph) between \code{type1} et \code{type2} } +} + + +\value{ + +} + +\references{ +Lafon P. (1981) <<~Analyse lexicom\'etrique et recherche des cooccurrences~>>, \emph{Mots}, pp. 95--148, n~3. +See http://www.persee.fr/showPage.do?urn=mots\_0243-6450\_1981\_num\_3\_1\_1041 +} + +\author{ Sylvain Loiseau } + +\examples{ + +} diff --git a/autres/Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd b/autres/Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd new file mode 100644 index 0000000..474467b --- /dev/null +++ b/autres/Rlib/textometrieR/man/corpus.tiny.cooccurrences.Rd @@ -0,0 +1,35 @@ +\name{corpus.tiny.cooccurrences} +\alias{corpus.tiny.cooccurrences} +\docType{data} +\title{ testing data set for cooccurrences function } +\description{ + + A vary basic representation of a text for illustrating cooccurrences computing + +} +\usage{data(corpus.tiny.cooccurrences)} +\format{ +} +\details{ + + Data frame containing three values, "S" for sentences boundaries, "G" and + "F" for two phenomena whose cooccurrences inside sentences are observed. + +} +\source{ + + Lafon P. (1981) Lexicom \' e trie et cooccurrences, Mots, 2, pp. 120. + +} +\references{ + + Lafon P. (1981) Lexicom \' e trie et cooccurrences, Mots, 2, pp. 95-148. + +} +\examples{ + +data(corpus.tiny.cooccurrences) +#cooccurrences.corpus(corpus.tiny.cooccurrences); + +} +\keyword{datasets} diff --git a/autres/Rlib/textometrieR/man/pareto.Rd b/autres/Rlib/textometrieR/man/pareto.Rd new file mode 100644 index 0000000..37f2c9a --- /dev/null +++ b/autres/Rlib/textometrieR/man/pareto.Rd @@ -0,0 +1,21 @@ +\name{pareto} +\alias{pareto} + +\title{ Draw a pareto graphic of lexical distribution } +\description{ + Draw a pareto graphic of lexical distribution +} +\usage{ +pareto(x) +} + +\arguments{ + \item{x}{ named vector of frequencies } +} + +\value{ + a plot +} + +\author{Sylvain Loiseau} + diff --git a/autres/Rlib/textometrieR/man/robespierre.Rd b/autres/Rlib/textometrieR/man/robespierre.Rd new file mode 100644 index 0000000..7207e74 --- /dev/null +++ b/autres/Rlib/textometrieR/man/robespierre.Rd @@ -0,0 +1,45 @@ +\name{robespierre} +\alias{robespierre} +\docType{data} +\title{ Robespierre's discourses } +\description{ + A lexical table containing the frequencies of 5 words in 9 Robespierre public + discourses (between november 1793 and july 1794). +} +\usage{data(robespierre)} +\format{ + The format is: + num [1:6, 1:10] 464 45 35 30 6 ... + - attr(*, "dimnames")=List of 2 + ..$ : chr [1:6] "de" "peuple" "republique" "ennemi" ... + ..$ : chr [1:10] "D1" "D2" "D3" "D4" ... +} +\details{ + + The last line of the table give the total frequency of all the other forms in + each of these discourses. + +} +\source{ + + Lafon P. (1980) Sur la variabilit \' e de la fr \' e quence des formes dans un corpus, Mots, 1, pp. 127--165. + +} +\references{ + + Lafon P. (1980) Sur la variabilit \' e de la fr \' e quence des formes dans un corpus, Mots, 1, pp. 127--165. + +} +\examples{ +data(robespierre) + +## See graphic in Lafon, 1980 : 140 + +t <- colSums(robespierre)["D9"]; # size of the part +T <- sum(robespierre); # size of the corpus +f <- rowSums(robespierre)["peuple"]; # total frequency of "peuple" +p <- dhyper(1:15, f, T-f, t) +plot(p, type="h", main="Probabilities of various frequencies of 'peuple' in discourse 'D9'", xlab="Frequency of 'peuple'", ylab="Prob(k)"); + +} +\keyword{datasets} diff --git a/autres/Rlib/textometrieR/man/specificites.Rd b/autres/Rlib/textometrieR/man/specificites.Rd new file mode 100644 index 0000000..c2b263f --- /dev/null +++ b/autres/Rlib/textometrieR/man/specificites.Rd @@ -0,0 +1,58 @@ +\name{specificites} +\alias{specificites} + +\title{ Compute specificites association score } +\description{ + + Compute specifities association score, i.e. an indicator of the association + between tokens and sub-corpus, given a lexical table + +} +\usage{ +specificites(lexicaltable, types=NULL, parts=NULL) +} + +\arguments{ + + \item{lexicaltable}{ a complete lexical table, i.e. a numeric matrix where + each line is a token and each column a part of a corpus. Each cell give the + frequency of the given token in the corresponding part of the corpus. } + + \item{types}{ Indicate for which rows the specificity index must be computed. + If \code{NULL}, the specificity index is computed for every form. If + \code{types} is a character vector, it indicates the name of the row of + \code{lexicaltable} to be used (an error is thrown if \code{clt} has no row + names). If it is an integer vector, it indicates the index of the row to be + used.} + + \item{parts}{ Indicate for which columns the specificity index must be computed. + If \code{NULL}, the specificity index is computed for every part. If + \code{parts} is a character vector, it indicates the name of the columns of + \code{lexicaltable} to be used (an error is thrown if \code{clt} has no + column names). If it is an integer vector, it indicates the index of the + column to be used.} + +} + +\value{ + +The fonction return a matrix of \code{nrow(clt) * ncol(clt)} (the number of +rows and columns may be reduced using \code{types} or \code{parts}), each cell +giving the frequency index. + +} + +\references{ + Lafon P. (1980) Sur la variabilit \' e de la fr \' e quence des formes dans un corpus, + Mots, 1, pp. 127--165. +} + +\author{Sylvain Loiseau} + +\seealso{ \code{\link{specificites.probabilities}}, \code{\link{specificites.lexicon}} } + +\examples{ +data(robespierre); +specificites(robespierre); +specificites(robespierre, types="peuple", parts=c("D9", "D10")); +} diff --git a/autres/Rlib/textometrieR/man/specificites.lexicon.Rd b/autres/Rlib/textometrieR/man/specificites.lexicon.Rd new file mode 100644 index 0000000..8d2c87e --- /dev/null +++ b/autres/Rlib/textometrieR/man/specificites.lexicon.Rd @@ -0,0 +1,29 @@ +\name{specificites.lexicon} +\Rdversion{1.1} +\alias{specificites.lexicon} + +\title{ +specificites association score with two frequency list. +} + +\description{ +Compute specificites association score between a lexicon and a sub-lexicon +} + +\usage{ +specificites.lexicon(lexicon, sublexicon) +} + + +\arguments{ + \item{lexicon}{ a frequency list (named vector) } + \item{sublexicon}{ a frequency list (named vector) } +} + +\value{ + specificites index as a named vector. +} + +\seealso{ + \code{\link{specificites}} for specificites score and reference +} diff --git a/autres/Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd b/autres/Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd new file mode 100644 index 0000000..97796c1 --- /dev/null +++ b/autres/Rlib/textometrieR/man/specificites.lexicon.probabilities.Rd @@ -0,0 +1,28 @@ +\name{specificites.lexicon.probabilities} +\Rdversion{1.1} +\alias{specificites.lexicon.probabilities} + +\title{ + Raw hypergeometric probabilities +} +\description{ + Raw hypergeometric probabilities for computing specificites, see \code{\link{specificites.lexicon}} +} +\usage{ + specificites.lexicon.probabilities(lexicon, sublexicon) +} + +\arguments{ + \item{lexicon}{See \code{\link{specificites.lexicon}}} + \item{sublexicon}{See \code{\link{specificites.lexicon}}} +} + +\value{ + Hypergeometric probabilities. See \code{\link{specificites.lexicon}}. +} + +\author{ Sylvain Loiseau } + +\seealso{ + See \code{\link{specificites.lexicon}} +} diff --git a/autres/Rlib/textometrieR/man/specificites.probabilities.Rd b/autres/Rlib/textometrieR/man/specificites.probabilities.Rd new file mode 100644 index 0000000..b4aeac6 --- /dev/null +++ b/autres/Rlib/textometrieR/man/specificites.probabilities.Rd @@ -0,0 +1,30 @@ +\name{specificites.probabilities} +\Rdversion{1.1} +\alias{specificites.probabilities} + +\title{ + Raw hypergeometric probabilities +} +\description{ + Raw hypergeometric probabilities, used for computing specificites (see \code{\link{specificites}}). +} + +\usage{ +specificites.probabilities(lexicaltable, types = NULL, parts = NULL) +} + +\arguments{ + + \item{lexicaltable}{ see \code{\link{specificites}} } + + \item{types}{ see \code{\link{specificites}} } + + \item{parts}{ see \code{\link{specificites}} } + +} + +\seealso{ + + see \code{\link{specificites}}. + +} diff --git a/autres/Rlib/textometrieR/man/textometrieR-package.Rd b/autres/Rlib/textometrieR/man/textometrieR-package.Rd new file mode 100644 index 0000000..11aa774 --- /dev/null +++ b/autres/Rlib/textometrieR/man/textometrieR-package.Rd @@ -0,0 +1,53 @@ +\name{textometrieR-package} +\alias{textometrieR-package} +\alias{textometrieR} +\docType{package} +\title{ +Statistical exploration of textual corpora +} +\description{ +Statistical exploration of textual corpora using several methods +from french 'lexiometrie' and french 'Data Analysis' schools. It includes +methods for exploring irregularity of distribution of lexicon (or other +features) accross parts of texts; multidimensionnal exploration ('Analyse +des correspondances'), etc. +} +\details{ +\tabular{ll}{ +Package: \tab textometrieR\cr +Type: \tab Package\cr +Version: \tab 1.0\cr +Date: \tab 2009-01-18\cr +License: \tab GPLv3\cr +Depends: \tab R (>= 2.5.0)\cr +Packaged: \tab Thu Mar 12 17:00:01 2009; sloiseau\cr +Built: \tab R 2.7.1; ; 2009-03-12 17:00:03; unix\cr +} + +Index: +\preformatted{ +pareto Draw pareto graphic +specificites Compute specificites indices of association between words and subcorpus +repartition compute repartition graph +} +% ~~ An overview of how to use the package, including the most important ~~ +% ~~ functions ~~ +} +\author{ +Sylvain Loiseau, Lise Vaudor, Matthieu Decorde +% ~~ The author and/or maintainer of the package ~~ +} +\references{ +%~~ Literature or other references for background information ~~ +} +%~~ Optionally other standard keywords, one per line, from file KEYWORDS in ~~ +%~~ the R documentation directory ~~ +\keyword{ package } +\seealso{ +%~~ Optional links to other man pages, e.g. ~~ +%~~ \code{\link[:-package]{}} ~~ +} +\examples{ +data(robespierre); +specificites(robespierre); +} diff --git a/autres/Rlib/textometrieR/tests/.RData b/autres/Rlib/textometrieR/tests/.RData new file mode 100644 index 0000000000000000000000000000000000000000..5a0fbeeac23ed9dad39026cb43c315f4365b7a32 GIT binary patch literal 2221 zcmV;e2vYYSiwFP!000001I=2?ZyQAzUpt9oJ4u^1Ee$0p+qCH;ZIdQVnkMAoG)YTe zLP`;;!~w?kCSG+P?mn7Sfan2$tIw#^*LLXA^U7 zV9rh4co%ow!kpWJDr?BoTXq4h5!{xYIh5S0=ANJ)=ffPZCXND&Uf z={tnR4F+TV{(N0QtwK|An;QOBwv?t@)zn9B*smCdqO0L(;8-f`^AogSIt|6bTcnJ* z`HktYH50b3gss`IH5az7hOPOqbuDZypjOw$v=zE;nLC{I3c44(J=Aj`=)s?eH@XeW+(qev z3JSihm<$e)vF$~dod1}rGZ$BliNoYcqVs4dm zlPjm;>WZb-I9&xzF?O7WL~x}|Zsk$?6yq1n&$aREVR}9@m&G%gS%WHDE!A*H$2hB0 zQVDsqX6o=xpeu$0tS1EFjXBxs3>!$rs%{hRdESUJtS}=8!E+zUN82%*97mjc zzoE#;PqOaXjtm=%+U9*zS7b|h z1cT`)b=iN!A)DK>6U_l&DY9WY@C8oRiuJWcPS8Zf+= zR$-)dn2U-9qY4Zr^eH`3-fh5gY{LS(R1t8Ra};JNkLLGT9?f@9Tf{8u@hxK(77ngz zp!SdqIK~9*TAIx0sS`J{5snS+SB<*TRE#<>YP=_ixhcY&;qJBxN;OCq85L*KsC+P} z$v-lb9pI>sDMf~uSiF-(T+_7Gs5o*WuPk>UxDW{D$Sc%MH&S+GNm!h4YlyBeQ6sA~ z8xUbFajLR257UX0(7(XxXCv88>s3bfIyIJ8y3h0G@hUNaE$n)%Evp%9$ogmT`ITv=+;Q zo$2JwQeK)%@RG>0xO^;f=Fm~+7Qg+l_^ma71!@l7`NdW`8Fbk?k~O+p@#r>y4a+zg z#vv$MWnk3(^M1@P{KjCNx8r)ZFj<9ta;UZZSgARtm7&VLOtmLy?Lt1wC#BA~mpWdSc*VtD01B{7 z+_4nk;4<-Yn`}7B)l~<3{4Fq;HN9uHV*16(SO{QM_#NJ7pfM2u697doCmYyTtg)9C z-F3^q%$Ftda8@9HlOunVmM_q+9We1;`-&3h7CR>c2#scqk{E;_c(WknzeoR%L8#Qu zn*D;1Z^SDAp_0HT9tfp2>Q#dfy~*zg^6F65oS9oUHCH#%Z*G`M?ViBgrrJZS*E)ts zFNf1YWCw`jKbAy_dSSck@l&A8O^(c)Y;@Y747neEN|?jcfEZwho|MSvC4X)#B}8)t zDaegTCApe~d(wg30CG$tINdzp@!B;%-`HR=PF{-@ib~&+?39F(I>)^m&Jxw vNcun8EoA*wb1*-T4|fkBd~jHc{roumv2pm*;_JAvjA zyYrs(c9B2=H9xHf?)==jbLY;?ojX5oR;Ru>@APATwfOrg%WYIS>g?!j<#FH*#0ld3 zN?nGC3vhOHbW|giLiBC-2h;<aGA9V~aprV0!5*H6p%hV$i&J_?p~f z|7ZlhaQSJ5mjf3unWNMW)IO+ot1gjaw?EPIZ&2S9J*6 z)HcPBELeSv%Q$bo?LbOif_#N>IkAR1mA~MKjD5>Z2J#D+@S_&6Qb8|4Fy8xZ^zY( z3~_^FHG&SVLCjG9g4CCwKd?mGdwPdrXa4fRDS^ButiVZfdP{pjIi9BHL~kZaUIX?s;% z^{L;JT-QWWK{XCP&F+{mH)oREW$r>uY8dCDzbGnRTU;EtuA|hBE^}WARe)i)5!cwRAgeBo8LzIkcD%w0EKlnk722h( z`t71pt+Sk|KE{Pnn$}?!4W!~lXrD8=%)L^5T$x!kR&QkzUZp<4)l`tEF^k_gW|@19 z`b(~{*_2MMPVzeSxZ2=ooyA%D$7cDVy0?jbl0^+{Vxjb`G2f=To2I#wmaTaLe3z z>a*NXN&2*GkCb{twnsE0bR#D5G%JFCU62>Vb4pJ{KN+4}C!+tqj5j!I#+>fwT#UE$ z!!PU%8~@2k@SmCl|M(>M*%RWicw&rAy`z?@b-mD)3Gv)`8>&d}pe_1`U2f%1=ZrF( zm-a}QpLR<)KRruAl~xiiNav2mWCgn)>tc+1cv$WDaH=Oc_z<@FMKE}uGu)`da4&-X zar3Vow-VfBpB;VH@TzB_m_^SR>MixEY|3FYP)5Z8U4U-DPCx>%3-B&L51L9$a3^3N;4Z*^^v(8$()!`<-H0^|mTu|o?m?_^hmC8h zD{W5f=|x|)H?1#iiVycmG%Qh2wl$ST`{IL$ZQfzWT88X0ZHe;I=44+A*>yw09HrY5 zAwiB}XYDLi9?wmBf922EU(Ipx zq@*3sUQ0pPfKqd1>*0gH6Z=VSL*~KfIm@fw`sC05c}rJYZKvQ@3x19GM+B3W)0*bF z5-Ni2in<3m&$?L`MY>n0?-TzqDi(vB1xULkZD33E z3uL;rq6v|7f*_eL$~14#v(-=hItI9u&X1E?X~G_9Mv-$N13y6 zJiBJ&IQ6n|81r**9KUQj&YNr;$21$qvvD?#isQunMo!U&S_HgOI^{x&eV|i0NU`-g zc4$r{*EWvDT@4qTY7tVranPwkq}Yc#bp_(sj9RJ1Nb$abdF9?R68jH zTIPPn&xll~4l}NHi0`F;N@RXqw?$+=zDsg%pdWje#7o52ala)qb+iDQt`ud?(J~hb zpUADGPfObeh8TbG0s5zR3ZJ;-O8+a}&!%9uihl?Fh#n)6`KYujEv0lnD=8b;M@rq# zu^z^i=Aip|EitApwZM{@GpRssnjHk8Cw@5rie?X+N zB&j2&P5Sw`$ZTr;k$y1sC`;>(?Iooty?sLZIW014-Oyz%ecMh-RcOh~`Cgz_z^BZ) zTIPWxLL<7T$LrVtF|l_`Ez;_d+ZYe*r|%bez>}Oe(LW(vrPP45C?@{MJ0-V>z9}>#(w2Q9b41I0lkm}$WsHwVFR2PkX4=jI zxus-3&(bpYh|Fr6aE{Rr$Q<-P$hg*-(;~C~Zer3}H?+)K1S8|3XKPxdI-_OQb5JSr z5t)z6O!?6LEOlJ#v)Bz&_^l9m(V=@PI|7a_h7OftUTurI_;gs}-(*3MuZXlnCjIX9ty3g%7 z$aSbdZh|TEY%TLE(kI$(XqnT}>KFe+r0S%vZJl4FjR?IGTdGGVEi#+8lTy!6YwT_$ zM$fE>=zL5@N=ZMTmYF^xwoYjszDjBoZs>E}&s;4F!GWi0F@B za!+ZUzlAh<#QmblXJn)v7acn;b5@ByN3@<42~Rx-?KQfNQQJmcZ$$dpD`Sz?<1UmZq@M?*Mdp1hYl@uOK1Xyv zE8_K7%N+bR^!PNC;|xwaf2}6^x6zfao}@Wc5qg%p5<90H9p`ohZuB)ps`Y>`8S?S1 zy(f`K1*v)eJ8rw`!A0iKMc>0O#{D}FjhxT=@HjO&U$PqBj`|b$m%>Hr#W-HqvUjNG zQ>~vn)Nfh!Z^Czn?SO5NVMq<*V3$HTbytY`X@9w=m}>ppzcyP(z)pN=Xh-dB2t!k^ zc8n4yCWCtes?AjEH$nRk06Hoj_nqtxw!!Abb&&1ixZ3^8dC7ACcmLe;^E;gV{f~Qj z`=rU;I@`#d`T4&8u{?J)MSx-e)138JS@Bf}uK}zEtO2YAlmf~CxNha;uxJhYtsGDR zs04%ooI<$MRn>rN0oMU=iK%J;8v#7#MgVnydO#G=0B8g>0X6}e0WE;*0q+2825bRr z1yI&Dgf{@T0onoE0XG6}0_*^g<`#tS1l$Vf0Ne)nBS0r028aW?0NsF{fCOL{;9Y1W;#FfMEdX??ku{aF>-nfbed>LBJskmqut5Km*Po@)eg- z|B8^>fbyeXN4PwP2(2U~55D?g<`g4+6!0YC2Fi}B9ZQWr1Ypk8ogbvEjOs_#)4W)N z*GjQ5jGx!(>bGDJH3JfBoGt9jR@ygKgtz?W`^RGM*D>U8&@o$j z1G*Pb2LSvR0#soJRAW|XOdul`wXoy4HWkAP%oA#Z?kmIKY;mQjJENn1^p3~}+b$#) zm6k?-#b0URnuS2OA)D5wXPE6sn~h_dcWYT}!4h|L=c;1M&9!pI8Z}jh(6aPb)A!!=16W=l_(A!3F03ly!R&Ud9V7cdGFclDzWChuXj50-tHO8jBQF{6TB@kG~AaOQfN%ua93Y%q}yyC z?lQeGEHQ!dP#{nlQo&$(W!0){=Bm7wT_z7FDmApKC|VaPQrDC<3?>H}l56kmSEjMR zGz!eHp#qzGhf*#5JKc$W>cybBy(i)7_f>C;_rEK#%3oAcUt*NCC;C<;x>J?0(2`iF z;vK5_Zv*8Y2~<=+6R5c6BZ11`Gl9xm3&T|(KU5gLwXmx4P~rMp3qKPK7$5)J{Z)?? z21oaQt@@F|@{?Z)2EJSPa?Q}${Ywu7!<{P+`3@ckJRf-U`rkbK^npl@@=>~RNYnHv$C;&r}4}OPF6j8@5$ z>%ab4bdE37vg~W$uJx7pJ{SGv8ehfwg>6jqN7wkC3IDfbe00SUPt`ZCKG1Mzxo04H z=-tbn>0IIoo(&}P*Le=ySL%7bv()oi)645T>pVYQ{e0(IPw3HG)_GoA=eY)1Ydsaq z*D&kNYdqiV+~5hfw%2-UJ=c1E{XA0ZFJG=x->mts6X9=1gVm1)HDdI&nrl5HpFgA4 z-LFmCkx|<~GJYk%-ap8`L(U+~8Fx0lGmIeH zna++M8!wK{qFZQ*%BHi^Zk0yv2mk%CC~g@_aM0+$W`39TZ#A}7cgZ#>j^jlfM~ZH2 zxh{E|u}T%)t3DJF6WZal{L;ZMX3Qj`(wq zxXGQi#b@xwG!jk#;USz94g)PGJ)QvRbeLmp!d)0Kvec(Aw&gARNGVwD5ic#Xa8{co z6@c$77qMs_JE=jTaCFNpSDMEhI8b-A8AxCa=&|KW_7uCx1}GiIvor!CnHU7_Rt-*W~L zH;e+$|0ke7WE4XB$GF|0oK&fj2d}PW4s8eBMCX4RT%9{zpA(Lpa{-f||E)fooVl)k zD(8Q_Hn5?;E4NCT5zb@%jJh^()zmTGPUx70D2OwR=Rhzgf2k`%LNPJp>zqc} z8j%NXw&RO^jH0PRkB`VfMYB(PQ}zj<@thvU-fnQ$QX^LeS7_9uTAcF%=rCU z|Mzj$S?lB}M|>6SgN08!;x8iZ2A)$ffZ1yAWvV!Hf#+T(V#R4^KIDj>am1TFnw~Vr z9r0f{;%&49mJE+O;<5}|_?x*TTk(ro|Lw9p*bCV45l6g`9~LbB1CID}j<^ZqYxl`M z#5s!$<0xVuSb)-SPvZLo4@YK068rNo(wVEeiB)}tx|sEUs(f8z`-)udD?%0L$l%;r zOkLibOuiM>GsM@O$+t2%Lws{H`G%`zh_5G;Z&l?C@trls*TZoO2141ob8+M5&EgxZ zo*BNgv-p;ucLzIlJkmc=(bLwa_3 z7T@af^U0fp?c_=I0}CP(*iCz`2FFfA7qXkhjNeW`r2?PkcbZ6*Hp`*>*E%+09GshitnUoS|{cwwo0*)DQkF zd%V7KX8LztCg1YF49$!DEWYJ4q-XQ9_=c_h#HH%Pf-Jt(Gh}xbX7a5FombDej;3*% z<4J@kJchVCxcP~5K4a?_0n`0zSd44&GJJO|#@mBpyq&og7w2`jI*;PbObgC{hj4X1 z5oQZ=qo8ZWdl^lmfB)QpGW->G7^N6%M63+&aW>;$F))0gHjFFyK4l^|j#Mu$<4xRQ z^4H@gN)F&(pJ3y72h$6Df7Uy$*C)6KE{Z3Z{S8^Ljllp91#h5)oCc4mMZdOOhwIyJ%+>gkMN4(?s}LBXxu*d=>h27WVz_jw3?a*wBP4e9G|TAcUx-v`LP zCuiP;oZ;+vD_-(o4qo<6_HJ|mdVM(SqgfF4XTEFlGNYq>S|*OyN-M=+`Oux?PeaLe z?*wcYxiaZSNBK&HPCkTbRt5N;GSMqfGClVL-{|OK*JLF|M|lZO*Gx%Y#ZBtyXaG^e z=z)Ks?)<-$&kp!)wud*46V=CYo(TWDz#p-n;Adr#p6kkuq=!dB3w^ z?emWuddHutM_jibJHE)qGvt?#hrV~@$kBz{f5|kGs`Za&t^Lx{Uq_z)?yvT@ed1%= zi6#kkB-HC<6e&usJ z|K!HqKlH2FkYhB*P@Ro?<9)+;ky7{)in#TY^;Z^;#X~`xVx7bkucTwbIu1G7w<^UHC&9uy6cg%mEr5 zT?7txds6u^L@wK$AM^1OBEQOW7xOH=*S%)P*xhJ0LP4>^i^JwGV2GP6R`x;u) z8)XAkd8FZ<^t?OM#yt%otol_Afr@A;mV5jPJQxVpo2B&)jg{$!y1Iqw`igXJ=x9UT zKwnR9cSlZXD81dCi}ks^wYscfGd7g?DfwV>DCymmGIR3H>au{>Z0$0hFgN#hofwP{ z-j&{fUmm;u{%DSxebdb zzh_bC!;6-VSG4=w;Xvk35Vn z97-?u%?TCGX)S)WXkKgW)wL_q_&sKBwATM+DCGs*!|zy)pWD+2Y13oC&e}2k@fV95 zaGDceCrtd0FDdw)I1NrV;8W2dpfUh_4&m+kVUVeX0R0&r`xqkNzN!QD^%vgCUs-)y zn_F%=6daFiX^C!Y zZ3hNo5W?^p!<UKVadeANU_uB#BI zECYR*%6curReE_xYg1E8v@sa$XuLVvxVfzH=0-M`VUb4c7 zU~P{=1hP5=3g_Z$HOqwA77PYV8%G+kF4oPC*C@meQ-Bus2poICs!!cv;r_-7+cb&g zQ-IB(Xh?2Nce{#=aN_q@klmV_=gw`m zg^o&v{=!*NTN6o6+jH(|COy>HQ!3*~lFmdPD?{g(SiELU}GR!Szg*u9j+{` z2-G!|R@H|ZOT$e~jn#orMX(~+a1gI@804$-j?Lf z;l4zTW8miIZFRms3SL;;b11NJ67AAsqF0V{h_Vp3BYnMv%lxZ*cjDAPJ-6T@>hD7p zT@%(ny}C)w_g9=(a{=rF;x6Ry-cNnYGK0C$sbRF5w;jB%X~DhKE^M?0C%ym3UCj`UDoSS!Rb8;wUHttI$`gbM<&6fUM$=l}Ujp=)^=0JH>d8i>= z5h#r|RR>Cg!6;@mKe)3U8K~t~2m!PkWb}{kKRo{zN>kLIN8eoBRwi+COdFJd?MY43 z9#x@Pv_H0+iv0UQByZUf8rUB2u6Mw?#hyxeCk_AHr(HKgXWnFS9zLeK&P>LO`03Vv zK3*4-cPaJj-+MYaydD4l)C0I@!w=wlckQZ@AA5+QFOx;DtV+FJ{lpy?qmXZx`Ge_! F{{boAFZ}=j literal 0 HcmV?d00001 diff --git a/autres/Rlib/textometrieR/tests/authors b/autres/Rlib/textometrieR/tests/authors new file mode 100644 index 0000000..4bb1caf --- /dev/null +++ b/autres/Rlib/textometrieR/tests/authors @@ -0,0 +1,14 @@ + a b c d e f g h i j k l m n o p q r s t u v w x y z +TD-Buck 550 116 147 374 1015 131 131 493 442 2 52 302 159 534 516 115 4 409 467 632 174 66 155 5 150 3 +EW-Buck 557 129 128 343 996 158 129 571 555 4 76 291 247 479 509 92 3 413 533 632 181 68 187 10 184 4 +Dr-Mich 515 109 172 311 827 167 136 376 432 8 61 280 146 470 561 140 4 368 387 632 195 60 156 14 137 5 +As-Mich 554 108 206 243 797 164 100 328 471 4 34 293 149 482 532 145 8 361 402 630 196 66 149 2 80 6 +LW-Clar 590 112 181 265 940 137 119 419 514 6 46 335 176 403 505 147 8 395 464 670 224 113 146 13 162 10 +PF-Clar 592 151 251 238 985 168 152 381 544 7 39 416 236 526 524 107 9 418 508 655 226 89 106 15 142 20 +FA-Hemi 589 72 129 339 866 108 159 449 472 7 59 264 158 504 542 95 0 416 314 691 197 64 225 1 155 2 +Is-Hemi 576 120 136 404 873 122 156 593 406 3 90 281 142 516 488 91 3 339 349 640 194 40 250 3 104 5 +SF7-Faul 541 109 136 228 763 126 129 401 520 5 72 280 209 471 589 84 2 324 454 672 247 71 160 11 280 1 +SF6-Faul 517 96 127 356 771 115 189 478 558 6 80 322 163 483 617 82 8 294 358 685 225 37 216 12 171 5 +Pe3-Holt 557 97 145 354 909 97 121 479 431 10 94 240 154 417 477 100 3 305 415 597 237 64 194 9 140 4 +Pe2-Holt 541 93 149 390 887 133 154 463 518 4 65 265 194 484 545 70 4 299 423 644 193 66 218 2 127 2 + diff --git a/autres/Rlib/textometrieR/tests/bfmrepartition.R b/autres/Rlib/textometrieR/tests/bfmrepartition.R new file mode 100644 index 0000000..7bc0d34 --- /dev/null +++ b/autres/Rlib/textometrieR/tests/bfmrepartition.R @@ -0,0 +1,29 @@ +library("textometrieR") + +x1 <- c(100, 133, 284, 482, 568, 667, 838, 878, 957, 1030, 1102, 1122, 1204, 1344, 1459, 1704, 1932, 2134, 2168, 2270, 2400, 3052, 3508, 3619, 3680, 3703, 4066, 4124, 4167, 4299, 5000, 5041, 5102, 5773, 5870, 7042, 7104, 7452, 7475, 7511, 8043, 8068, 8363, 8531, 8736, 9035, 9036, 9099, 9308, 9656, 9890, 9956, 10153, 23533, 23561, 23843, 23992, 24120, 24571, 24591, 24717, 24757, 25048, 25393, 25407, 25542, 25716, 25741, 25836, 25867, 26207, 26523, 26641, 26662, 27307, 27488, 27616, 27788, 27927, 27937, 28532, 28609, 29412, 29870, 29902, 30054, 30239, 30258, 30278, 30394, 33873, 49658, 49696, 49728, 50139, 50155, 50232, 50361, 50366, 50397, 50452, 50812, 51012, 51097, 51184, 51313, 52481, 52527, 52619, 52741, 52979, 55049, 55151, 55384, 55394, 55655, 56138, 56231, 56495, 56807, 56851, 57040, 57149, 57245, 57287, 57409, 57461, 57519, 59175, 59354, 59540, 59652, 59687, 59838, 60456, 60461, 60886, 61212, 61344, 61345, 62173, 62575, 62609, 62717, 63306, 64136, 64174, 64545, 67604, 67732, 67777, 67938, 69307, 70442, 76990, 77178, 77234, 86003, 104435, 104451, 104562, 104653, 104935, 105117, 105251, 105324, 105361, 105419, 105446, 105498, 105657, 105785, 105874, 105919, 105986, 106108, 106258, 106388, 106457, 106615, 106691, 106813, 106833, 107260, 107379, 107387, 107688, 107778, 107873, 108020, 108145, 108240, 108316, 108430, 108459, 108601, 108646, 108940, 109193, 109382, 109543, 109558, 109582, 109703, 109822, 109960, 110059, 110154, 110236, 110325, 110346, 110397, 110416, 110754, 111019, 111097, 111118, 111278, 111308, 111473, 111648, 111663) + +x2 <- c(622, 1139, 3616, 3781, 4122, 4215, 4241, 4373, 4551, 4777, 4820, 5513, 5547, 5632, 5816, 7997, 8470, 8495, 9561, 9592, 10197, 10935, 10952, 11182, 11315, 11442, 11811, 11875, 11909, 12233, 12718, 12847, 12977, 13016, 13070, 13177, 13226, 13255, 13294, 13386, 14512, 14772, 14812, 14853, 14900, 15122, 15247, 15279, 15305, 15383, 15558, 15625, 15673, 15728, 15788, 16301, 16750, 16766, 16832, 16936, 17016, 17069, 17138, 17154, 17264, 17315, 17377, 17400, 17739, 17759, 17924, 17970, 18002, 18036, 18094, 18122, 18249, 18424, 18472, 18534, 18614, 18643, 18696, 18771, 19224, 19431, 19511, 19763, 19822, 19878, 20052, 20075, 20088, 20224, 20889, 20982, 21321, 21364, 21386, 21422, 21499, 21533, 21691, 21767, 21800, 22431, 22500, 23029, 23264, 23495, 23503, 23575, 23704, 23748, 33982, 36737, 49559, 59023, 59230, 59248, 61748, 63362, 66998, 83960, 84153, 84953, 85043, 85059, 85100, 85409, 85535, 85773, 85901, 85993, 86639, 86768, 87277, 87415, 87916, 89597, 96699, 96959, 97196, 97275, 97359, 97422, 97524, 97590, 98146, 98285, 98471, 98608, 98709, 98878, 99372, 99506, 99737, 99797, 100700, 100978, 101026, 101256, 101295, 101335, 101980, 102644, 103107, 103557, 103743, 104270, 104363, 105115, 105144, 105200, 105232, 105886, 105933, 106288, 106464, 106590, 106726, 106835, 107072, 107185, 107267, 107322, 107358, 110388, 111645, 111658, 111773, 111895, 112068, 112123, 112237, 112278, 112505, 112506, 112684, 112763, 112798, 113126, 113248, 113405, 113443, 113773, 113835, 113945, 114601, 114948, 115050, 115458, 115624, 115967, 116042, 116132, 116411, 116459, 116501, 116550, 116748, 116804, 116879, 117093, 117113, 117153, 117244, 117291, 117603, 117794, 117860, 117965, 118026, 118148, 118177, 118321, 118354, 118406, 118492, 118636) + +x3 <- c(23535, 23613, 23862, 24039, 24079, 24114, 30381, 30389, 30516, 30710, 30844, 31121, 31249, 33622, 33639, 33774, 34016, 34077, 34260, 34411, 34745, 34889, 34987, 35143, 36797, 36941, 37349, 37374, 37410, 37462, 37480, 37532, 37623, 37707, 38016, 38096, 38145, 38201, 38233, 38286, 38348, 38408, 38519, 38584, 38626, 38705, 38789, 39135, 39197, 39301, 39369, 39420, 39622, 39663, 40005, 40022, 40356, 40518, 40703, 41101, 41139, 41214, 41325, 41328, 41455, 41478, 41481, 41714, 41832, 41960, 42011, 42120, 42149, 42201, 42353, 42683, 42708, 42787, 42868, 42989, 43011, 43071, 43139, 43273, 43901, 44507, 44661, 44953, 44967, 45151, 45595, 45929, 46487, 46490, 46579, 46937, 47122, 47345, 47359, 47402, 47708, 47793, 47962, 48171, 48339, 48845, 48961, 49186, 49271, 49307, 49501, 61763, 63365, 67000, 83037, 83180, 83593, 83655, 83696, 83731, 83799, 85512, 85828, 86397, 86537, 87204, 87451, 88434, 88550, 96577, 96625, 96685, 96770, 97588, 98119, 99696, 99730, 99740, 100695, 100855, 101081, 101829, 102513, 102520, 102654, 102984, 103052, 103745, 104268, 105086, 105148, 112845, 113085, 113349, 115389, 116507, 116750, 117040, 117089, 117385, 118324, 118487, 118561, 118612) + +x4 <- c() + +structure <- c(10000, 25000, 30000, 49557, 73805, 103550, 110000) +snames <- c("pas tres", "spo tres", "s333333333333333333", "s4444444444444444444", "s555555555555555", "s666666666666", "s7") + +positions = list(x1, x2, x3, x4) + +colors = c("blue", "red", "black", "grey") +styles = c(1,2,3,4) +widths = c(2,2,2,2) + +names = c("Lancelot", "Galaad", "Perceval", "Boort") + +corpusname = "Graal" +Xmin = 0 +Xmax = 119000 + +#library("RSvgDevice"); +#devSVG("/home/mdecorde/Bureau/test.svg") +printrepartition(positions, names, colors, styles, widths, corpusname, Xmin, Xmax, "true", structure, snames, "Graph test de répartition titre donné par TXM normalement", 1000) +#dev.off(); diff --git a/autres/Rlib/textometrieR/tests/ca.R b/autres/Rlib/textometrieR/tests/ca.R new file mode 100644 index 0000000..b223268 --- /dev/null +++ b/autres/Rlib/textometrieR/tests/ca.R @@ -0,0 +1,20 @@ +table <- read.table("clipboard"); +myca <- ca(table) + +myca$rowmass +myca$rowdist +myca$rowinertia +myca$rowcoord + +myca$colmass +myca$coldist +myca$colinertia +myca$colcoord + +plot(myca, dim = c(1,2), map = "symmetric", what = c("all", "all"), mass = c(TRUE, TRUE), contrib = c("relative", "relative"), col = c("#0000FF", "#FF0000")) +mtext("side1", side = 1, line = 2); +mtext("side2", side = 2, line = 2) + + +table[order(table[ ,1]), ]; +plot3d.ca(ca(table, nd=3)) diff --git a/autres/Rlib/textometrieR/tests/specificites.R b/autres/Rlib/textometrieR/tests/specificites.R new file mode 100644 index 0000000..3a2febe --- /dev/null +++ b/autres/Rlib/textometrieR/tests/specificites.R @@ -0,0 +1,4 @@ +library(textometrieR); +# checking that the output of specificites() remains the same... +data(robespierre); # loading the sample data set +specificites(robespierre); diff --git a/autres/Rlib/textometrieR/tests/specificites.Rout.save b/autres/Rlib/textometrieR/tests/specificites.Rout.save new file mode 100644 index 0000000..ab5a39b --- /dev/null +++ b/autres/Rlib/textometrieR/tests/specificites.Rout.save @@ -0,0 +1,40 @@ + +R version 2.9.1 (2009-06-26) +Copyright (C) 2009 The R Foundation for Statistical Computing +ISBN 3-900051-07-0 + +R est un logiciel libre livré sans AUCUNE GARANTIE. +Vous pouvez le redistribuer sous certaines conditions. +Tapez 'license()' ou 'licence()' pour plus de détails. + +R est un projet collaboratif avec de nombreux contributeurs. +Tapez 'contributors()' pour plus d'information et +'citation()' pour la façon de le citer dans les publications. + +Tapez 'demo()' pour des démonstrations, 'help()' pour l'aide +en ligne ou 'help.start()' pour obtenir l'aide au format HTML. +Tapez 'q()' pour quitter R. + +[Sauvegarde de la session précédente restaurée] + +> library(textometrieR); +> data(robespierre); +> specificites(robespierre); + D1 D2 D3 D4 D5 D6 D7 D8 +de 1.2477 2.6891 -0.5534 1.6471 -0.5096 0.3114 -0.6132 -0.8098 +peuple 0.6161 1.1466 -0.6709 -4.1743 2.1122 1.2906 -0.7980 1.3632 +republique 0.9753 0.4424 0.6038 0.9023 0.4706 -1.2797 -2.2003 1.9736 +ennemi 1.2133 1.6778 0.3146 0.3091 0.3364 -0.5024 -2.0550 0.4965 +patrie -4.2432 -0.4160 1.4491 -2.0903 0.6178 -0.3834 1.5961 0.8409 +others -1.2657 -3.6429 0.3542 -0.5984 -0.5387 0.3333 1.2439 -0.5569 + D9 D10 +de 0.3884 -2.2050 +peuple -0.3977 -0.8410 +republique -0.5366 -0.6335 +ennemi -0.3552 -0.4359 +patrie -0.3079 0.6414 +others 0.3377 2.4355 +> +> proc.time() +utilisateur système écoulé + 0.304 0.024 0.333 diff --git a/autres/Rlib/textometrieR/tests/specificites.lexicon.new.R b/autres/Rlib/textometrieR/tests/specificites.lexicon.new.R new file mode 100644 index 0000000..5cfd41e --- /dev/null +++ b/autres/Rlib/textometrieR/tests/specificites.lexicon.new.R @@ -0,0 +1,8 @@ +library(textometrieR); +sublexicon <- c(1, 2, 1, 3, 2, 1); +names(sublexicon) <- c("A", "D", "G", "J", "B", "C"); + +lexicon <- c(1, 2, 1, 3, 2, 1, 2, 2, 2, 2, 1, 3, 4); +names(lexicon) <- LETTERS[1:length(lexicon)]; + +specificites.lexicon.new(lexicon, sublexicon); diff --git a/autres/Rlib/textometrieR/tests/specificites.probabilities.R b/autres/Rlib/textometrieR/tests/specificites.probabilities.R new file mode 100644 index 0000000..924269d --- /dev/null +++ b/autres/Rlib/textometrieR/tests/specificites.probabilities.R @@ -0,0 +1,4 @@ +library(textometrieR); +# checking that the output of specificites.probabilities() remains the same... +data(robespierre); # loading the sample data set +specificites.probabilities(robespierre); diff --git a/autres/Rlib/textometrieR/tests/specificites.probabilities.Rout.save b/autres/Rlib/textometrieR/tests/specificites.probabilities.Rout.save new file mode 100644 index 0000000..e1aa951 --- /dev/null +++ b/autres/Rlib/textometrieR/tests/specificites.probabilities.Rout.save @@ -0,0 +1,41 @@ + +R version 2.9.1 (2009-06-26) +Copyright (C) 2009 The R Foundation for Statistical Computing +ISBN 3-900051-07-0 + +R est un logiciel libre livré sans AUCUNE GARANTIE. +Vous pouvez le redistribuer sous certaines conditions. +Tapez 'license()' ou 'licence()' pour plus de détails. + +R est un projet collaboratif avec de nombreux contributeurs. +Tapez 'contributors()' pour plus d'information et +'citation()' pour la façon de le citer dans les publications. + +Tapez 'demo()' pour des démonstrations, 'help()' pour l'aide +en ligne ou 'help.start()' pour obtenir l'aide au format HTML. +Tapez 'q()' pour quitter R. + +[Sauvegarde de la session précédente restaurée] + +> library(textometrieR); +> # checking that the output of specificites.probabilities remains the same... +> data(robespierre); # loading the sample data set +> specificites.probabilities(robespierre); + D1 D2 D3 D4 D5 +de 9.434651e-01 0.9979542117 0.2796099 9.774612e-01 0.3093355 +peuple 7.579362e-01 0.9286527817 0.2133715 6.693709e-05 0.9922765 +republique 8.941447e-01 0.6389224800 0.7509756 8.747769e-01 0.6616432 +ennemi 9.388100e-01 0.9790007110 0.5153405 5.092428e-01 0.5390590 +patrie 5.711981e-05 0.3837343979 0.9644425 8.122879e-03 0.7588987 +others 5.423605e-02 0.0002275630 0.5576156 2.521024e-01 0.2893006 + D6 D7 D8 D9 D10 +de 0.51176477 0.243664820 0.1549604 0.5911002 0.006236862 +peuple 0.94878218 0.159231855 0.9566718 0.4001917 0.144224817 +republique 0.05251719 0.006305835 0.9893744 0.2906916 0.232545209 +ennemi 0.31450047 0.008810362 0.6811968 0.4413409 0.366560964 +patrie 0.41364577 0.974655165 0.8557652 0.4921304 0.771637262 +others 0.53580477 0.942970424 0.2774148 0.5405062 0.996331474 +> +> proc.time() +utilisateur système écoulé + 0.392 0.024 0.499 diff --git a/autres/app.fil b/autres/app.fil new file mode 100644 index 0000000..6bc2801 --- /dev/null +++ b/autres/app.fil @@ -0,0 +1,67 @@ +analysematrix.py +analysetxt.py +bestsvg.py +build_dictionnaries.py +cable.py +checkinstall.py +checkversion.py +chemins.py +colors.py +configparser_helpers.py +configparser.py +corpus.py +dialog.py +extract.py +functions.py +guifunct.py +guiparam3d.py +HTML.py +iracmd.py +iramuteq.py +iraopen.py +KeyFrame.py +layout.py +Liste.py +listlex.py +mki18n.py +newsimi.py +ooolib.py +openanalyse.py +OptionAlceste.py +parse_factiva_html.py +parse_factiva_mail.py +parse_factiva_txt.py +parse_factiva_xml.py +PrintRScript.py +profile_segment.py +ProfList.py +putcorpusindb.py +search_list.py +search_tools.py +setup.py +setup.py.win +sheet.py +tabafcm.py +tabchdalc.py +tabchddist.py +tabchi2.py +tabfrequence.py +tableau.py +tabrsimple.py +tabsimi.py +tabstudent.py +tabverges.py +textafcuci.py +textaslexico.py +textchdalc.py +textcheckcorpus.py +textclassechd.py +textdist.py +textsimi.py +textstat.py +textwordcloud.py +tools.py +tree.py +ttparser.py +usecorpusNG.py +word_stat.py diff --git a/autres/aui/__init__.py b/autres/aui/__init__.py new file mode 100644 index 0000000..ba3b51d --- /dev/null +++ b/autres/aui/__init__.py @@ -0,0 +1,290 @@ +""" +AUI is an Advanced User Interface library that aims to implement "cutting-edge" +interface usability and design features so developers can quickly and easily create +beautiful and usable application interfaces. + + +Vision and Design Principles +============================ + +AUI attempts to encapsulate the following aspects of the user interface: + +* **Frame Management**: Frame management provides the means to open, move and hide common + controls that are needed to interact with the document, and allow these configurations + to be saved into different perspectives and loaded at a later time. + +* **Toolbars**: Toolbars are a specialized subset of the frame management system and should + behave similarly to other docked components. However, they also require additional + functionality, such as "spring-loaded" rebar support, "chevron" buttons and end-user + customizability. + +* **Modeless Controls**: Modeless controls expose a tool palette or set of options that + float above the application content while allowing it to be accessed. Usually accessed + by the toolbar, these controls disappear when an option is selected, but may also be + "torn off" the toolbar into a floating frame of their own. + +* **Look and Feel**: Look and feel encompasses the way controls are drawn, both when shown + statically as well as when they are being moved. This aspect of user interface design + incorporates "special effects" such as transparent window dragging as well as frame animation. + +AUI adheres to the following principles: + +- Use native floating frames to obtain a native look and feel for all platforms; +- Use existing wxPython code where possible, such as sizer implementation for frame management; +- Use standard wxPython coding conventions. + + +Usage +===== + +The following example shows a simple implementation that uses L{AuiManager} to manage +three text controls in a frame window:: + + class MyFrame(wx.Frame): + + def __init__(self, parent, id=-1, title="AUI Test", pos=wx.DefaultPosition, + size=(800, 600), style=wx.DEFAULT_FRAME_STYLE): + + wx.Frame.__init__(self, parent, id, title, pos, size, style) + + self._mgr = aui.AuiManager() + + # notify AUI which frame to use + self._mgr.SetManagedWindow(self) + + # create several text controls + text1 = wx.TextCtrl(self, -1, "Pane 1 - sample text", + wx.DefaultPosition, wx.Size(200,150), + wx.NO_BORDER | wx.TE_MULTILINE) + + text2 = wx.TextCtrl(self, -1, "Pane 2 - sample text", + wx.DefaultPosition, wx.Size(200,150), + wx.NO_BORDER | wx.TE_MULTILINE) + + text3 = wx.TextCtrl(self, -1, "Main content window", + wx.DefaultPosition, wx.Size(200,150), + wx.NO_BORDER | wx.TE_MULTILINE) + + # add the panes to the manager + self._mgr.AddPane(text1, AuiPaneInfo().Left().Caption("Pane Number One")) + self._mgr.AddPane(text2, AuiPaneInfo().Bottom().Caption("Pane Number Two")) + self._mgr.AddPane(text3, AuiPaneInfo().CenterPane()) + + # tell the manager to "commit" all the changes just made + self._mgr.Update() + + self.Bind(wx.EVT_CLOSE, self.OnClose) + + + def OnClose(self, event): + + # deinitialize the frame manager + self._mgr.UnInit() + + self.Destroy() + event.Skip() + + + # our normal wxApp-derived class, as usual + + app = wx.PySimpleApp() + + frame = MyFrame(None) + app.SetTopWindow(frame) + frame.Show() + + app.MainLoop() + + +What's New +========== + +Current wxAUI Version Tracked: wxWidgets 2.9.0 (SVN HEAD) + +The wxPython AUI version fixes the following bugs or implement the following +missing features (the list is not exhaustive): + +- Visual Studio 2005 style docking: http://www.kirix.com/forums/viewtopic.php?f=16&t=596 +- Dock and Pane Resizing: http://www.kirix.com/forums/viewtopic.php?f=16&t=582 +- Patch concerning dock resizing: http://www.kirix.com/forums/viewtopic.php?f=16&t=610 +- Patch to effect wxAuiToolBar orientation switch: http://www.kirix.com/forums/viewtopic.php?f=16&t=641 +- AUI: Core dump when loading a perspective in wxGTK (MSW OK): http://www.kirix.com/forums/viewtopic.php?f=15&t=627 +- wxAuiNotebook reordered AdvanceSelection(): http://www.kirix.com/forums/viewtopic.php?f=16&t=617 +- Vertical Toolbar Docking Issue: http://www.kirix.com/forums/viewtopic.php?f=16&t=181 +- Patch to show the resize hint on mouse-down in aui: http://trac.wxwidgets.org/ticket/9612 +- The Left/Right and Top/Bottom Docks over draw each other: http://trac.wxwidgets.org/ticket/3516 +- MinSize() not honoured: http://trac.wxwidgets.org/ticket/3562 +- Layout problem with wxAUI: http://trac.wxwidgets.org/ticket/3597 +- Resizing children ignores current window size: http://trac.wxwidgets.org/ticket/3908 +- Resizing panes under Vista does not repaint background: http://trac.wxwidgets.org/ticket/4325 +- Resize sash resizes in response to click: http://trac.wxwidgets.org/ticket/4547 +- "Illegal" resizing of the AuiPane? (wxPython): http://trac.wxwidgets.org/ticket/4599 +- Floating wxAUIPane Resize Event doesn't update its position: http://trac.wxwidgets.org/ticket/9773 +- Don't hide floating panels when we maximize some other panel: http://trac.wxwidgets.org/ticket/4066 +- wxAUINotebook incorrect ALLOW_ACTIVE_PANE handling: http://trac.wxwidgets.org/ticket/4361 +- Page changing veto doesn't work, (patch supplied): http://trac.wxwidgets.org/ticket/4518 +- Show and DoShow are mixed around in wxAuiMDIChildFrame: http://trac.wxwidgets.org/ticket/4567 +- wxAuiManager & wxToolBar - ToolBar Of Size Zero: http://trac.wxwidgets.org/ticket/9724 +- wxAuiNotebook doesn't behave properly like a container as far as...: http://trac.wxwidgets.org/ticket/9911 +- Serious layout bugs in wxAUI: http://trac.wxwidgets.org/ticket/10620 +- wAuiDefaultTabArt::Clone() should just use copy contructor: http://trac.wxwidgets.org/ticket/11388 +- Drop down button for check tool on wxAuiToolbar: http://trac.wxwidgets.org/ticket/11139 + +Plus the following features: + +- AuiManager: + + (a) Implementation of a simple minimize pane system: Clicking on this minimize button causes a new + AuiToolBar to be created and added to the frame manager, (currently the implementation is such + that panes at West will have a toolbar at the right, panes at South will have toolbars at the + bottom etc...) and the pane is hidden in the manager. + Clicking on the restore button on the newly created toolbar will result in the toolbar being + removed and the original pane being restored; + (b) Panes can be docked on top of each other to form `AuiNotebooks`; `AuiNotebooks` tabs can be torn + off to create floating panes; + (c) On Windows XP, use the nice sash drawing provided by XP while dragging the sash; + (d) Possibility to set an icon on docked panes; + (e) Possibility to draw a sash visual grip, for enhanced visualization of sashes; + (f) Implementation of a native docking art (`ModernDockArt`). Windows XP only, **requires** Mark Hammond's + pywin32 package (winxptheme); + (g) Possibility to set a transparency for floating panes (a la Paint .NET); + (h) Snapping the main frame to the screen in any positin specified by horizontal and vertical + alignments; + (i) Snapping floating panes on left/right/top/bottom or any combination of directions, a la Winamp; + (j) "Fly-out" floating panes, i.e. panes which show themselves only when the mouse hover them; + (k) Ability to set custom bitmaps for pane buttons (close, maximize, etc...); + (l) Implementation of the style ``AUI_MGR_ANIMATE_FRAMES``, which fade-out floating panes when + they are closed (all platforms which support frames transparency) and show a moving rectangle + when they are docked and minimized (Windows < Vista and GTK only); + (m) A pane switcher dialog is available to cycle through existing AUI panes; + (n) Some flags which allow to choose the orientation and the position of the minimized panes; + (o) The functions [Get]MinimizeMode() in `AuiPaneInfo` which allow to set/get the flags described above; + (p) Events like ``EVT_AUI_PANE_DOCKING``, ``EVT_AUI_PANE_DOCKED``, ``EVT_AUI_PANE_FLOATING`` and ``EVT_AUI_PANE_FLOATED`` are + available for all panes *except* toolbar panes; + (q) Implementation of the RequestUserAttention method for panes; + (r) Ability to show the caption bar of docked panes on the left instead of on the top (with caption + text rotated by 90 degrees then). This is similar to what `wxDockIt` did. To enable this feature on any + given pane, simply call `CaptionVisible(True, left=True)`; + (s) New Aero-style docking guides: you can enable them by using the `AuiManager` style ``AUI_MGR_AERO_DOCKING_GUIDES``; + (t) A slide-in/slide-out preview of minimized panes can be seen by enabling the `AuiManager` style + ``AUI_MGR_PREVIEW_MINIMIZED_PANES`` and by hovering with the mouse on the minimized pane toolbar tool; + (u) New Whidbey-style docking guides: you can enable them by using the `AuiManager` style ``AUI_MGR_WHIDBEY_DOCKING_GUIDES``; + (v) Native of custom-drawn mini frames can be used as floating panes, depending on the ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style; + (w) A "smooth docking effect" can be obtained by using the ``AUI_MGR_SMOOTH_DOCKING`` style (similar to PyQT docking style). + +| + +- AuiNotebook: + + (a) Implementation of the style ``AUI_NB_HIDE_ON_SINGLE_TAB``, a la `wx.lib.agw.flatnotebook`; + (b) Implementation of the style ``AUI_NB_SMART_TABS``, a la `wx.lib.agw.flatnotebook`; + (c) Implementation of the style ``AUI_NB_USE_IMAGES_DROPDOWN``, which allows to show tab images + on the tab dropdown menu instead of bare check menu items (a la `wx.lib.agw.flatnotebook`); + (d) 6 different tab arts are available, namely: + + (1) Default "glossy" theme (as in `wx.aui.AuiNotebook`) + (2) Simple theme (as in `wx.aui.AuiNotebook`) + (3) Firefox 2 theme + (4) Visual Studio 2003 theme (VC71) + (5) Visual Studio 2005 theme (VC81) + (6) Google Chrome theme + + (e) Enabling/disabling tabs; + (f) Setting the colour of the tab's text; + (g) Implementation of the style ``AUI_NB_CLOSE_ON_TAB_LEFT``, which draws the tab close button on + the left instead of on the right (a la Camino browser); + (h) Ability to save and load perspectives in `AuiNotebook` (experimental); + (i) Possibility to add custom buttons in the `AuiNotebook` tab area; + (j) Implementation of the style ``AUI_NB_TAB_FLOAT``, which allows the floating of single tabs. + Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far + enough outside of the notebook to become floating pages; + (k) Implementation of the style ``AUI_NB_DRAW_DND_TAB`` (on by default), which draws an image + representation of a tab while dragging; + (l) Implementation of the `AuiNotebook` unsplit functionality, which unsplit a splitted AuiNotebook + when double-clicking on a sash; + (m) Possibility to hide all the tabs by calling `HideAllTAbs`; + (n) wxPython controls can now be added inside page tabs by calling `AddControlToPage`, and they can be + removed by calling `RemoveControlFromPage`; + (o) Possibility to preview all the pages in a `AuiNotebook` (as thumbnails) by using the `NotebookPreview` + method of `AuiNotebook`; + (p) Tab labels can be edited by calling the `SetRenamable` method on a `AuiNotebook` page; + (q) Support for multi-lines tab labels in `AuiNotebook`; + (r) Support for setting minimum and maximum tab widths for fixed width tabs; + (s) Implementation of the style ``AUI_NB_ORDER_BY_ACCESS``, which orders the tabs by last access time + inside the Tab Navigator dialog; + (t) Implementation of the style ``AUI_NB_NO_TAB_FOCUS``, allowing the developer not to draw the tab + focus rectangle on tne `AuiNotebook` tabs. + +| + +- AuiToolBar: + + (a) ``AUI_TB_PLAIN_BACKGROUND`` style that allows to easy setup a plain background to the AUI toolbar, + without the need to override drawing methods. This style contrasts with the default behaviour + of the `wx.aui.AuiToolBar` that draws a background gradient and this break the window design when + putting it within a control that has margin between the borders and the toolbar (example: put + `wx.aui.AuiToolBar` within a `wx.StaticBoxSizer` that has a plain background); + (b) `AuiToolBar` allow item alignment: http://trac.wxwidgets.org/ticket/10174; + (c) `AUIToolBar` `DrawButton()` improvement: http://trac.wxwidgets.org/ticket/10303; + (d) `AuiToolBar` automatically assign new id for tools: http://trac.wxwidgets.org/ticket/10173; + (e) `AuiToolBar` Allow right-click on any kind of button: http://trac.wxwidgets.org/ticket/10079; + (f) `AuiToolBar` idle update only when visible: http://trac.wxwidgets.org/ticket/10075; + (g) Ability of creating `AuiToolBar` tools with [counter]clockwise rotation. This allows to propose a + variant of the minimizing functionality with a rotated button which keeps the caption of the pane + as label; + (h) Allow setting the alignment of all tools in a toolbar that is expanded. + + +TODOs +===== + +- Documentation, documentation and documentation; +- Fix `tabmdi.AuiMDIParentFrame` and friends, they do not work correctly at present; +- Allow specification of `CaptionLeft()` to `AuiPaneInfo` to show the caption bar of docked panes + on the left instead of on the top (with caption text rotated by 90 degrees then). This is + similar to what `wxDockIt` did - DONE; +- Make developer-created `AuiNotebooks` and automatic (framemanager-created) `AuiNotebooks` behave + the same way (undocking of tabs) - DONE, to some extent; +- Find a way to dock panes in already floating panes (`AuiFloatingFrames`), as they already have + their own `AuiManager`; +- Add more gripper styles (see, i.e., PlusDock 4.0); +- Add an "AutoHide" feature to docked panes, similar to fly-out floating panes (see, i.e., PlusDock 4.0); +- Add events for panes when they are about to float or to be docked (something like + ``EVT_AUI_PANE_FLOATING/ED`` and ``EVT_AUI_PANE_DOCKING/ED``) - DONE, to some extent; +- Implement the 4-ways splitter behaviour for horizontal and vertical sashes if they intersect; +- Extend `tabart.py` with more aui tab arts; +- Implement ``AUI_NB_LEFT`` and ``AUI_NB_RIGHT`` tab locations in `AuiNotebook`; +- Move `AuiDefaultToolBarArt` into a separate module (as with `tabart.py` and `dockart.py`) and + provide more arts for toolbars (maybe from `wx.lib.agw.flatmenu`?) +- Support multiple-rows/multiple columns toolbars; +- Integrate as much as possible with `wx.lib.agw.flatmenu`, from dropdown menus in `AuiNotebook` to + toolbars and menu positioning; +- Possibly handle minimization of panes in a different way (or provide an option to switch to + another way of minimizing panes); +- Clean up/speed up the code, especially time-consuming for-loops; +- Possibly integrate `wxPyRibbon` (still on development), at least on Windows. + + +License And Version +=================== + +AUI library is distributed under the wxPython license. + +Latest revision: Andrea Gavana @ 21 Jun 2011, 22.00 GMT + +Version 1.3. + +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +from aui_constants import * +from aui_utilities import * +from auibar import * +from auibook import * +from tabart import * +from dockart import * +from framemanager import * +from tabmdi import * diff --git a/autres/aui/aui_constants.py b/autres/aui/aui_constants.py new file mode 100644 index 0000000..38f183d --- /dev/null +++ b/autres/aui/aui_constants.py @@ -0,0 +1,2588 @@ +""" +This module contains all the constants used by wxPython-AUI. + +Especially important and meaningful are constants for AuiManager, AuiDockArt and +AuiNotebook. +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx +from wx.lib.embeddedimage import PyEmbeddedImage + +# ------------------------- # +# - AuiNotebook Constants - # +# ------------------------- # + +# For tabart +# -------------- + +vertical_border_padding = 4 +""" Border padding used in drawing tabs. """ + +if wx.Platform == "__WXMAC__": + nb_close_bits = "\xFF\xFF\xFF\xFF\x0F\xFE\x03\xF8\x01\xF0\x19\xF3" \ + "\xB8\xE3\xF0\xE1\xE0\xE0\xF0\xE1\xB8\xE3\x19\xF3" \ + "\x01\xF0\x03\xF8\x0F\xFE\xFF\xFF" + """ AuiNotebook close button image on wxMAC. """ + +elif wx.Platform == "__WXGTK__": + nb_close_bits = "\xff\xff\xff\xff\x07\xf0\xfb\xef\xdb\xed\x8b\xe8" \ + "\x1b\xec\x3b\xee\x1b\xec\x8b\xe8\xdb\xed\xfb\xef" \ + "\x07\xf0\xff\xff\xff\xff\xff\xff" + """ AuiNotebook close button image on wxGTK. """ + +else: + nb_close_bits = "\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xf3\xcf\xf9" \ + "\x9f\xfc\x3f\xfe\x3f\xfe\x9f\xfc\xcf\xf9\xe7\xf3" \ + "\xff\xff\xff\xff\xff\xff\xff\xff" + """ AuiNotebook close button image on wxMSW. """ + +nb_left_bits = "\xff\xff\xff\xff\xff\xff\xff\xfe\x7f\xfe\x3f\xfe\x1f" \ + "\xfe\x0f\xfe\x1f\xfe\x3f\xfe\x7f\xfe\xff\xfe\xff\xff" \ + "\xff\xff\xff\xff\xff\xff" +""" AuiNotebook left button image. """ + +nb_right_bits = "\xff\xff\xff\xff\xff\xff\xdf\xff\x9f\xff\x1f\xff\x1f" \ + "\xfe\x1f\xfc\x1f\xfe\x1f\xff\x9f\xff\xdf\xff\xff\xff" \ + "\xff\xff\xff\xff\xff\xff" +""" AuiNotebook right button image. """ + +nb_list_bits = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f" \ + "\xf8\xff\xff\x0f\xf8\x1f\xfc\x3f\xfe\x7f\xff\xff\xff" \ + "\xff\xff\xff\xff\xff\xff" +""" AuiNotebook windows list button image. """ + + +#---------------------------------------------------------------------- +tab_active_center = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAbCAYAAAC9WOV0AAAABHNCSVQICAgIfAhkiAAAADNJ" + "REFUCJltzMEJwDAUw9DHX6OLdP/Bop4KDc3F2EIYrsFtrZow8GnH6OD1zvRTajvY2QMHIhNx" + "jUhuAgAAAABJRU5ErkJggg==") +""" Center active tab image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_active_left = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAglJ" + "REFUOI2Nkk9rE0EYh5/J7mpW06xE2iSmeFHxEoqIAc/FQ5CKgn4DP4KlIQG/QVsQbBEKgop+" + "Anvy4rV4bLT2JCGJPVXqwaZJd+f1kN26WTfJDrzszDLPPL/5o0jeFGAC54A0YKmEYAo4DzjA" + "LHAZmElqtIGrhmEsvtzcfPNtb6/V6524SWALKBiGsfhxe/uzFhGth5XEmgVubWxsvA1Az68k" + "1nngYbPZ7ASg69c06wxwe3V9/b3reVqHwGmwCZRs2370fX//wIuA0+CLwEKj0XilZTSu602G" + "FcP7vLe7+7XlRaCgPw62gGv5fP6p63raiwFdLWKOgdNArl6vV1UqpQgcYdcYbwooAPfb7c7h" + "mTWmUjGwCWTL5fL1K6VSLiqQyMTYyLVa/UEwe9IC0chFYKnb/XnkeiIDV+Q0UsG/qNkCnEql" + "crNQLDpaxpskJnYayD1bXl4S/xrDoPLHKjQOmsHwlCuHv44+ZJ2sLTrGGqzg7zEc+VK1Wl1w" + "HMcG0DFxw6sFsRVwAZhdWak9FoRJ+w2HCKzzwN3jXv+daVmGDkdWoMKb9fumHz0DFFfX1p5Y" + "lmXo6N0G48jzVEDOt97pdA9ezOXzGU+PzBmN6VuDqyoDN3Z2vjyfKxQynhYkJuJ/L02Ara3X" + "n3602r8HrpaTUy3HAy1/+hNq8O+r+q4WETirmFMNBwm3v+gdmytKNIUpAAAAAElFTkSuQmCC") +""" Left active tab image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_active_right = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAkpJ" + "REFUOI2NlM1rU0EUxX9zZ5KaWq3GKKnGutC0FEWCWAWLRUOxBetK/wdp6Re6F6TFXXGhuFdw" + "b7dCQUUpiFt1XbB2q7Uf1iTvunjzkpe0afNgmLnDnHvOPe/OWCALtAFC+Cktfha4CRwBDnhg" + "BQhaSrK19bf89dv35WfPX7y01haBbiAFmH3BlUA1Gm8WFt75BFkg0TK4VAl0Y3NL5+efvgIK" + "wOH92EVjxRljGBi4VgTOeLDbk7kcqEZju1TWX7/Xgtm5J6+BS8ChvdilLhAhkUya4eFbxVQq" + "1e3ZbUtgg8GKJd/Tk70/NjYCHCPsgX1kV8K5VA70z8amfvy0tAwMAcebSRfijikY8ez5/OlM" + "JrOncbIjp4K1lmRb0sw8eDgCpAm7rwlz46YIzjpGb48WveyDNPhDfCOuHmNwzpHL5dK9fX3n" + "mkmvaxJiayOCWMvM1PSdZtJrhiloLJMYIeESDFwf7Acyu0mXGLYmX0PpYi3ZbFdnoVDoBTpp" + "uCxCjFob1tYKzlnGJyZHd5Mu6uVGkqvMCmCwzjE4eOMqcALoINauUic37hjhLXPWcTSdThWL" + "QxcJX5yqdGk4H/cP9a4755iYnLpL+M/b8e0qjafrekb9TUskuNx/5TzQ5Y1zO9yOZEd1R7OI" + "JdXebh/Pzt3zCToAMZv/AjU1orDWWKAGVJVSqcTqysp6X+/ZaeAL8KNac9wsVQ8yNeOsdZw8" + "let4/2HpEdAPXDAb20HLj7xqeHT158ra4uLbz2bdg03krmetxrH9KDAmHP8Bn0j1t/01UV0A" + "AAAASUVORK5CYII=") +""" Right active tab image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_close = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAI9J" + "REFUKJG90MEKAWEUxfEfM4rxAFIommzZzNb7v4BsLJTsiGQlYjHfME3flrO75/xvnXv5p/qY" + "R/wcWTUktWCKFbrYB6/AAhecmwunAI/RwQAjbLGpoFakwjLATxzqMLQjC68A3/FohkljLkKN" + "Ha4YKg8+VkBag3Pll9a1GikmuPk+4qMMs0jFMXoR/0d6A9JRFV/jxY+iAAAAAElFTkSuQmCC") +""" Normal close button image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_close_h = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAOlJ" + "REFUKJGVkiFuw0AQRd849hUS7iPUwGEllhyjYJ+gaK9Q4CsY9QTFIY4shQQucI8Q7l6h3Z0S" + "r7UgjdrPZvVm52k0wpJLWe4y51qgVpECQFQnYPzabN4ra2cAAbgWxZMmyavAkTtROIn33fM0" + "fcilLHep92+/wXHTd5K8JJlzbYD3w8C2aVZo2zTsh4FF5Zg516ZAHYBb35MbszbkxnDr+3hQ" + "napIIUv1eT6vYPggvAGoSJE88r6XVFQnRA7BOdYIk8IUUZ1SYAQOsXOskRsT1+P/11pZO4v3" + "ncLpESzed5W1c1jQn0/jBzPfck1qdmfjAAAAAElFTkSuQmCC") +""" Hover close button image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_close_p = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAASxJ" + "REFUKJF9kbFLQlEYxX/nvbs55OAkiJAE7k7Nibo9xf+hrTlyr3Boipb+BCGq0bApJEQcG0Ms" + "aQ0Lmq5+Dc+nDtbZ7uHce37fd8VSlWwh50PfRKqClWJXI8y6bu5uHj5e3wEEcJDP75txLBSx" + "RYbdS7QfJ5PnsJIt5BbB4hQjkrQtjxlFILOXyvQDH/qmUCSJznDAYetkFTxsndAZDggkhCIf" + "+qaLmWP1bu8oN+qrC+VGnd7t3bpKqrp4wBjl+ux8FUweSLwlXCnYCv2PHGgE1BLmTYykad2i" + "kcOsi1TbZN7EKDfq67NZV5VsIeedvzQjCv5YK8R/4bw7Cl+/P7920+kJkBEq/hWWaPem45cQ" + "YDybTfdSmf5CizckwHaAH9ATZldu7i560/ELwC+6RXdU6KzezAAAAABJRU5ErkJggg==") +""" Pressed close button image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_inactive_center = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAbCAYAAAC9WOV0AAAABHNCSVQICAgIfAhkiAAAAElJ" + "REFUCJlVyiEOgDAUBNHp3qmX5iYkyMpqBAaFILRdDGn4qybZB98yy3ZZrRu1PpABAQiDSLN+" + "h4NLEU8CBAfoPHZUywr3M/wCTz8c3/qQrUcAAAAASUVORK5CYII=") +""" Center inactive tab image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_inactive_left = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAf5J" + "REFUOI2llE1rE1EUhp8bZwyhaZomk5DaD40hSWPQVkTd6KIIEUWlLqTEhTaLulBQ6sfKjeBC" + "ECULXQku/Alx7d6/U1EQae45LjJpJ5NOnOKBgYG5z33Px3sG/iPMIc87QAmYBZKHgdOu69a2" + "3/W2yrVGK5vPLTlxFV3Xrb3+8v1Ntd5oiSpWBmnEidKT972tar3R6ovSt4qoxoIdoFipNlpW" + "B6AVRYFEHNWn3a8dz/PK1rIHEgN2UpnMseVTK7fUGBME48CFe88+3sh5+SXr1xmMSbABvJXz" + "l9siYAVGWJ0Mu/OVZr5Q8CpWfFWzD2Imj2qu/fhtG4wRVUIZg0bDBsgtn15dt6qIKKBDQZ81" + "kWmnzly6OZ+ZzhSt7jfK6CBjFMwEk5TWOy82AVQGhzVUb5RJEkC2fLK6JgIiPhioeZJJUhev" + "3j2RTqdzooqge2ojCxwxqrnrG4/uq4Ida3HgAjMOJ4CZSq1+RVBUzCgQinDDstfa282jyeTU" + "rhUGF4CJgMPKhbXbmw9VFfG7fBA4LCao7AAzi8cXz1kF0dENMqH38KgWnnd7nSMJxxE5wI4+" + "MHyCaeeAYvPshQ0RJby3wVSDHxxgAVh99elb9/evndmfP3boW2FsqGNhMMCdBy8/fJ5KZ6at" + "qL+3Q1dEzFkNGMX82ZWh18e0/vVT/wuFmdYVv/ruKgAAAABJRU5ErkJggg==") +""" Left inactive tab image for the Chrome tab art. """ + +#---------------------------------------------------------------------- +tab_inactive_right = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAbCAYAAACjkdXHAAAABHNCSVQICAgIfAhkiAAAAhBJ" + "REFUOI2llM9rE1EQxz8zb1dSTKNuYtW01kQDRoKFWi9FEEq1IooUUWoPokWCtVqkR69KsSBU" + "8OJRPOhBxZNe/At6FBER/HFUPEq1IGn3ecgm2ZjdJODCHPY9vvP9fufNDPzHZ4DDQBrYBKwB" + "ftfoJys/Kw9ef/1y8/6rh67rHgKS3WLl6cqqtcCGD58+vn+zdPXorUql8g5Y7wTWdd+y4Vus" + "teQK+yfKi8/KwM5umBXAAgioCIP54gTQBzgdwTbsQZR0JpOfXXw+0w27hn9EBGMcyRcPnulJ" + "pbKd2JvACKgKnpcePH99+TSwvT3YEphusKsqB4ZHp4FMNWUn5loSEVSFbZ63b8eeUhpwu5Md" + "JBFRjHHk7LXb08CuNuAaZTgEEaFQHJoEvDjpakOYmnURUFWSvam+0ujJfqAnmlnABhG2jlTZ" + "j19YuEzMm7dUu34hihrDQG7vGLCViPq0VruuvdquyWSvN3xsKhclvbXaoUQiihFlfLJ8iYiq" + "O/EtUC2xGGF3vjAObAnI6stCsZbYCLwnEonNY+dulALvHWSH2YN2PXLq4hz/9HpjnmOs18DZ" + "bP9IIL0+afV5juqzRgLFcV1n9u6LGWAgWnaMBFHBOIbi0MgU1S3jAcjyyw9xqpvzWou1Pj++" + "f/t8b/7EAvBW5u48agU37abWs99rv1YfL81fkT8V34YxbZ696d4CfwEszZSZx6Z26wAAAABJ" + "RU5ErkJggg==") +""" Right inactive tab image for the Chrome tab art. """ + +# For auibook +# ----------- + +AuiBaseTabCtrlId = 5380 +""" Base window identifier for AuiTabCtrl. """ + +AUI_NB_TOP = 1 << 0 +""" With this style, tabs are drawn along the top of the notebook. """ +AUI_NB_LEFT = 1 << 1 # not implemented yet +""" With this style, tabs are drawn along the left of the notebook. +Not implemented yet. """ +AUI_NB_RIGHT = 1 << 2 # not implemented yet +""" With this style, tabs are drawn along the right of the notebook. +Not implemented yet. """ +AUI_NB_BOTTOM = 1 << 3 +""" With this style, tabs are drawn along the bottom of the notebook. """ +AUI_NB_TAB_SPLIT = 1 << 4 +""" Allows the tab control to be split by dragging a tab. """ +AUI_NB_TAB_MOVE = 1 << 5 +""" Allows a tab to be moved horizontally by dragging. """ +AUI_NB_TAB_EXTERNAL_MOVE = 1 << 6 +""" Allows a tab to be moved to another tab control. """ +AUI_NB_TAB_FIXED_WIDTH = 1 << 7 +""" With this style, all tabs have the same width. """ +AUI_NB_SCROLL_BUTTONS = 1 << 8 +""" With this style, left and right scroll buttons are displayed. """ +AUI_NB_WINDOWLIST_BUTTON = 1 << 9 +""" With this style, a drop-down list of windows is available. """ +AUI_NB_CLOSE_BUTTON = 1 << 10 +""" With this style, a close button is available on the tab bar. """ +AUI_NB_CLOSE_ON_ACTIVE_TAB = 1 << 11 +""" With this style, a close button is available on the active tab. """ +AUI_NB_CLOSE_ON_ALL_TABS = 1 << 12 +""" With this style, a close button is available on all tabs. """ +AUI_NB_MIDDLE_CLICK_CLOSE = 1 << 13 +""" Allows to close `AuiNotebook` tabs by mouse middle button click. """ +AUI_NB_SUB_NOTEBOOK = 1 << 14 +""" This style is used by `AuiManager` to create automatic `AuiNotebooks`. """ +AUI_NB_HIDE_ON_SINGLE_TAB = 1 << 15 +""" Hides the tab window if only one tab is present. """ +AUI_NB_SMART_TABS = 1 << 16 +""" Use `Smart Tabbing`, like ``Alt`` + ``Tab`` on Windows. """ +AUI_NB_USE_IMAGES_DROPDOWN = 1 << 17 +""" Uses images on dropdown window list menu instead of check items. """ +AUI_NB_CLOSE_ON_TAB_LEFT = 1 << 18 +""" Draws the tab close button on the left instead of on the right +(a la Camino browser). """ +AUI_NB_TAB_FLOAT = 1 << 19 +""" Allows the floating of single tabs. +Known limitation: when the notebook is more or less full screen, tabs +cannot be dragged far enough outside of the notebook to become +floating pages. """ +AUI_NB_DRAW_DND_TAB = 1 << 20 +""" Draws an image representation of a tab while dragging. """ +AUI_NB_ORDER_BY_ACCESS = 1 << 21 +""" Tab navigation order by last access time. """ +AUI_NB_NO_TAB_FOCUS = 1 << 22 +""" Don't draw tab focus rectangle. """ + +AUI_NB_DEFAULT_STYLE = AUI_NB_TOP | AUI_NB_TAB_SPLIT | AUI_NB_TAB_MOVE | \ + AUI_NB_SCROLL_BUTTONS | AUI_NB_CLOSE_ON_ACTIVE_TAB | \ + AUI_NB_MIDDLE_CLICK_CLOSE | AUI_NB_DRAW_DND_TAB +""" Default `AuiNotebook` style. """ + +#---------------------------------------------------------------------- +Mondrian = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAHFJ" + "REFUWIXt1jsKgDAQRdF7xY25cpcWC60kioI6Fm/ahHBCMh+BRmGMnAgEWnvPpzK8dvrFCCCA" + "coD8og4c5Lr6WB3Q3l1TBwLYPuF3YS1gn1HphgEEEABcKERrGy0E3B0HFJg7C1N/f/kTBBBA" + "+Vi+AMkgFEvBPD17AAAAAElFTkSuQmCC") +""" Default icon for the Smart Tabbing dialog. """ + +# -------------------------- # +# - FrameManager Constants - # +# -------------------------- # + +# Docking Styles +AUI_DOCK_NONE = 0 +""" No docking direction. """ +AUI_DOCK_TOP = 1 +""" Top docking direction. """ +AUI_DOCK_RIGHT = 2 +""" Right docking direction. """ +AUI_DOCK_BOTTOM = 3 +""" Bottom docking direction. """ +AUI_DOCK_LEFT = 4 +""" Left docking direction. """ +AUI_DOCK_CENTER = 5 +""" Center docking direction. """ +AUI_DOCK_CENTRE = AUI_DOCK_CENTER +""" Centre docking direction. """ +AUI_DOCK_NOTEBOOK_PAGE = 6 +""" Automatic AuiNotebooks docking style. """ + +# Floating/Dragging Styles +AUI_MGR_ALLOW_FLOATING = 1 << 0 +""" Allow floating of panes. """ +AUI_MGR_ALLOW_ACTIVE_PANE = 1 << 1 +""" If a pane becomes active, "highlight" it in the interface. """ +AUI_MGR_TRANSPARENT_DRAG = 1 << 2 +""" If the platform supports it, set transparency on a floating pane +while it is dragged by the user. """ +AUI_MGR_TRANSPARENT_HINT = 1 << 3 +""" If the platform supports it, show a transparent hint window when +the user is about to dock a floating pane. """ +AUI_MGR_VENETIAN_BLINDS_HINT = 1 << 4 +""" Show a "venetian blind" effect when the user is about to dock a +floating pane. """ +AUI_MGR_RECTANGLE_HINT = 1 << 5 +""" Show a rectangle hint effect when the user is about to dock a +floating pane. """ +AUI_MGR_HINT_FADE = 1 << 6 +""" If the platform supports it, the hint window will fade in and out. """ +AUI_MGR_NO_VENETIAN_BLINDS_FADE = 1 << 7 +""" Disables the "venetian blind" fade in and out. """ +AUI_MGR_LIVE_RESIZE = 1 << 8 +""" Live resize when the user drag a sash. """ +AUI_MGR_ANIMATE_FRAMES = 1 << 9 +""" Fade-out floating panes when they are closed (all platforms which support +frames transparency) and show a moving rectangle when they are docked +(Windows < Vista and GTK only). """ +AUI_MGR_AERO_DOCKING_GUIDES = 1 << 10 +""" Use the new Aero-style bitmaps as docking guides. """ +AUI_MGR_PREVIEW_MINIMIZED_PANES = 1 << 11 +""" Slide in and out minimized panes to preview them. """ +AUI_MGR_WHIDBEY_DOCKING_GUIDES = 1 << 12 +""" Use the new Whidbey-style bitmaps as docking guides. """ +AUI_MGR_SMOOTH_DOCKING = 1 << 13 +""" Performs a "smooth" docking of panes (a la PyQT). """ +AUI_MGR_USE_NATIVE_MINIFRAMES = 1 << 14 +""" Use miniframes with native caption bar as floating panes instead or custom +drawn caption bars (forced on wxMac). """ +AUI_MGR_AUTONB_NO_CAPTION = 1 << 15 +""" Panes that merge into an automatic notebook will not have the pane +caption visible. """ + + +AUI_MGR_DEFAULT = AUI_MGR_ALLOW_FLOATING | AUI_MGR_TRANSPARENT_HINT | \ + AUI_MGR_HINT_FADE | AUI_MGR_NO_VENETIAN_BLINDS_FADE +""" Default `AuiManager` style. """ + +# Panes Customization +AUI_DOCKART_SASH_SIZE = 0 +""" Customizes the sash size. """ +AUI_DOCKART_CAPTION_SIZE = 1 +""" Customizes the caption size. """ +AUI_DOCKART_GRIPPER_SIZE = 2 +""" Customizes the gripper size. """ +AUI_DOCKART_PANE_BORDER_SIZE = 3 +""" Customizes the pane border size. """ +AUI_DOCKART_PANE_BUTTON_SIZE = 4 +""" Customizes the pane button size. """ +AUI_DOCKART_BACKGROUND_COLOUR = 5 +""" Customizes the background colour. """ +AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR = 6 +""" Customizes the background gradient colour. """ +AUI_DOCKART_SASH_COLOUR = 7 +""" Customizes the sash colour. """ +AUI_DOCKART_ACTIVE_CAPTION_COLOUR = 8 +""" Customizes the active caption colour. """ +AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR = 9 +""" Customizes the active caption gradient colour. """ +AUI_DOCKART_INACTIVE_CAPTION_COLOUR = 10 +""" Customizes the inactive caption colour. """ +AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR = 11 +""" Customizes the inactive gradient caption colour. """ +AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR = 12 +""" Customizes the active caption text colour. """ +AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR = 13 +""" Customizes the inactive caption text colour. """ +AUI_DOCKART_BORDER_COLOUR = 14 +""" Customizes the border colour. """ +AUI_DOCKART_GRIPPER_COLOUR = 15 +""" Customizes the gripper colour. """ +AUI_DOCKART_CAPTION_FONT = 16 +""" Customizes the caption font. """ +AUI_DOCKART_GRADIENT_TYPE = 17 +""" Customizes the gradient type (no gradient, vertical or horizontal). """ +AUI_DOCKART_DRAW_SASH_GRIP = 18 +""" Draw a sash grip on the sash. """ + +# Caption Gradient Type +AUI_GRADIENT_NONE = 0 +""" No gradient on the captions. """ +AUI_GRADIENT_VERTICAL = 1 +""" Vertical gradient on the captions. """ +AUI_GRADIENT_HORIZONTAL = 2 +""" Horizontal gradient on the captions. """ + +# Pane Button State +AUI_BUTTON_STATE_NORMAL = 0 +""" Normal button state. """ +AUI_BUTTON_STATE_HOVER = 1 << 1 +""" Hovered button state. """ +AUI_BUTTON_STATE_PRESSED = 1 << 2 +""" Pressed button state. """ +AUI_BUTTON_STATE_DISABLED = 1 << 3 +""" Disabled button state. """ +AUI_BUTTON_STATE_HIDDEN = 1 << 4 +""" Hidden button state. """ +AUI_BUTTON_STATE_CHECKED = 1 << 5 +""" Checked button state. """ + +# Pane minimize mode +AUI_MINIMIZE_POS_SMART = 0x01 +""" Minimizes the pane on the closest tool bar. """ +AUI_MINIMIZE_POS_TOP = 0x02 +""" Minimizes the pane on the top tool bar. """ +AUI_MINIMIZE_POS_LEFT = 0x03 +""" Minimizes the pane on its left tool bar. """ +AUI_MINIMIZE_POS_RIGHT = 0x04 +""" Minimizes the pane on its right tool bar. """ +AUI_MINIMIZE_POS_BOTTOM = 0x05 +""" Minimizes the pane on its bottom tool bar. """ +AUI_MINIMIZE_POS_MASK = 0x07 +""" Mask to filter the position flags. """ +AUI_MINIMIZE_CAPT_HIDE = 0 +""" Hides the caption of the minimized pane. """ +AUI_MINIMIZE_CAPT_SMART = 0x08 +""" Displays the caption in the best rotation (horz or clockwise). """ +AUI_MINIMIZE_CAPT_HORZ = 0x10 +""" Displays the caption horizontally. """ +AUI_MINIMIZE_CAPT_MASK = 0x18 +""" Mask to filter the caption flags. """ + +# Button kind +AUI_BUTTON_CLOSE = 101 +""" Shows a close button on the pane. """ +AUI_BUTTON_MAXIMIZE_RESTORE = 102 +""" Shows a maximize/restore button on the pane. """ +AUI_BUTTON_MINIMIZE = 103 +""" Shows a minimize button on the pane. """ +AUI_BUTTON_PIN = 104 +""" Shows a pin button on the pane. """ +AUI_BUTTON_OPTIONS = 105 +""" Shows an option button on the pane (not implemented). """ +AUI_BUTTON_WINDOWLIST = 106 +""" Shows a window list button on the pane (for AuiNotebook). """ +AUI_BUTTON_LEFT = 107 +""" Shows a left button on the pane (for AuiNotebook). """ +AUI_BUTTON_RIGHT = 108 +""" Shows a right button on the pane (for AuiNotebook). """ +AUI_BUTTON_UP = 109 +""" Shows an up button on the pane (not implemented). """ +AUI_BUTTON_DOWN = 110 +""" Shows a down button on the pane (not implemented). """ +AUI_BUTTON_CUSTOM1 = 201 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM2 = 202 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM3 = 203 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM4 = 204 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM5 = 205 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM6 = 206 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM7 = 207 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM8 = 208 +""" Shows a custom button on the pane. """ +AUI_BUTTON_CUSTOM9 = 209 +""" Shows a custom button on the pane. """ + +# Pane Insert Level +AUI_INSERT_PANE = 0 +""" Level for inserting a pane. """ +AUI_INSERT_ROW = 1 +""" Level for inserting a row. """ +AUI_INSERT_DOCK = 2 +""" Level for inserting a dock. """ + +# Action constants +actionNone = 0 +""" No current action. """ +actionResize = 1 +""" Resize action. """ +actionClickButton = 2 +""" Click on a pane button action. """ +actionClickCaption = 3 +""" Click on a pane caption action. """ +actionDragToolbarPane = 4 +""" Drag a floating toolbar action. """ +actionDragFloatingPane = 5 +""" Drag a floating pane action. """ + +# Drop/Float constants +auiInsertRowPixels = 10 +""" Number of pixels between rows. """ +auiNewRowPixels = 40 +""" Number of pixels for a new inserted row. """ +auiLayerInsertPixels = 40 +""" Number of pixels between layers. """ +auiLayerInsertOffset = 5 +""" Number of offset pixels between layers. """ +auiToolBarLayer = 10 +""" AUI layer for a toolbar. """ + +# some built in bitmaps + +if wx.Platform == "__WXMAC__": + + close_bits = "\xFF\xFF\xFF\xFF\x0F\xFE\x03\xF8\x01\xF0\x19\xF3\xB8\xE3\xF0" \ + "\xE1\xE0\xE0\xF0\xE1\xB8\xE3\x19\xF3\x01\xF0\x03\xF8\x0F\xFE\xFF\xFF" + """ Close button bitmap for a pane on wxMAC. """ + +elif wx.Platform == "__WXGTK__": + + close_bits = "\xff\xff\xff\xff\x07\xf0\xfb\xef\xdb\xed\x8b\xe8\x1b\xec\x3b\xee" \ + "\x1b\xec\x8b\xe8\xdb\xed\xfb\xef\x07\xf0\xff\xff\xff\xff\xff\xff" + """ Close button bitmap for a pane on wxGTK. """ + +else: + + close_bits = "\xff\xff\xff\xff\xff\xff\xff\xff\xcf\xf3\x9f\xf9\x3f\xfc\x7f\xfe" \ + "\x3f\xfc\x9f\xf9\xcf\xf3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + """ Close button bitmap for a pane on wxMSW. """ + +pin_bits = '\xff\xff\xff\xff\xff\xff\x1f\xfc\xdf\xfc\xdf\xfc\xdf\xfc\xdf\xfc' \ + '\xdf\xfc\x0f\xf8\x7f\xff\x7f\xff\x7f\xff\xff\xff\xff\xff\xff\xff' +""" Pin button bitmap for a pane. """ + +max_bits = '\xff\xff\xff\xff\xff\xff\x07\xf0\xf7\xf7\x07\xf0\xf7\xf7\xf7\xf7' \ + '\xf7\xf7\xf7\xf7\xf7\xf7\x07\xf0\xff\xff\xff\xff\xff\xff\xff\xff' +""" Maximize button bitmap for a pane. """ + +restore_bits = '\xff\xff\xff\xff\xff\xff\x1f\xf0\x1f\xf0\xdf\xf7\x07\xf4\x07\xf4' \ + '\xf7\xf5\xf7\xf1\xf7\xfd\xf7\xfd\x07\xfc\xff\xff\xff\xff\xff\xff' +""" Restore/maximize button bitmap for a pane. """ + +minimize_bits = '\xff\xff\xff\xff\xff\xff\x07\xf0\xf7\xf7\x07\xf0\xff\xff\xff\xff' \ + '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' +""" Minimize button bitmap for a pane. """ + +restore_xpm = ["16 15 3 1", + " c None", + ". c #000000", + "+ c #FFFFFF", + " ", + " .......... ", + " .++++++++. ", + " .......... ", + " .++++++++. ", + " ..........+++. ", + " .++++++++.+++. ", + " ..........+++. ", + " .++++++++..... ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .......... ", + " "] +""" Restore/minimize button bitmap for a pane. """ + +#---------------------------------------------------------------------- + +down_focus_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACaUlE" + "QVRIib2WvWsUQRjGn5mdnWxyTaqz9q+QlLnGToSgWAYDNjbpNCAGDGIvaRPbNJGQyiAEbK+w" + "sAo2qexyEhbxsvt+jMXc3u3liPfhmWeXnWVm9vc+vO/M7prVzTb+gxyA7Ye/nXPWWmvtXKBb" + "B9YBcM5lWZam6by4QNcBsNamaeq9d87NmWutdc59+NgGoKIizCwsxMTMFI8oZmZilzomZiFm" + "FWERaXbv7eyueO+TJEHM79LSkvfeWnv2qftgex2ASGDmkrUkKUspiIuCy5IL4qKQgnghdQVx" + "ScKsxCKiaH8lIu99NOwAEFGsG4Dv5xeiQYOKBBYVUWJlFhIVVmIlEZGQJKVIYBbWoKqqwQN5" + "nqdpuri42OMys6rGOG/X78yW0bXWNyLqcyyAEEIIYcYK3aB5Lazb4o5fsPc3ToFaloxBwMle" + "6+9Pjfd7stda6HR85+dCPC86Y6ETcQEcHz32eZ7meZrnx0ePJnlk0vwenm70r/PkTgWdjjuV" + "rnPPfvxaa+3NcL3GMaub7XdPtNFoZFn24tmX1/trAOLuM6aaFQwQYExAMPWNaUw1FW+eHj5/" + "dbfZbDYajY33F7e1L4gUA5uo3fd8AWbQH70bjGqEyxLq3LoMYhKCgakCIWZoLLdkMRE43Iy0" + "tWi9QOP8xoIFAyBUjF7dgOizb9iMhLmByxIAHbAGKYigUPX3hqog47hSvfCHfYRaDcNg3IzO" + "7GmydRaGi37zMujrut/9l58nijROQ9yd3ZXLy8urq6vZWFmW9f+Yhrje++XlZR2keDpZa4f+" + "H/pKkiR+/f9dDsDWgQW6QHcuxKg/ZbVtCjjzINkAAAAASUVORK5CYII=") +""" VS2005 focused docking guide window down bitmap. """ + +#---------------------------------------------------------------------- +down_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACY0lE" + "QVRIib2WwWrUUBSG/3tzc5s2m0JhXPsU0u1s3Lkpui4W3PgAuhAFi2/QbesTVEphwCIU3Hbh" + "wk2LG1fujJQgtMk55x4Xd2aS6VAzM479JyQhufnOz3/uzcQMBgP8BzkAeZ4756y11tqlQIui" + "cACcc1mWpWm6ZK61Nk1T771zbilcxBxiAs659x/OAAQJIswsLMTEzBR/UczMxC51TMxCzEGE" + "RaR39WB3b9N7nyTJkLu2tua9t9ZefLx69GYbgIgyc82hJqlrqYiriuuaK+Kqkop4JXUVcU3C" + "HIhFJODsCxF57xu/RBT7BuDb958SNGgQUZYgEogDs5AE4UAcSEREk6QWUWbhoCGEENQDZVmm" + "abq6ujrkMnMIIdZ5t31vsUC3+l+JaMyxAFRVVRds0C1azsS6O273hH24cwq0UjIGipP9/t+f" + "6vZ7st9fKQpf/FqJ28+iEzoTF8Dx0RNflmlZpmV5fPR4lkdmzffwdGe8XyZ3Luh83Ll0k3vx" + "4/dWf3+B/Q2OGQwGGxsbeZ5nWfbi2efXB1sA4uozZjRKDaAwRqGmvTCNGQ3F26eHz1/d7/V6" + "eZ6fn5/f1bogCmhsonU+9AWY5nr0bjCtKS6LtrltGcQQ1MCMCiEm1MmtWUwETh6mjq1qw0Jd" + "fmPD1ADQEWPYNyD6HBs2U2Vu4bIoEBpWE0EE6ej68NaoSBdXRi/8SR/a6qE29830yKFmm2c6" + "2fTbp8FYN/0evPw0U6UuTXB39zYvLy+vr68XY2VZNv5imuB679fX10MT8Xyy1k58P4yVJEn8" + "9/93OQBFURRFsRTcWH8An5lwqISXsWUAAAAASUVORK5CYII=") +""" VS2005 unfocused docking guide window down bitmap. """ + +#---------------------------------------------------------------------- +left_focus_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACVElE" + "QVRIibWWvW8TQRDF3+7Ors8ShSsaSpo0dEgoFcINVChSBFRUkajpIKKgiPgP0pqGJiAhITqE" + "FIk2BQUVHT2VK+y7ndmhWN/5Ixcbh8tYWvtO8vvdm5mdPXPv+RmuMgjA670/RGSttdZ2q354" + "YgkAERVF4b3vHABMCIC11nsfQiCiqwJYa4noxbNvOw/6AJIk62ySJMLMwhI5MnPMnxzMzJHJ" + "E0dmicxJhEXk+uTO0fFuCME5h1yDxbh5+zEz93q+LGOv50WUmStOVZSqkjJyWXJVcRm5LKWM" + "3PNURq6iMKfIIpJw9n08Hg8Gg36/3wL4+eu3iHpykcWTS5pElCWJpMiJWaIk4RQ5RRERda4S" + "UWbhpCmllDQA0+k0pZQFVwF3bzEAZ5N3jgje+0COnPVknbUAdm5cW5/1/eGPxcuL2saoAczC" + "DQWAV0/fr1c/HxcBFNC8QGEMMu3NuyddAfIjG9QLjKJTB3NIHV050EZuoQI6+93q4P7B6TYA" + "A2gW1xlC61K0OXi492HZ6EbAnGFqEmBmhlYc7A9HutRq/wgA5plSwDT9tORgfzgCNsmv2QfQ" + "OvEwps7BooOPpwebxFsB83wazdWdl321BjOGWWejrciZ0+wBMwef76LPnx6trXFrivIfVOsl" + "P2V7FwH4MhpuCTBLX7mjckU628naTImlrdDdLDJ59OT+XDDU8SwyTX+Y2bC7hIPVA+fty6/b" + "SmwBODreHY/H0+n0P0WLomjegJYAIYTBYNAcp5cOa20IoQXgnMuvAh0GATg8scAEmHQrneMv" + "3LAo6X/e0vAAAAAASUVORK5CYII=") +""" VS2005 focused docking guide window left bitmap. """ + +#---------------------------------------------------------------------- +left_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACTklE" + "QVRIibWWPWsUURSG3/u5u8RiKxtLmzR2gqQSttFKhKBWqQL+BQXL4D9IGxsrBUGEFCIEbC0s" + "rOzshYHt3Jl7PizuzsduJhs3Ts7C3Z2BfZ95zzn33DGnp6e4zvAAdnZ2vPfWWmvtsOpFUXgA" + "3vvxeBxCuC6AtTaEEGP03g8LQE5RTo73/sXzr7sPJwCExTorLMxExMSJEhGl/MlBRJTIB0+J" + "iBORMBMz3/xz7+h4L8bonFsCunH77lMiGo1CWabRKDArEVUkVeKq4jJRWVJVUZmoLLlMNAq+" + "TFQlJpJEzCz49n0+n0+n08lk0gP4+es3swbvEnHwTlSYlViYJZEQcWJhkkSSmJnVuYpZiZhE" + "RUREI7BYLESkTVE37t8hAM5KcM57hBCid97Z4K2zFsDurRubk74/+9G9vKhtjBrAdG4oALw6" + "eLdZ/XxcBFBA8wKFMci012+fDQXIj2xQLzCKQR20kDqGcqCNXKcCuvzd6+DB4dk2AANoFtcl" + "QutS9Dl49Pj9qtFLAS3D1CTALA2tOdifnehKq/0jAGgzpYBp+mnFwf7sBLhMfsM+gNaJhzF1" + "DroOPpwdXibeC2jzaTRXty37eg2WDLPJRl+RM6fZA6YFn++iTx+fbKxxb4ryH1TrJT9lfxcB" + "+Hwy2xJgVr5yR+WKDLaTtZkSK1thuFlk8ujJ/dkxNPAsMk1/mOWwu4KD9QPnzcsv20psATg6" + "3pvP54vF4j9Fx+Nx8wa0AogxTqfT5ji9clhrY4w9AOdcfhUYMDyAoiiKohhWt4m/9Qss43IB" + "CBMAAAAASUVORK5CYII=") +""" VS2005 unfocused docking guide window left bitmap. """ + +#---------------------------------------------------------------------- +right_focus_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACWElE" + "QVRIibWWv2/TQBTHv3e+uyRbJwZWFv4AJNSRLjChSkhlYqrEzFZVDAwVC3PXsrAUISTExlKJ" + "tQMSWzcmFqaqQqT2+8VwtuMkbiBp+mzF0pPz/dzX7z373IMXp7jJCABebf8JIXjvvffrVd8/" + "9gFACGE4HMYY1w4AxgGA9z7GmFIKIdwUwHsfQth7/vXuoxEAFfWFV1ERZhYWYmJmykcOZmbi" + "EAMTsxCzirCI3BrfPzjcTCkVRYFcg27cubfDzINBLEsaDKKIMXPFWpFUlZTEZclVxSVxWUpJ" + "PIihJK5ImJVYRBSn387Pzzc2NkajUQ/g7McvEYuhIJYYCjUVMRYVUWJlFhIVVmIlERErikrE" + "mIXVVFXVEnB5eamqWXAW8Gb39uKHevbzNwARZVFirUSIlFkqEVUD8Pb71P1Lt83LZ+8BAA7O" + "AYABMAPcFfcvDXj97ikA5wxmHVVrf64LyA7Mau1so770uVjRQa1lzaKtSc2ZWAR4uHsyn2xq" + "YBnjbFp4zsRCBw6Ptz/M5GoHgLla15AfUV8F/gEwA/Bk66jPgXNwMNhkyf199F816DIaB5bx" + "yB2aO2qFLsp/+Xiy22YmczA1Cq4hLQlwsK56xwHgumLWln0pgPv8aWcmNdVF7TKujkWAL0db" + "88nagXWb0xYgVn4XWf0CymdzWQNgapJzWC7HCnPQF5M5aBhXzthqgMkcoF57Zxx6YvaDMzO3" + "148pwMHhJhFdXFwQ0XVEh8NhuwOaAqSUUkoxxvaLulp471NKPYC80ci7gXVFALB/7IExMF6j" + "bht/AXIQRaTUgkiHAAAAAElFTkSuQmCC") +""" VS2005 focused docking guide window right bitmap. """ + +#---------------------------------------------------------------------- +right_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACVElE" + "QVRIibWWv2sUQRTHvzM7M3dHmlQWtjb+AYKkTaOVCEKsrAL+CxaWwcY6bWysRAQRUtgEbC0E" + "u3RWNsJCCILZfb8sZvdu925zej/yveMWHnvvM9837+2OOz09xU0qANjZ2QkheO+999vNXpZl" + "ABBCGI/HMcabAnjvY4wppRDCdgHIJcrFCSG8eP7l7sMJABX1hVdREWYWFmJiZsqfLGZm4hAD" + "E7MQs4qwiNz6c//oeC+lVBRFA+jqzr0DZh6NYlXRaBRFjJlr1pqkrqUiriqua66Iq0oq4lEM" + "FXFNwqzEIqL4+u3i4mJ3d3cymQwAzn/8ErEYCmKJoVBTEWNRESVWZiFRYSVWEhGxoqhFjFlY" + "TVVVLQFXV1eqOitRV68Pby+v6fnP3wBElEWJtRYhUmapRVQNwJvvvftXbpuXz94BABycAwAD" + "YAa4a+5fGfDq7VMAzhnMOllt+rMpIDswa3JnG81lyMWaDppc1i7a2tCCiWWAB4dni8F2Dyxj" + "nPUTL5hY6sDh0eP3c7HGAWCuyWvIJRragX8AzAA82T8ZcuAcHAw2W/JwH/3XHnQZrQPLeOQO" + "zR21Rhflv3w4O5xGZnPQGwXXklYEOFg3e8cB4LrJbLrtKwHcp48Hc6FeF02Xcb2WAT6f7C8G" + "GwfWbU5bglj7WWTNAyh/28sWAL1JzrK8HWvMwZBmc9Ayrp2x9QCzOUCz9s44DGj+hTM3t5ur" + "Bzg63iOiy8tLItok6Xg8np6AeoCUUkopxjh9o64n731KaQCQDxr5NLAtBQBlWZZlucWkXf0F" + "imtJnvbT2psAAAAASUVORK5CYII=") +""" VS2005 unfocused docking guide window right bitmap. """ + +#---------------------------------------------------------------------- +tab_focus_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAAC10lE" + "QVRIidWWT0gUcRTH387+ZveXZgzsbmvSsmqEfzBJSYz+gUsHCYJgISPytCQKFhJdpIN0qIUO" + "ezIUaU/roQ5eEzp46ZT/DhG4haCXdSUPK+Wuzvze+02HgdFmFqMtD76Bx8yb3/v8vr/3Zn4z" + "np6ReTgCYwAwdqfEGFMURVGU/wIdfaswAGCMcc5VVf1fXIBdBgCKoqiq+nxkobn3BABIkgBA" + "hIiEJFAgorAOyxARBTKVoUAkgSiJkIhO73a/nLjGOd/nWkrPXbqLiH6/CgBEJiIaKA1BhkG6" + "QF1Hw0BdoK6TLtCvMl2gIQhRCiQiCfPLm5ubtbW1YNXXtuzadyJTZV4AkKYkMpEkkRQoEUmQ" + "JJQCpSAiMr1eg8hEJJSmlFJK0wdQLBYR0cl9laj7l6LGY5/tc2ejsrmdgeGJbG5nYHgym9uJ" + "x9KHeGuMNd7B8fSMzCfvyerq6rHHn2bmEgPDE09G+/9WaSqZmRofisfSiadnotHoozclp94K" + "oGWznNxn/e8q4LqznNwXmb4KuO6s4643lZyugOvOcj8PDyrgurOOe30r05tKZv7ALavXmszt" + "rXZZL7EjhTmuU8lpRxNSyemZuUEAmJlLOPzU+CAAuKFluO7OWpF4LO1OPsTcejOOTcRepqXR" + "tngs7Y6U4bbcqNrIF6bGh6yt0prAgm7kC6E2fSNfWF9b2d7e1jStvqGlbMSmeRsuP7zZZvp8" + "PvCoW1s/a2qq7vddD57y3b7VZfmNfGFxadUQBgqztbWps7Pdy04uLq0WSyVJnoMRgUY45NM0" + "bXZZ7OvtaA8vLOdeT85mP+4eXN35K/6W5nBjxFz5tv7+w8LWF3+oTW+IBpsavStf1+xIfTTY" + "cNbknDPGfqsD5/xCa6AuDFe791xtEJyHIhHedTGw17tnj49EeFdH8GAkEAhwzgF+7HMZY5qm" + "cc6tD6rDGGOMMUS075aN2Ho9R/R/9gsXZ7dKHM+ODQAAAABJRU5ErkJggg==") +""" VS2005 focused docking guide window center bitmap. """ + +#---------------------------------------------------------------------- +tab_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAAC1klE" + "QVRIidWVTWgTQRTHJ5vZZEyMLKSx1RbSImJbioeiCKIechLBU8CCtadAaaGIFC/iQTxowENO" + "hUohp/Tiocdce/Gk/TiIpTm0JCnmA+OaFJs2u/PerIcp27IbKsZ66Ft47P5n3m/evLc768lm" + "s+Q/GCWEBINBSqmiKIqinApU13VKCKGUMsZUVT1lrqIoqqq+frYyeP8cIUSgIIQgAgACcuAA" + "wOUlDQCAA1UpcADkAAIREPHiwa2383cYY0TWwa7AlRuPAMDvVwkhiBYAmCBMjqaJBgfDANME" + "g4NhoMHBr1KDg8kRQHBAREE+r1er1Z6enkOubbn8d0RLpV5CiLAEogUoEAUHAYAcBYLgIDgi" + "ouX1mogWAIKwhBBCWD5Cms0mADi57xKX/6Ws8dgX+97ZqFxpb3JmPlfam5x5nyvtxWPpE7yc" + "I+c7OJ5sNhsOh4PB4Kunn5aWE5Mz87MvJv4201QyszA3HY+lE88vRaPRYrHozLcDaNsoJ/fl" + "xIcOuO4oJ/dNZqwDrjvqrOebSi52wHVHud+HJx1w3VFnvb6d5ZtKZv7AbZuvXMztZbvkR+wI" + "oY7nVHLR0YRUcnFpeYoQsrSccPiFuSlCiBvahuvurFTisbQ7+ARz55txHCL2NmWOtsVjabfS" + "hjt0L1Cu1BfmpuVRKReQ0HKlHhkxypV6Ib/ZaDQ0TesfGGqr2DTv+Ph4IBDw+XzEo9Zqv0Kh" + "wOOxu10XfA8f3JS+XKmvrm2Z3ARuDQ9fGx297qXnV9e2mvv7Aj3HFQ5md8Snadru7u7Rua6q" + "6sp6aTNXzX08OL67q7f9Q4PdTP1ZKCn5Qq321R8ZMQaiXf19VuGbJ1/8IZX+aNdAnxWJRHp7" + "e7e3t4+4oVCo0Wjout5qtdx9YIwxxlqtlj3aVgmHw5qmbWxsHNWXUqppGmNM/lCd/aWUUgoA" + "9mhbhTFGKT3sm67ruq7v7Oy4cR3bb5uW079be13FAAAAAElFTkSuQmCC") +""" VS2005 unfocused docking guide window center bitmap. """ + +#---------------------------------------------------------------------- +up_focus_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACTUlE" + "QVRIic2WP28TMRjGH/85c1miqEF8CnbUgSFdukVRmZGQ+gW6Vgwd+hW60Yq1gMQMQzpHGZAg" + "C6JS+QIMmUju/L5+Ge6ulzoRTcMh5TmdZfv8/vT4Pcu26h2N8R9kAZwMfltrtdZa60agx5fa" + "ArDWpmmaJElTXGBmAWitkyRxzllrG+Zqra21bz+OAQQOzETExJ48EfniKURE5MkmljwRe6LA" + "TMz8ZPbs9GzXOWeMQZHfW33/NOufvALALESUU8g95zlnnrKM8pwyT1nGmadHic085Z6Jgidm" + "Dhh/mU6nnU6n1WrFXAA/fv7iIEECsxAH5uApELHnwBQ8Bc/MLMbkzELEFCSEEII4YD6fhxAK" + "Tsx9/tQDEIgqOzRggAQQQEEBguIFgKoNqDdfvy1yYq41emG4QKkSpDQAiNQfFQClpBoZcaK2" + "s0awEHzXVVyri1gxN7FaFuILu6qwtAyokqWWwEvcxNTTKsIK95Cqs4JJzV02vMJvHS/1cFFQ" + "UGV+K3tSzWlZq/5bOWGllIio0mzpX+pZSJXdVRmOuabcItRC+ZfKcn+pFRvN65fvNihj9Y7G" + "o9FoMplcX18f9M5lUx30zofD4WQyubm56R2Nm9oYY20B98XeRfPcAro+ei1uf/DBt9u+3c7b" + "7f7gfTPc/cOr7HE36+5k3Z28u5N1u/uHV/dG3X+gfb7YW8dgpC1YD1vBjfP7oEW6Lvf0bHc6" + "nc7n881YaZre3pjucJ1znU7n9qx+qLTWzrkVXGNMcav4d1kAx5camAGzRoiF/gCKPmudbgYP" + "HQAAAABJRU5ErkJggg==") +""" VS2005 focused docking guide window up bitmap. """ + +#---------------------------------------------------------------------- +up_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACTklE" + "QVRIic2WP4vUQBjGn/mTMUtgWS6yvb29XGGzzXXHwdWCcGBzH8BCweK+wnWyWKtot6DNge0V" + "gjYnNn4BA9vdJvO+81ok2ewmi7d3RtgnZEgm8/545skwiZrNZvgPsgCSJLHWaq211r1Asyyz" + "AKy1cRxHUdQzV2sdRZFzzlrbCxdlDmUC1to3Hy8BBA7MRMTEnjwR+fIoRUTkyUaWPBF7osBM" + "zDy+fnR2vu+cM8ZU3KV+fLo+fPUUALMQUUGh8FwUnHvKcyoKyj3lOeee7kU291R4JgqemDng" + "8ut8Ph+NRoPBoM0F8PPXbw4SJDALcWAOngIRew5MwVPwzMxiTMEsRExBQgghiAMWi0UIoclh" + "VY8fegACUVWHBgwQAQIoKEBQngBQ3wPq9bfv7XzX7o1eGS5QqgIpDQAizUMFQCmpR3bf26qc" + "NYKV4nVX7aumaavNjayWlfrSriotdQF1WKoD7nAj00yrLCvdQ+rOGiYNt2t4g9+mXprhoqCg" + "qnxre1LPqatN762asFJKRFRltvIvzSykTndTwm2uqbYItdL+5aLbX2nDRvPiyds7tC2p2WyW" + "pmmSJHEcP3/25cPFSXfQNjqeTE9fPhiPx0mSXF1d9bMxdrUD3OPJtH9uCd0evRX38Oi9Hw79" + "cFgMh4dH7/rhHpxc5PfTPN3L070i3cvT9ODk4saqmz9on6eTbQy2tAPrYSe47XxvtUi35Z6d" + "78/n88VicTdWHMfLP6Y1rnNuNBotv9W3ldbaObeBa4wp/yr+XRZAlmVZlvWCW+oP2FUt8NYb" + "g5wAAAAASUVORK5CYII=") +""" VS2005 unfocused docking guide window up bitmap. """ + +#---------------------------------------------------------------------- +down = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACFUlE" + "QVRIidWVPWvbUBSG3+tv8KKpnYtH/4DuJtCti2nntBm7depQWih0zT9w/AtSQsDQ0JIfkKFD" + "wRC61Iu3uBgRiKXz1eFalizb8QfxkFdCurofz3l1zhVyg8EAe1BhH9BHyC3NWkTU/XYFQEVF" + "mFlYiImZyR9ezMzEpXKJiVmIWUVYRJ7cPT/uHizhFgqF6+93Lz8fAhAxZo5ZY5I4log4ijiO" + "OSKOIomIq+VSRByTMCuxiCiufo3H4yAI8txisQjgz98bUVNTEWNRESVWZiFRYSVWEhGxYjEW" + "MWZhNVVVtQoQhuESrtfXw6e7JbTd+k1E6dv3+/3dQPeo3+8/3n22Si+OLgFLn52D4aLTun/V" + "er8XnVZ1NKqM/lX9eTNaC92IC+D87HUlDMthWA7D87NXmyzZNL+nl0ez60Nyt4Jux91Kee71" + "8Lbd6uxwzXFcr9drNpv+4f2bn59O2gDMAMC5ZJY5wOCcwZxlV7tkKr68PX338Vmj0cBev7f8" + "d0GkSG0i0576Alza7707LGqBy2JZblYOPgnm4JJA8Blay41ZnAfO3xbumWjTQOv8+oKZA2AJ" + "Y1o3wPucGXYLYVZwWQzQlJWmwIMs6Z8OJUHWcUU1aWZ9WKaGlo67xZlTbbbPbL7oq7fBTHm/" + "Jx9+bBRpnea4x92D4XA4mUx2Y9VqteVcAEEQ1Ov13bhZ5fP7IFB4v/v41f8HFQ1ap0nfm7YA" + "AAAASUVORK5CYII=") +""" VS2005 unfocused docking guide window down bitmap. """ + +#---------------------------------------------------------------------- +down_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACaUlE" + "QVRIib2WvWsUQRjGn5mdnWxyTaqz9q+QlLnGToSgWAYDNjbpNCAGDGIvaRPbNJGQyiAEbK+w" + "sAo2qexyEhbxsvt+jMXc3u3liPfhmWeXnWVm9vc+vO/M7prVzTb+gxyA7Ye/nXPWWmvtXKBb" + "B9YBcM5lWZam6by4QNcBsNamaeq9d87NmWutdc59+NgGoKIizCwsxMTMFI8oZmZilzomZiFm" + "FWERaXbv7eyueO+TJEHM79LSkvfeWnv2qftgex2ASGDmkrUkKUspiIuCy5IL4qKQgnghdQVx" + "ScKsxCKiaH8lIu99NOwAEFGsG4Dv5xeiQYOKBBYVUWJlFhIVVmIlEZGQJKVIYBbWoKqqwQN5" + "nqdpuri42OMys6rGOG/X78yW0bXWNyLqcyyAEEIIYcYK3aB5Lazb4o5fsPc3ToFaloxBwMle" + "6+9Pjfd7stda6HR85+dCPC86Y6ETcQEcHz32eZ7meZrnx0ePJnlk0vwenm70r/PkTgWdjjuV" + "rnPPfvxaa+3NcL3GMaub7XdPtNFoZFn24tmX1/trAOLuM6aaFQwQYExAMPWNaUw1FW+eHj5/" + "dbfZbDYajY33F7e1L4gUA5uo3fd8AWbQH70bjGqEyxLq3LoMYhKCgakCIWZoLLdkMRE43Iy0" + "tWi9QOP8xoIFAyBUjF7dgOizb9iMhLmByxIAHbAGKYigUPX3hqog47hSvfCHfYRaDcNg3IzO" + "7GmydRaGi37zMujrut/9l58nijROQ9yd3ZXLy8urq6vZWFmW9f+Yhrje++XlZR2keDpZa4f+" + "H/pKkiR+/f9dDsDWgQW6QHcuxKg/ZbVtCjjzINkAAAAASUVORK5CYII=") +""" VS2005 focused docking guide window down bitmap. """ + +#---------------------------------------------------------------------- +left = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACMElE" + "QVRIib2WPYsTURSG3zv3ThKJRSqblDYLwU6wFMKCViIEtbKQ/QdWgrXt/oO4hZWCIEIKUfYH" + "WFgIATuraewHM3PPh8XNZCaTSWI2oydwMx/kfeY959wzMbPZDC3FaDTavOi23Wgron8n/Z8A" + "rnry/NmXk/vXAAhLZCNhYSYiJvbkiciHTwgiIk8uduSJ2BMJMzHzjd93zi9OmwEAbt5+TETd" + "bpxlvtuNmZWIcpLcc55z5inLKM8p85RlnHnqxi7zlHsmEk/MLPj6LUmS4XDYDPjx8xezxs56" + "4thZUWFWYmEWT0LEnoVJPIlnZlZrc2YlYhIVERHtAIvFYquDu7cIgI0kttY5xHHccdbZKHaR" + "jSIAJ8Pru5M+GX+vnm4rslEDmMoFBYCXT9/uVt+MbQAFNCxQGINAe/XmSVuA8MgGxQKjaNVB" + "CSmiLQe6kqtUQJfHjQ7unV0eAjCABnFdIrQoRZODBw/frRvdCygZpiABZmmo5mAynupaq/0l" + "ACgzpYBZ9dOag8l4CuyT37EPoEXiYUyRg6qD95dn+8QbAWU+jYbqlmWv12DJMLtsNBU5cFZ7" + "wJTgzS76+OHRzho3pij8QLVYwlM2dxGAT9PxgQCz9hU6KlSktZ2sqymxthXam0UmjJ7QnxVD" + "Lc8is+oPsxx2V3BQf+G8fvH5UIkDAOcXp0mSVF94V4ter5emab/frwMADAaDcOOYSNO00+mE" + "4zrgePWaiAMwn8+PF932//MPv0Uk8OspzrYAAAAASUVORK5CYII=") +""" VS2005 unfocused docking guide window left bitmap. """ + +#---------------------------------------------------------------------- +left_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACVElE" + "QVRIibWWvW8TQRDF3+7Ors8ShSsaSpo0dEgoFcINVChSBFRUkajpIKKgiPgP0pqGJiAhITqE" + "FIk2BQUVHT2VK+y7ndmhWN/5Ixcbh8tYWvtO8vvdm5mdPXPv+RmuMgjA670/RGSttdZ2q354" + "YgkAERVF4b3vHABMCIC11nsfQiCiqwJYa4noxbNvOw/6AJIk62ySJMLMwhI5MnPMnxzMzJHJ" + "E0dmicxJhEXk+uTO0fFuCME5h1yDxbh5+zEz93q+LGOv50WUmStOVZSqkjJyWXJVcRm5LKWM" + "3PNURq6iMKfIIpJw9n08Hg8Gg36/3wL4+eu3iHpykcWTS5pElCWJpMiJWaIk4RQ5RRERda4S" + "UWbhpCmllDQA0+k0pZQFVwF3bzEAZ5N3jgje+0COnPVknbUAdm5cW5/1/eGPxcuL2saoAczC" + "DQWAV0/fr1c/HxcBFNC8QGEMMu3NuyddAfIjG9QLjKJTB3NIHV050EZuoQI6+93q4P7B6TYA" + "A2gW1xlC61K0OXi492HZ6EbAnGFqEmBmhlYc7A9HutRq/wgA5plSwDT9tORgfzgCNsmv2QfQ" + "OvEwps7BooOPpwebxFsB83wazdWdl321BjOGWWejrciZ0+wBMwef76LPnx6trXFrivIfVOsl" + "P2V7FwH4MhpuCTBLX7mjckU628naTImlrdDdLDJ59OT+XDDU8SwyTX+Y2bC7hIPVA+fty6/b" + "SmwBODreHY/H0+n0P0WLomjegJYAIYTBYNAcp5cOa20IoQXgnMuvAh0GATg8scAEmHQrneMv" + "3LAo6X/e0vAAAAAASUVORK5CYII=") +""" VS2005 focused docking guide window left bitmap. """ + +#---------------------------------------------------------------------- +right = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACMklE" + "QVRIibWWvY7TUBCFz83vojSuKNiShgdAol8hQYWQkJaKAuUNtqWmoeANFgoqhJAQHRLaB6BA" + "orC0HWnSUEURK2LPmRmKayeO4wTysydWbI+c+e7xzDgOo9EIK0rTdDW4m0Ij4FBK07R1fdmj" + "rh3QqZ6cPf965+ENAKbWardMTZWkUoVCUuIniiSFnW6HQqqQpkpVvfnn3uu395sBAG7fPSXZ" + "73ezTPr9rqqTzGm5aJ5rJswy5jkzYZZpJux3O5kwFyVNqKqGb9/H4/Hx8XEz4PLnL1XvdtpC" + "7Xba5qbqVFM1oZEqakoTmqiqerudqzqpNDczM+8Bs9lsrYNXw1ub7+nl+DcAVaOa0HJVESM1" + "VzVzAG9+LF2/dZFfPHsPAAgIAQAcgDsQ1ly/NeDlu6cAQnC4V7L6/GtfQHTgXuSONopdk4sd" + "HRS5vFy0l6EVE5sAD4YXq8GyBh4xwZcTr5jY6CDg0eMPtVjhAPBQ5HXEW9RUgX8A3AE8OTlv" + "chACAhy+WHJzH/1XDaqM0oFHPGKHxo7aoYviTz5eDOeRxRwsjUIoSVsCAryaveIACNVkPi/7" + "VoDw+dNpLbTURfNlrNcmwJfzk9Vg4cCrzekbEDs/i7x4AMWt3B0AsDTJUR7LscMcNGkxByVj" + "7YztBljMAYq1V8ahQfU/nNrc7q/6e9FkMplOpyKyT9Kjo6MkSQaDQZqmdQdJkiRJsk92AFdX" + "V71eLx7XAQfRYDCYH68FHOr19C8Ad0k9S0aHzwAAAABJRU5ErkJggg==") +""" VS2005 unfocused docking guide window right bitmap. """ + +#---------------------------------------------------------------------- +right_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAAA3NCSVQICAjb4U/gAAACWElE" + "QVRIibWWv2/TQBTHv3e+uyRbJwZWFv4AJNSRLjChSkhlYqrEzFZVDAwVC3PXsrAUISTExlKJ" + "tQMSWzcmFqaqQqT2+8VwtuMkbiBp+mzF0pPz/dzX7z373IMXp7jJCABebf8JIXjvvffrVd8/" + "9gFACGE4HMYY1w4AxgGA9z7GmFIKIdwUwHsfQth7/vXuoxEAFfWFV1ERZhYWYmJmykcOZmbi" + "EAMTsxCzirCI3BrfPzjcTCkVRYFcg27cubfDzINBLEsaDKKIMXPFWpFUlZTEZclVxSVxWUpJ" + "PIihJK5ImJVYRBSn387Pzzc2NkajUQ/g7McvEYuhIJYYCjUVMRYVUWJlFhIVVmIlERErikrE" + "mIXVVFXVEnB5eamqWXAW8Gb39uKHevbzNwARZVFirUSIlFkqEVUD8Pb71P1Lt83LZ+8BAA7O" + "AYABMAPcFfcvDXj97ikA5wxmHVVrf64LyA7Mau1so770uVjRQa1lzaKtSc2ZWAR4uHsyn2xq" + "YBnjbFp4zsRCBw6Ptz/M5GoHgLla15AfUV8F/gEwA/Bk66jPgXNwMNhkyf199F816DIaB5bx" + "yB2aO2qFLsp/+Xiy22YmczA1Cq4hLQlwsK56xwHgumLWln0pgPv8aWcmNdVF7TKujkWAL0db" + "88nagXWb0xYgVn4XWf0CymdzWQNgapJzWC7HCnPQF5M5aBhXzthqgMkcoF57Zxx6YvaDMzO3" + "148pwMHhJhFdXFwQ0XVEh8NhuwOaAqSUUkoxxvaLulp471NKPYC80ci7gXVFALB/7IExMF6j" + "bht/AXIQRaTUgkiHAAAAAElFTkSuQmCC") +""" VS2005 focused docking guide window right bitmap. """ + +#---------------------------------------------------------------------- +tab = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAACq0lE" + "QVRIidWWTWgTQRTHJ+3ETEugERrtF6QhFhKsIlgQRITm5LkBvdiDhBZKc5DiRXryoAEPPRUi" + "pTnVi4cee5NePAitFtFoVxSyheYDa02KCd3deW/Gw2Cy7MZaIz307TK7/Gfeb9587Nvx6LpO" + "TsA6TgJ6glyqHgcHB4/ub0ZvdRFCBApCCCIAICAHDgBcXcoAADhQLwUOgBxAIAIinju89iRz" + "gzHW5Pb09BBCImO3AcDn8xJCECUAWCAsjpaFJgfTBMsCk4NposnB56UmB4sjgOCAiIJsbJXL" + "5b6+PsYYtQev5b8hSi/tJIQIKRAloEAUHAQAchQIgoPgiIiys9NClAAIQgohhJBnCKnX6wDQ" + "jFfZ0+TA/8xpIv6+8e5cN61Qm05ltEJtOvVMK9QS8ewRpWqj2js4nsb+nbv3cnU9OZ3KzD2c" + "/NdIF9IrS4sziXg2+aA/FAr5/X5nvG1AW3o5ufOTL9rgur2c3Mcrd9rgur1Oe7wL6edtcN1e" + "7v1wtw2u2+u0z2978S6kV/7CbRmv6sxdquVSH7HTR/9tE+PLUsqp2cz27k/7PTWbkcezifHl" + "tbW1XC6n6zp1dONeWaUk4tnjTwtx5F81KEcSaQxzdT1p1xPxrFtpwY3d7C6WKkuLMypVqg4U" + "tFiqBEfNYqmi57er1WogEBgOx1oqDVoz/77e2Onu6hq7emGg/6w9imKp8ubt149a/mI0rGqV" + "8u7DlyuXRuzKp8/5yzG/yr9NrmEYm1uFba2svTq0c0eu+2LR88z7Qy905PW9vZwvOGqGQ73D" + "Q1Lf9eR3vitlONQbHpLBYHBwcJAx5rGfd6rV6v7+vmEY7nVgjDHGDMNo1LZUIpGIc34ppYFA" + "gDGmfqgOo5RSSgGgUdtSUSUANLmqWp0q/mTK82hFcX4Bm24GMv+uL+EAAAAASUVORK5CYII=") +""" VS2005 unfocused docking guide window center bitmap. """ + +#---------------------------------------------------------------------- +tab_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAIAAADZ8fBYAAAAA3NCSVQICAjb4U/gAAAC10lE" + "QVRIidWWT0gUcRTH387+ZveXZgzsbmvSsmqEfzBJSYz+gUsHCYJgISPytCQKFhJdpIN0qIUO" + "ezIUaU/roQ5eEzp46ZT/DhG4haCXdSUPK+Wuzvze+02HgdFmFqMtD76Bx8yb3/v8vr/3Zn4z" + "np6ReTgCYwAwdqfEGFMURVGU/wIdfaswAGCMcc5VVf1fXIBdBgCKoqiq+nxkobn3BABIkgBA" + "hIiEJFAgorAOyxARBTKVoUAkgSiJkIhO73a/nLjGOd/nWkrPXbqLiH6/CgBEJiIaKA1BhkG6" + "QF1Hw0BdoK6TLtCvMl2gIQhRCiQiCfPLm5ubtbW1YNXXtuzadyJTZV4AkKYkMpEkkRQoEUmQ" + "JJQCpSAiMr1eg8hEJJSmlFJK0wdQLBYR0cl9laj7l6LGY5/tc2ejsrmdgeGJbG5nYHgym9uJ" + "x9KHeGuMNd7B8fSMzCfvyerq6rHHn2bmEgPDE09G+/9WaSqZmRofisfSiadnotHoozclp94K" + "oGWznNxn/e8q4LqznNwXmb4KuO6s4643lZyugOvOcj8PDyrgurOOe30r05tKZv7ALavXmszt" + "rXZZL7EjhTmuU8lpRxNSyemZuUEAmJlLOPzU+CAAuKFluO7OWpF4LO1OPsTcejOOTcRepqXR" + "tngs7Y6U4bbcqNrIF6bGh6yt0prAgm7kC6E2fSNfWF9b2d7e1jStvqGlbMSmeRsuP7zZZvp8" + "PvCoW1s/a2qq7vddD57y3b7VZfmNfGFxadUQBgqztbWps7Pdy04uLq0WSyVJnoMRgUY45NM0" + "bXZZ7OvtaA8vLOdeT85mP+4eXN35K/6W5nBjxFz5tv7+w8LWF3+oTW+IBpsavStf1+xIfTTY" + "cNbknDPGfqsD5/xCa6AuDFe791xtEJyHIhHedTGw17tnj49EeFdH8GAkEAhwzgF+7HMZY5qm" + "cc6tD6rDGGOMMUS075aN2Ho9R/R/9gsXZ7dKHM+ODQAAAABJRU5ErkJggg==") +""" VS2005 focused docking guide window center bitmap. """ + +#---------------------------------------------------------------------- +up = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACHUlE" + "QVRIidWWP4vUQBjGn8mfcyGQYiM2W8mWsRcLm22uWw6uFpQt7WwVLPwKVsp+gFMsAwqynY2F" + "oLAgNu4HsEiz3E7mfee1yN9Lcueu7oo+IcPMZN4fz7yZzEQlSYIDyAMQx/F+ocvl0tkvsdKh" + "uF6z8eLsAwDLlpmImNiQISKTX7mIiAx5vkeGiA2RZSZmvnF++9nzO0EQ9HC/vj2fPr0PgFmI" + "KCObGc4y1oa0piwjbUhr1oau+Z42lBkmsoaY2eLjpzRN+7kAvn3/wVasWGYhtszWkCViw5bJ" + "GrKGmVlcN2MWIiYr1lpr5QjYbDb9eQBw95YBIBBVdDiAC/iAAAoKEOQ3AJRtQL38/OXS/ALw" + "XKcxXKBUAVIOAIjUDxUApaQcecV7A3DkuYJG8EVX7VpdtNXm+p4jjfjcrsotdQFlslQH3OH6" + "bj2tPCx3Dyk7S5jU3K7hHr91vNTDRUFBFfkt7Uk5p6763lsxYaWUiKjCbOFf6llImd2+DLe5" + "ruM0UlA5uazS7S/Usz88vnf2G2VLKkmSap989OD9m8WsO2gbnU7mD5/cHI/H+C/3yR24p5P5" + "/rk5dHv0VtzpyWsThiYMszCcnrzaD/d4ttDXIx0NdTTMoqGOouPZ4pdR7e+iq3fzyTYGWzrY" + "etj7zwOAOI7/yjmPHRfpFVKr1apqrNfrNE2bx+pOGgwGo9Eor1/wGwRB9QPwh/oH9oed9BPW" + "YyQlBOJt4AAAAABJRU5ErkJggg==") +""" VS2005 unfocused docking guide window up bitmap. """ +#---------------------------------------------------------------------- +up_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAgCAIAAABhFeQrAAAAA3NCSVQICAjb4U/gAAACTUlE" + "QVRIic2WP28TMRjGH/85c1miqEF8CnbUgSFdukVRmZGQ+gW6Vgwd+hW60Yq1gMQMQzpHGZAg" + "C6JS+QIMmUju/L5+Ge6ulzoRTcMh5TmdZfv8/vT4Pcu26h2N8R9kAZwMfltrtdZa60agx5fa" + "ArDWpmmaJElTXGBmAWitkyRxzllrG+Zqra21bz+OAQQOzETExJ48EfniKURE5MkmljwRe6LA" + "TMz8ZPbs9GzXOWeMQZHfW33/NOufvALALESUU8g95zlnnrKM8pwyT1nGmadHic085Z6Jgidm" + "Dhh/mU6nnU6n1WrFXAA/fv7iIEECsxAH5uApELHnwBQ8Bc/MLMbkzELEFCSEEII4YD6fhxAK" + "Tsx9/tQDEIgqOzRggAQQQEEBguIFgKoNqDdfvy1yYq41emG4QKkSpDQAiNQfFQClpBoZcaK2" + "s0awEHzXVVyri1gxN7FaFuILu6qwtAyokqWWwEvcxNTTKsIK95Cqs4JJzV02vMJvHS/1cFFQ" + "UGV+K3tSzWlZq/5bOWGllIio0mzpX+pZSJXdVRmOuabcItRC+ZfKcn+pFRvN65fvNihj9Y7G" + "o9FoMplcX18f9M5lUx30zofD4WQyubm56R2Nm9oYY20B98XeRfPcAro+ei1uf/DBt9u+3c7b" + "7f7gfTPc/cOr7HE36+5k3Z28u5N1u/uHV/dG3X+gfb7YW8dgpC1YD1vBjfP7oEW6Lvf0bHc6" + "nc7n881YaZre3pjucJ1znU7n9qx+qLTWzrkVXGNMcav4d1kAx5camAGzRoiF/gCKPmudbgYP" + "HQAAAABJRU5ErkJggg==") +""" VS2005 focused docking guide window up bitmap. """ + +#---------------------------------------------------------------------- +aero_dock_pane = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAMAAABnVw3AAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAb3WKdHqPdnyRd3+deYGge4OifISifoallZaWgIy1g463hZC5hZG6iJO8o6Sk" + "pKSkpKWlpaampqenqKmpqaqqqqurq6ysrKysra6urq+vr7CwsLGxsbKysrOzs7S0tLS0tLW1" + "tba2tre3t7i4uLm5uru7vLy8vL29vr6+iZfLjJrNjpzPjpzQkZ7PkJ/SlKHSkaHek6Pgk6Th" + "labjmKjlnqzhnqzjoa/npbPov8DAwMDAwMHBwsLCwsPDw8TExMXFxsbGycnJycrKysvLzMzM" + "zM3Nzc7Ozs/Pz9DQ0NDQ0NHR0dLS0tPT09TU1NTU1tbW1tfX0tTY19jY1tjd2NjY2dnZ2dra" + "2tvb29zc29zf3Nzc3N3d3d7e3t/fxs7szNPt0NXo0dfu1djk09js2tzk3d/k3d/m2Nzv3N/r" + "1Nr02N713OH13OL23+X43+X54ODg4eHh4eLi4+Pj4uPm4uPn4+Tk5OTk5OXl5ubm5+fn4eLo" + "4uTs5eXp5efv5+jo6Ojo6enp6urq6+vr6Onv7Ozs7O3t7e7u7u/v4Ob55Oj16Ov37e/26+/9" + "7/D28PDw8fHx8vLy8/Pz8/P09PT09fX19vb29vf38vT89ff9+Pj4+Pj5+vr6+vr7+/v8/Pz8" + "/f39/v7+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAsPpcmgAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAf+SURBVGhD7Zr7d9tEGoa9UKBZCiapneBQN3bUQlgo13DbhXBrnRQnS0LJNhDbUO7s" + "ErCtZWWZm2Rj2YHdbWQsCSQL2/yjZkaypBlpdKH14XA4vL8kkuebx3PR6HtnHBtHkfxyZoGs" + "zMtR4sfjWJRi0mJRHZGlFhej1BCNs1XyocDbpa0ooEjtSfcDOHp6apyFAMzop4XfF2f0K7Vn" + "qpyhr0bT5AwHvhpOkzPQ/TVNjt73lT6c4jzQNV/1p8npq77SBlNsj6b4Sr1Ozmtr99xpvQpm" + "6LKvquyMVezOe9Ze81uDfNbRHLUtiPaqNi8KvrqqztvlRGGbypFJRM7mMoOtnPNHDV8JisOB" + "QczyJolE4qy/MMAX6Pl23VdNGeeMBi+sE0AEzsYl92tgXqj5ipNcnNHo0oYX5OVsnfe8beab" + "VVQcelHveTij895XrJdD6SGc4b+HCIglcHTK0yAPJ4dPAYOJtUd/78b3dAdE4owYz6zzcM4Q" + "3tEop/v18ePHv+7aICJndMbdIDdn93Iwp/vh7VAf2iAy5/KuC+TmPN0J5HQ+eNDUB51Ji8ic" + "zjMhnAwpIbT7TfjXU4+ZeuqfbRNE5miZEE5qGNSe2g//s/RDLYgzSoVwiKlammMmvVTjLE0w" + "NH+UJmV37peFe3yInM3NZp0liz/azk+NM0ptt3tkdXZSxGQ1vD3EDOpiep6s9EVSeW+y5e03" + "/1Qt+ie/Fseb1HnaE5AS+ieL7k+IHMwTzqDDcDofkB+6P8qfRkPtpAEkD9Bbxsa4J+RHyCgo" + "hZRRm/xi9sxZH61smMBUQUEiRzwyC6G3jLk8IY8PdvElWMdf/6745om9DQP0UhELxDjQW8Zc" + "ntDF6Z8CdXSoID/XuxtyTmlBHD0dcy0ALs4oCRLrdiBHpmDuncT7wdWenxZ+I5xhEgxMWHvg" + "2AW3Z+RpD4c/ChMO6WVhjZlMmRwscMjhQwo5WM9+hT8WgyQwCgIVtOLIFPQSSdyKDb7CpwXg" + "DLGa2b49g/W+1jc4LSrgcR1IJgdYpL5tk/o6i4YMYL/hX6TmYD76XtN0k9MPAE044Pt9/5ED" + "qmERQ8DBPWHNMlT6O08eaqqeBManRWn+vrEvUdAbJTVVO3zyHX0SrtXQCOAtAQd71BnVdFQ/" + "fvnQ6qGq9BOyLDcp1d83aj0KFJETqqIerj705Y9muMqgEcBbxhZwT1iVJSjt/dvOrR4q8oQj" + "+/tGtWtyFEk5XD132/saDJeVKhYxABwNFrNVMV7P2he3nDi3+oksaQkQxVMSVga7ABxYc0Lu" + "yZ+snjtxyxcarECqoIVUHXBUowGWSl1RFKVXbrj5xP2rH0tdNQGCeKqLlcEuZJGCFSckUfp4" + "9f4TN9/wigRq6JXQQjLkiC1U2xx0VOKnN91636MHQqN7EnxIL7exMthFm1+G1yeFunDw6H23" + "3vSpCOK5xjZaqKMCTodHtVVjgGryu5DT5ETIqWabWBnsojnhNJkm5Lwrwwpq9S20UEsBnDaW" + "mOWrhrOuaJ8/8MgBx1ydA8a0nOV9sjdwm6tnoXed48vcwSMPfK5VjHAmj0bwEuC0aFTrpaIp" + "4coTB2y1Mwe+VznLYmWwC5bNwq8+xxbZgyeuCGZwqbKOFuIgB/eEueL+RI03vq2U27Ogt4vZ" + "SZKLuUcrE65l4YjO1vYr377RmMQWyjm0LNsL4BQblf2yMAvaXwjhwC4CnP1Kw/qSETiFPUSA" + "A4x2IRPcHujFZxk0br8U2h43B8ye/RAOnKHXxykJd4Dx3AvmZOCQ33Fd7Zlwlpx+oxnXjgX3" + "Hyoap4XNohzWb6VWHHx62eHQbMt2WuY/teeegxXEw9qT5i2vZvAwzn6VT0CO02+McDpt6PSp" + "U+bf9N+MuEQF/YL4PICeL7a12UK9Wr5SclTlN1YMjv2cgqfSeHHIWm4H/lX0s/8wOCvnmbIT" + "WMbWA+D5NmNj3KuVOsgCyF2cMyq5i7NutjfOmtsyytkj46+wWDb7fW6DdSKFoxJi/zqXUvBc" + "Jr+EHCHNzMUdJWBrgJ5fNDsL6O61lFF6MWsGUevW8K4knMDZBOoXlvLecybXMmRVUrBEWnq8" + "98BCE+br8eUuWrWeUr95zr1JZNjQf5P3kpp8re05uXPks4F9tHOSALpGzsqu/z65sjuZlCju" + "GjkJMYDThUuGS+GcVIP2hsVtzP+/sfRf654Kl0CX6t2w/SqwxARx3nr8YVOPvxnAofl22P7b" + "0wXCu9Npj3LlL6auOD3pbQ/dpMP2E3fXsd1ps21xxc5ilbf/DPU2csfLqXXyYfuj42zL23Fx" + "M7k3pHx27NixzxT7WlY8HJqXlsP2e8e5Hd4DiqPJ8nev/unV75AbHg7NdvbC96/HSy3PVIhL" + "6Caf/LqMXbrbwzRF9ywg/S5gc80DiveABXAELYWtroRzaIbvPus9miGcl6xfEOp417k4GFTE" + "OTTb7G4QDmaI5z9rnQbL0A4rLl71Fcqh6RrfEZ+NeP4zHm8uXT4SeM5O+We7ARwZpsaG6nzr" + "qrSXiXyeBebkhcyFCmuPdkLq+qpnWD5DEkfnMhd+wfkcLArOG+20Yaaw66s92kkFfvl5I/6l" + "FgLPAad4TtsJOgecIifgHBB4wun9PgT3lphvrHtSKCI20u9qfJI6Yy33vjr/4Fg98Ee/hZ8H" + "k2bLAu4tsYRomvPN5S1RDvSEU3tOXd4S2yICnnBqHJe3RLMD6AmjKNJ64PKW6C8VoSeMop8B" + "XFekjMjBOHUAAAAASUVORK5CYII=") + +#---------------------------------------------------------------------- +aero_dock_pane_denied = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "ABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAELhJREFUeF7tnfmPHNURx81v" + "hEsCIQQCxCnu60d+AH5BCCGBAAkEP/AHABKKkEhCCErCHcA4WGAIYJwYbOMrGHzgE9vYxvje" + "9drYa+99etd7zHov766PSn3avFFvu3v6dU9Pz2Q9K5Vmtt9VVd9X76zqOWtSCf4NDw9LfX39" + "pMbGxklHR0YKxuHvzj570tVXXz3ptttuO6tgjUykioeGhuTbRYukrr5eRkZG5OTJkwUj6qcd" + "2ptIOiyYLFV79khDQ0PBAPEDm/Zot2BCTZSKFy9eLGNjY6mCc+zYMaHdiaLDgsmxYOHCVIHB" + "kvij3YIJNVEqLoNTwkgWAxysp2w5Fp2iDI6FkoqVxYBz4sQJSYPM6q1sORaIoyRAOX78eCpE" + "W+VhzQIYsgAOwLC8TYvK4EQAB1DY66RBtIX1lIc1C4BQEgobHR1NhegAZXAsgDHDGgrj3CsN" + "ohMwjJYtxwIglITCjh49mgrRAc5YcGpqa2Xjxo2yZs0aWaiKR/m5aNonn0hLS4vodUEq1NTc" + "LO3t7UK7YbzBP3IgD3JZ9LXSzLJj505Zvny57Nu3T7p7eqS/v9/qzGzBggVO3h4tkwb19fU5" + "wyft2lxPGN6QC/mQszQR8OGqqqpKlv3wg7S2tloJ61UISjpy5IgcPnw4FaIDMITaguPlFzmR" + "F7lLGqRdu3bJ1q1bnTHcphf65UFJvb29cujQoVSoq6tLuHmNCw4yIC9yI39JAlRRUSH7q6tj" + "g5I9RlFw6M1tbW2pUEdHh3D7mg84hnfkRw8lBRC3iNu3b88bGGenruDQm5t1oo5KKDpqGSx0" + "cHAwEXDgHz2U1K0qEyMbx7hDmbtcXHDYSDa3tDsbyigAsVJLEhz0gD5KwnpYrcSd/IPmnKiW" + "MzZ2TOoaWuWPr051PvnfFqCkwUEm9FESq7jlK1YkYjHuOScKOAMDA9LRmZG/vj07S/zPcxuA" + "CgEOsqCXolpPtU6ABw8eLBo4AFDb0CX/+GjNacRzG4AKBQ56QT9FA2j9Tz9JJpMpCji0W12b" + "kQ//XRVIpJMvlwUVCpxebXfDhg3FA2fp0qWJO/7ZLAhYalfXD8nsJR3yr7ltgUT63oODzr4p" + "CKBCgcP5IPopmuX899tvndVREqu0KHMOe6DhoyekKxNOg5qP/GmDgzzop2jgFMIZ43t17mO/" + "woon13CEwskXRrmA4YC1s7PTOS6i3SQ7WdFvVwsBDmdUu5VYsbFBZNgpFBlgOMTcvXt3GRyb" + "3slwgMKYK9ggFopYLOzfv98Zfmz4ipqnqBd4hXRjqqisdPyX5+txTqGI+mknaResknC3KiQ4" + "SSsszfrK4KTkdBgX1JJYEKTpAJiWo2G+7STuqLh3715n0xR2j+5O59496nyweMkSZ2WUlsNg" + "Eu3AL3xHkZXNtI1fgluf6B8cxu2N4ob5sRTFfKOYPlfCtXV1zgrJT3HcSm7dtk2WLlvmHB6u" + "WLmyoLTmxx+dC7IgEOETfuE7ipzoxejHdpV3WhhkPmF+NB6FYXdeDciVSl0peZWybv162aO9" + "B2Wk4VjIMh1w/ACCP/iMI2MccAyI2TDIfML88gEHx8Hvvv9+HDjsO37QiyrbnpZUPgBatXr1" + "aR0F/uggaYOTDYPMZ5efDzgodv78+eP8odl0couYlNJt62EopV2vbzb8xQHGLAiiDmuG32wY" + "ZBmck473TRkcz95knvZM97zSE9FyRvTgs2X6dNn3zDNSdd99DvGdZ6RFtRzvHAd/xbCc7B4p" + "H8vhRDjungChg8AJu4Y4zssd3nxTKq64QpruvVd6nn9eMq+9Jn36rOfFF6Xp/vul4sornTzk" + "DQPJWE4QOHFkRAb0E9Z2ULpzLpfPEcwhbTzuPgKBAccdScAlGsNLrt46qouG3Q89JLU33yyZ" + "d9+VgVmzfCkzebLU3Xqrk5cyueo04HijGuAvbiAX5dBPHMsbZzlUEEfJHOUzidoseU1AFHkp" + "4wdOd3e3A04QL2O6vK56/HGpv/126fv4YznyxRdyZOZM6Z87Vwa0p0F85xlp5Km/4w6nDGX9" + "6oUPnApp1w8cd6wQfNvEDpl86CeqXo23bNZy4vYOLrJsgaltGpL+wePZ/DDttRzAYSlthPMK" + "1qIK//XSS6Xr9del7/PPpV979oC+t2bQQzwjjTzkpQxlgxQFOLTrB46788E/ctgChH6igjMu" + "0s5EksUJ8WvVxsMCnGhsT3W3zFx0SBrbT0WrUcaA447DMeAY63LzNKoK3HXTTdLy5JPS9+mn" + "MvjVV1ZE3tannnLKUoefnAYcb0yQmRPhF57gHzmQB/5zyU5+9BNVr77g2FiANw9XyTAYFOh0" + "7NhxaTuUkY9nVsknczTmRoUz+WF63rx5zjLWELefpgd72+pWT5bKSy6RHp3kB6dNi0S9b78t" + "lZddJtThJyebUNp188J3+DP88gn/yIE8yIV8QbKTH/1E1eu4MEgsJ26YH3f8CEHP89LIyKh6" + "X7bLW1NXyZQvK7PgIAxlcoFDurdXNrz3ntTcfbcMqKI7dXXWpRbRrcNWr1JGqY/5R6lfaRDS" + "ZwOap++555wytffcI9Th19vxbwsCB36RjU8DDvIgF/Ihp1d2+Cc/+gkbWfzSs5F2JszP22ts" + "/m9qavK9Qqa3tLV1yqtvfiVvfbhSpkw/BU5D22gWTPLM1Z7pFowdNUrimbf9mpdektZHHpHB" + "l1+WtqeflhNaPuzvpObpffhhp0zro48KdXjrRTkGHK+S4Y/8WBaf8I8cyINcyIecyOK9Sqcu" + "9GOjR3ceM+RnFwQ88Ov9Yc84oEMwor0MUaZqb7W89Mo/5S9vGHAqZJoDzql2KEObCO8WyoBD" + "urftuldekfYHHpChZ5+VVlW4LTg9N94oA7paa3/wQaEOv14O73QKr4JN5yGdcvCPHFOmVzjg" + "IB9yIi/pbj1QF/oJ06EfP8w7WXColMk4KuGEwUbLG+hEfc0th+TPr/1H3piyXCZ/vlM+mtUk" + "dS3DTuwNUWsAMOebb8a1iasSUWKcsXl5adBhqvGaa2ToscekQ0Fqf/996fjgA+nUvc5hHba6" + "lLqVmF8ySn3vvCNHdH7KXH+9DN51lzRee61Qh7de2qJT0K43Df7gF/n4hH/kQB7kQj7kRF63" + "DtAJMjohlxH1yuGvEwZpNqE8gMGotEfjclguMvG5yXH602HgYG3raeAw6cM8AnnBYYzmHoc8" + "Xl7ata09uiAYUksY1n3O8J13yvAtt8jwDTeE0pDmoSx1eOs1bQWBQzqy8ekFB/mQ06sD/gcs" + "9BNVp4DphEEacOg9cXzDKvWGEIX6RT4z3jJZNrd2y9QZFfLR142OcMZhkEDZ2XPmjIv7pB7A" + "QSA/fvY+8YS06Z5l5KqrIhFlKOtXp7F82vXGocIfvMAX+RxwVA7kQS7kQ06v/DwDUPQTVa+0" + "50TaGXBAiyElKhEDybjKhVQQMRxU/tohMxa2SG3zsMMsgGKtRnjTuww45PHjpWHTJtmhFtB5" + "8cUypgq3IfJShrJ+dRrlmU7h7unwRzqy8Qn/yIE8yBUkMzoBIPQTVafZMEgDTpR4GLeL7E4N" + "nILBWo3Jz0X0yM27uqWj62i2p2Gts2fPHjdWUxdKyuVCWztjhmw5/3ypvuACGbrwQjl+0UW+" + "RBp5yEuZINdeE3tKu965E/5IRzaUDf/IgTy55K3Ta206GvqxiRFy58k61qcFDkpHIAREKBin" + "581S4d1mj1Bh4CBInZbbfvnlsv6cc2THuedKzXnnSdNvxHeekUYe8ob5XAMA7XqHIPgz4BiA" + "kCOsQ5YMODBSU1MTidzguKOmcaTAAyWX5RhFN+p4Xv3CC7L9uutkkwLx02/Ed57t1zTyhPVc" + "t+V4I7gBh7kjqnwAydBWdMvJFxz3Kg+h/MABTNLwa8bRfceOHbJlyxbnNSfr9HUna/REYLXe" + "5zj02WeyVv0BCFz65ZdfnOhmXJtY1qJklOYGzA2Od9V5RoKDgpxhTe9i3BMmygsChzQUjEfM" + "NnWd+vnnn2W9euqsViBWqAvVMh2WKMvR/6pVq2TdunUOeOblDfiDEQpoJmsDUBYcLeudvOHv" + "jLOcXOAssRjWmLsMoWSUapTtVrCxhFwvnGB11KJDF6CWJDgspcPGZr90xtQ4wxrg0ObX2jPd" + "9dKzbcAxgDCBU09YAFWudI71N6kVQl4Z4a+oloPfGmv7sEiypMBh7qAu2uTsyguO7YIAfhka" + "cZNFBl/SNHzPoKB0ItoYHv3kgz8sNGoHjLsgcEfaOa/vx+OTSZYeGDWSjIkW5rEEWzLA4GH5" + "o7rC+oETtAl1DzvuzaPftQXPOC3GullIeA8YOSLhgBF33wMHDviCA3/bdEFBR2BRYisjeSmD" + "fqKcELgj7bJvoYobSVavoLDTj3K4xxBDwNIc3X379dZF333nDFNhdbKJ3aUAo9ygV7sMKwAr" + "NZ2YTz8vFywPP3GUGTSswycdyQyhYXyRTr20iX6iROU5kXb67oLTAn1BmfE+apQBzDM22xK3" + "iziPBylj8+bNjsIChyrXEIYL7QZdkSGMH9+LtB42l0EysQjYqUcsYfMt/MK3rYwswRkSo0YZ" + "oH9wSCQCG6HjHv2EKYQNaRiF1VGs9HFHMIloOkYlhQSnWIpNot0yODHex5aE4m3qmPDgrF27" + "1vFrsx3n4+SjftqxUXiUPBMaHG5I9+nylxVPId8vTf20Q3tRlB+Wd8KCw96CV2EVEhRv3bTn" + "3XOFAZArfcKCwxIU/4I0wcHZxHta8X8PDvsLLp/cB4/5CEVZ5g4bYDJ9w9LaMRRKPZlTDn65" + "CG8X7zlfPnJw0gLgRX1rFOdg5qglH2HcZW3B2b2/V+/zm2TqzPpAIn3HnlMv9U4LHHM+xglG" + "Ud+3xpsKORS0ubm0Bc8WHJS9Wx0t3v10eyCRHgaMSU/KcgCHjTmfRX1TIRMpxx9x3uccBJYB" + "x8aNFcX+Wt0qf5+87DTiufHLDquLfEmBQ0fljAy3qKK+45NDBW4gjWuVrXXkyoeSgpzj/Vxb" + "UWxTc4f86W9fZon/jQN6mDuscTpPAhwzpNEmTooxDl2SLcL7k9krcNydxMIAJYUp1Js+MDAo" + "+6rr5Pd/eM/55P8odSRhOcjO/IvVHNQr9ZJ4rzRQc5qK9SSxODDgRDlqN1EANbUN2aiAKOWx" + "nnwtx7jssg0o6kLAa3tcDOFMkQRAKAnFuj32bb97Ix5sypmIhrjgYDEAw8hBXRvVs7Tkfq4F" + "11NcloxXftwhLh9wbMDwy8MQGAccM5SxOgMYLv9K9mdaYAwLYtxlc8owR68y18s2CwaUhAJx" + "dE+DTOyNLThGFlZlWAuyUgcWU7LAmKEOk2YOOqCeNBwsYkkIwXLb5j6dW0R6YRrA0AaKZc7x" + "ugb78crOH1kYvimLxRlfu5IbynKt+xjimBj5xAnEHAaGTdQmmgyA0iD48Yuy8+MTMBw/N51n" + "cBwx8iW7/k2xNvevHdr4J3DvzqkDG7g0iJ6Psm3v+yfErx3GxR8Ai/KDeoRclP9yawBwmGRT" + "/0G9MjjhXRNw0vxBvXFhfuHsndk5ACduGGTUED/yZ39Qr2w54R0vbXerkrhSDldLaeQog1Ma" + "OPhyUQanDE7WFao8rEXoDGXLiaCstLOWwUlb4xHaM0tpmxPsJPKUh7UI4OQTBhkVrNPC/CLw" + "eUZmzScM0uZKwp3HN8zvjNR6BKHjhkGGXUd40wPD/CLwekZmjRMGaXMl4c6TaJhfAVD6HyAO" + "VvwtWIicAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_dock_pane_bottom = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQJgE7q5VA" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAEFtJREFUeNrtXVtsHFcZ" + "/me8a+9617Ed3x3HcXNxnDhxmsShQQqEolKq0pLeVakSqA8g8YIEQvDAC0g8IB6okEAoPEBB" + "QEvbJKWFJqBSWpSUosYpdpzaiXN1Yju+xJfYXtu73hnOd3bPerz3uezMoPqTRrM7u3PO///f" + "ufz/ucxI5EKEQiH16tWrdP36dVpYXCxYPn6fj1paWmjdunVHmpub33Bab9djfn5ePX7ihHrl" + "6lV1cXFRVRSlYAfSRz7Ib3Bw8FmndU+G5LQAyeg5f14tCwZp06ZNtuV548YNmp2bo47du11l" + "D9lpAZJx/do12rBhg615NjU18XzdBteRsxQOk8fjsTVP5Id83QbXkbOGFayRw6CqqtMipMUa" + "OS6GvY27DthVmiXJVQ7aKriSHBBjZ1PjVoI+8eQgn6KiIqdVTotPPDmoNW51CFxJDuBWg9kJ" + "V5Jjd5/j1oKwRo6LUXByBi5fVm+PjNDS0hJNT09TLpOPjY3xIxqN2mIASZbJ6/HwPF997bWs" + "4sGnq6iooJKSEqpvaKBtW7cW1M0rCDlHjx5t29/Z2TfOFI6Ew7Rj504q9nopGAzmvPfYsWNU" + "Xl5OkUikkHonAE/N5/NRbU0NPfnEEzn/Pzc3x2UbHR2lkydPqjW1tdS5f39BSLKcnJ6eHvXm" + "rVtUX1dH+/buNZQGmjS7ao7IL1+IAlZZWUltbW00PDxMf33rLXVjUxN1dHRYSpKl5Jw7d05d" + "WFigLz74IMmy8ZEhEGNbs2bSlW5sbKT6+nrq6uri+u/bt88ygiwbW/voo49Uf2kpHThwwBQx" + "AIylKIotBwqBWecD+kJv6A87WGVTS8jB7OXy8jJtb221RChhNL0H+g+991jpGUJ/2AH2sCI9" + "S8gZYn3Mvffea4mCRoHZ03BE0T2LarXLDjvAHlbANDlnu7rU3bt3Ozo+VV/fQNcHR+jnR1/l" + "Z3x3CrAD7AG7mE3LNDnj4+O8U3QK8Jomp+boty+9R77San7Gd1x3CrAH7GIWpsjp7+9Xt2ze" + "7JgRQMDoxCK9+EoXlZbVJQ58x3UnCYJdYB8zaZgi5zYLxGpY8OYEysrKaGh0mf7y7gj5grUp" + "B67jd/zPCVQzu2DUwQxMxTlzs7Pk9/ttVzwQCNDoVDF19c2Sz1+V8X9dfUu0Z3uQGquDPLK3" + "VUbmVt+9e9dUGqbIwXIir9drq9LA4uIiNTdUUFWlL+d//ewvM5MztssIu5hdbmWKHMQjVk/x" + "FpeU8PgDgR3STwf8PjV5Oy8PcSaUebQBsovYCPlajUzy5wvXTRnc09JCo6ytbmxo4AFdtjgk" + "H+VBQKZFimLQc2hoiFpsXP6bL1xHzq5du+jE66/zYXyMWRUXFxcsL4wuY+Cyr7+fHn/sMadV" + "T4El5FgdZT925AiGQOj06dO0uLRUMOV9rCnb2NzM87NSB6uaetfVHIEOFmXj+CRjbcVnAWBV" + "LTRdc9bm+1NhVbOWSKW3t1fVu80PEbDeEQJ4R5tYO79z506bTGUeH3/8Md0YHOTxVb6AYcfG" + "x6m2tjbve8Q2SOYUSSINwra7PXv20IbGRl3eEQb3QI6emhNmgdkQ85C6u7vpy48+mvI7PKjz" + "vb08bbi6hV4qCze7av167iWmwxtvvklGbAO5hX2M2OaJxx+XJDPb/JB5dXW1IaNgqx+GN9rb" + "21ddP33mDE9z65YtpmdU8wEKw8DAAP+cTNCFCxewmdeQbYyQo7UNtkHKTmzzA/hWPyaEFhj/" + "whqEdtbkYfkRhkAKfZSWltK2bdtofGIiRUbI55htGC8eJ7b5AcgzzGIYbZOIz06s90cNjaYZ" + "jYB8TtkGvKy50i6GY0Eod8FpdUzgtEOeXHOckkfIYYocMzFONi+MN28u2tBkVEez8V+CHCMJ" + "qQbvy6hAUv9jN9LlaaYAGrWPKJgeIYCRuQeV3ZOv8Oh0xX+RebqaIdIxOw+i1xDZ5NfaRsid" + "Sz6hmxpfuKhXHnG/rDWKXugh5sZwmBbDcs77rKiNenUQ+Wb7HYD80CNX/CX0M9Qaae7zJF/Q" + "lRDlNiSi/P4rM3SuL0KH71tPDVWU4j5nM4idyNasoTRP3o3SmXN3WSzmpbYt5TnXcxspaNoW" + "xVSfI/qITPd6PF4am5il9/4zTLK3cpWy/J6kQqHmSK9QyJhvSg2QaH5hmekzTuvLi6i2uoyW" + "lyPZEjalS6JZM3JkWyAuSTIN3hqjF1/5kMLLikbe3AIrmr7MriMbcUIeAegDvaAf9EzWXWsf" + "IzYVeclaAfQemQRAhHvnzjT95g9vx2qXmihIq/+bVDBE52nnLoNkIrLJl+An9gPXD3pC33SF" + "1oge2hpsuuYkC4A28+LANXrhF3/UeMYqiW43uXSkK7121pxMsmivrfxnRQ9R2KAn9BVeXK6C" + "m488ArzPwVB12MAaKwxSzs/PpzQLLc2N9M1vPEu//PXfUkoG5kRERyq+J5oLJgPSwkixXe40" + "PC/kh3yT52uEfJAL0wWK4k/RB3pWlAdWLSAEUUgX9sGhB3CghDfIyTG6k0y7x0WL2dlZqq6q" + "pOefe4D+9Mb5FIWT23ABUXqQpl3k5NP/ZZIH+lVXldPU1NSqdETsZNSuKa60IXKyCI65jOam" + "evrqMwfoxN9vJjw7/B/r0bRVX2sIrUHsQKYmRfyGa5A3MTrNrnk9Mj3D9IK3Njp6O4XgxGJF" + "g3oIOTxmjKFkqDkCw8NDfGf04fsaeJyDvyXXnHT32rknVItMsqzITBTwF9G+fQ3sLHH90kHE" + "KooBPbQBrrkgNEOJ0wJVvrFmHYWW/BRkCi2FIqvinHQ1x85FI8mOSNKPCf3QLwVLJWrb7Gf6" + "KFyvTBBDMEb0SHGlCw3McG5tUhgxY4nnC6R3VZ2dNEjnSgtAbsgPPezasWDL0ihU7ZmZmYz3" + "Jz7HLtiieC5Z0umnx6u1oqA5vuIz05SB47K4AI6QkzBChrE1R5CuBXCYLMdrTjL0mEN0vGZm" + "TeHyRpir7ManFXqEknZD6xBor+ULEUsgckccYhTLrD/EOrGydetS8ne6kfOUMOVy7SSzEtrd" + "ZOm2LOZbTJAO1radef/9zM2PZtZSTlcA4+5uOSNmc5pd4ZDPKduAF0/LPffwx1Nh77wYY8oX" + "iJpx6BEcmcOo2LRUk2G1aD5NFQyGZ7jh/Pn7788Ypff29vKFg83NzSn3Q/Z/vPMONTSkf6gE" + "5Mt3l11y3sI2eta9rdpp19JCHrz54tjx46rHwE4ybGzCclU9UTCUHB4Zob6+Pjp06NCq3yAY" + "2n8YLpcc+A9WZEJulPB0fQbkm5iYoIMHD6bd9Y1AMhQK8cKSDlgJig1c2GVXV1eXt20EOWFW" + "2GGffMF32sE2/f149ttK8ezu7lYHb97UtZIeuwwqKyr4GFK+wEPxqliJbGWKp8OtW7f48w08" + "eXTQPmZwEIpxvHS1F2l4mUEzjQwHAwGqZUavybHe+9LAAN1hJIfzfECfIOfOnTu6dhlAl+aN" + "G7FwfmWXgVHgsYufO3xY97B4PsjHEMUObLPPByAGNebkqVP09FNPGbax61xpAbca3k6srZV2" + "MVxXcyZCsfONSz3051ulNLZYuPJT61PoSFOINrV28O/VpU5rvxquIwf4/qmbpO74Ej3wnEqb" + "/RLBzypmLTd8JQ87w1XIlzI4v/Alo+wDQtUldobLg3HlgZBKR/8lkXzqffrRQxudVjsFriPn" + "2sVukrY8TD/+dJQCKotVmDU9MshgnyUeN3IvRk8vC4LgyymY7GOxyjKIYhcOSCo9eb9M3104" + "yPJ9i6r37nFa/VVwXZ9z/GaAWg5JVBzNPnwiM3ZAWq5DzsIiSPJGFap8KJav22Cq5ojF6Va+" + "SWMqLFOrTyIlS7gFgxezdurufO48MXupsrZQyfBX1KhGv0wXwtaVU2EPs3taTZFTYnLQ0SiK" + "mc79A/P09r+naHImc/7ryz302c4K6thVRss2LUkQy6IQ7ZeYfG6PKXKCZWU8AEVka+WCDJRm" + "NcMBLLKsdrQFCdXrxWMXM6bzzIPbacfOMprX8KddtCnGFKwe0wQ5WM+nZ+gmHUyRg0fiT8/M" + "0IZAwFpy1JVVvPwM48mxz+hCmJ9AIWbw9vYa+lpRhF741bspaXzr65+j1rYamouoq9NSNekX" + "YE5ADKjemZzUNXSTNi0zN7e1tUl4wweEsXJOCGRE4h4VXGDhCic8LiV2vhtWqXV7I/3wO1+g" + "2akbiQPfcR2/KyoljmjSZ6QfUVZqkFmIMTUMkGJkGfYxk57pXrCuvp4/RgQCWUWQwpcjqbFz" + "/FAZY/wzxY/49ZmwQg11FfSD7z1NodlhfsZ3XE/cS0lpaNPla9KsIUZM/uEpHBjFNgvT5OD1" + "JFeuXOGCWfU4FBiLxyKa0q4t9YqoRRSrVRPLRdS+YzP97Cff5md8j9LKfxK1heI1UV1JP6Ja" + "M+MJvcXUxaWLFy15bYsl/iMeNIT5GZQaKwgSzZmS4VCTDlwbXiCqaNrEz+n+I/qcVWQJYkzU" + "HOGdgRg4Rt09PSkTe46Sg/fG4HHCeOoUJq7M9kFKvERHNCVc2+9oa4D2WIimvw5nTdTCaLxW" + "RuL9TTievlFixMwuZlsHLl/mjyy26j06lkVeeG8MShAef4USJEjCNb0rZBCTRKLxGqQ5lLhx" + "hUOQ96HEak1UWSFIOARwMvX0OUIX0b9ghhW6/re7m2di5ftzLB1bg2B48xSe/NTa2spdbQSp" + "Yv4937UGsT5BZWcczBCqFO9n4kUc42s6SrtKq709ni5qUHzYQEiVa75fNGEgRkyPYy3ERdbH" + "oClz9ZunACHg2bNn1YFLl/i6BDzWCorkG5Rh0GFZiZdsOWZYGUaVKNF7yzrMkOxOC/cczZmk" + "rtScXPKBHOw9QuCNKfqRkRGu3yOPPPL/8c42gc7OTi4w3nY4ODjIV8pMTU/ncWc1vTypUh1r" + "19aXSFTmlShQJJGvKDZs45Vjo9NFOswhRqHDjJ0ldp5nF2YjGMdTWCWU6CWW1mH2P0wr50Kl" + "5m2H+wv0Ij2Bgk8Z6H1d48M/fVddZDVnjhmuRJK5gEXc3ZJILYr1HXrIEU0ayFli5GDoZ4GR" + "E2Lexnw4FutEIrHRDTPz/YWA6+ZzgKVIbHimlElXwuzGKg9vxkRThgk3RSc53DNjaS3FD3h2" + "yIM7Cvbv08oLriQHrto8K+oBZjQf62iK0ZRFV1xLVSc5fJiGsRBG7Ymi9sSO0HJsSfAaOXrA" + "SjSatiV2hFlThqkWT7wp45zIMYLygSBHjKMlalA8D441cvRB0RzZpg9yIdO9Im03w3XT1GtY" + "wRo5LsYaOS7GGjkuxho5LoY7yZHtE8ydBojBda50tV+iAPNxg8VywQ3nY9oHvDKVxfN1G1xH" + "zvO7vfTPniLa8Jko+VlwGGTRZ9BL5GcRaElRbODTY2BsLaJI5FNUKmH3e2WViotUquHPspGo" + "6qREX9nrod85rXwSXEfO/o5d1P7hB/T7Cwdpx6dU2lYqUwUjJcjI8LOqVMLO2Lnj0TNCoMZm" + "PBfYMc9q5TQ7JhljlxaJhk4TtSkfUOeeXfklaCNcV5dVhunpafqw5wK93K/Q7fnCxfH1AZme" + "bZPpQEc7VVRUYL7GVfb4H1Voiukj7VWUAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_dock_pane_center = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQKidFE1+x" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAEAxJREFUeNrtXdtvHNUZ" + "/2Zv3l2vb7HjWxzbcRzjJCQOcSKQiBSQEBclFAgX0VYt4qnq9blP/Qeqqi+t2gi1BaQCJYQg" + "oAQQD6VKHhBxwCGJc784dhzbcRzHt73O9Pxm96xnd2e9c9uZqdifdLT27syc832/c77zfec2" + "ArkQS0tL0pUrV+jatWu0HI2WLZ9QMEjd3d1UW1v7TGdn54dOy+16LC4uSu8fOSJdvnJFikaj" + "kiiKZUt4PvJBfqOjoy87LXs+BKcLkI9T330n1UQi1NXVZVue169fp/mFBdq+bZur9OFxugD5" + "uHb1Kq1bt87WPDs6OuR83QbXkROLx8nn89maJ/JDvm6D68ipYAUVchgkSXK6CKqokONi2Gvc" + "dcCu2iwIrnLQcuBKckCMnabGrQR978lBPl6v12mRVfG9Jwetxq0OgSvJAdyqMDvhSnLs7nPc" + "WhEq5LgYZSfn4qVL0q2JCYrFYnT37l0qpfKpqSk5pVIpWxQgeDzk9/nkPA+9996qxYNPV19f" + "T1VVVdTa1kabenvL6uaVhZyDBw/2D+7aNTLNBE7E47R5yxYK+P0UiURK3nv48GGqq6ujRCJR" + "TrmzgKcWDAapee1aev7AgZLXLywsyGWbnJyko0ePSmubm2nX4GBZSLKcnFOnTkk3xsaotaWF" + "dj7wgKFnwKTZ1XJ4flrBK1hDQwP19/fTzZs36d+ffCKt7+ig7du3W0qSpeScPHlSWl5epice" + "f5w8HuMjQyDGNrNm0pVub2+n1tZWGhoakuXfuXOnZQRZNrb2zTffSKFwmHbv3m2KGADKEkXR" + "loRKYNb5gLyQG/JDD1bp1BJyMHuZTCbpvr4+SwrFlaY3of/Qe4+VniHkhx6gDyueZwk546yP" + "2bFjhyUCGgVmT+MJUfcsqtUuO/QAfVgB0+ScGBqStm3b5uj4VGtrG10bnaA/HTwkf+J/pwA9" + "QB/Qi9lnmSZnenpa7hSdArymO7ML9MbbX1Iw3CR/4n987xSgD+jFLEyRc+7cOWljT49jSgAB" + "k7ej9Pq7QxSuackm/I/vnSQIeoF+zDzDFDm3WCC2lgVvTqCmpobGJ5P08X8mKBhpLkj4Hr/j" + "OifQxPSCUQczMBXnLMzPUygUsl3w6upqmpwN0NDIPAVDjUWvGxqJ0cB9EWpvisiRva1lZG71" + "vXv3TD3DFDlYTuT3+20VGohGo9TZVk+NDcGS14bYJXN35mwvI/RidrmVKXIQj1g9xRuoqpLj" + "DwR2eL4a8PvsnVuaPMS5peKjDSg7j42Qr9UoVn6tcN2UwYbubppktrq9rU0O6FaLQ7QIDwKK" + "LVLkg57j4+PUbePyX61wHTn3338/HfngA3kYH2NWgUCgbHlhdBkDlyPnztFzzz7rtOgFsIQc" + "q6PsZ595BkMgdOzYMYrGYmUTPshM2frOTjk/K2WwytS7ruVwbGdRNtL3GZUVn2WAVa3QdMup" + "zPcXwiqzln3K6dOnJb3b/BAB6x0hgHfUxez8li1bil7zuze/oKszMQoG/GVfjenziNRZH6Df" + "vvxo0WvOnj1L10dH5fhKK1Dqqelpam5u1nwP3wbJnCKBP4Ow7W5gYIDWtbfr8o4wuAdy9LSc" + "OAvMxpmHNDw8TD94+umC33/9189ocGsvdXa0UjjooZDPQ1U+gQIs7vEyI+xFbOKBPRZID28o" + "okgSpZj3nZLSnzHmit9ZiNHvX/uCHtpSr0rQhx99REZ0g0rF9WNENweee07wmd3mp9ekQUDE" + "Mh5W+DNnztDWrVtzfl9IEj390Ca6siBRiMWYQZb8HharMEIYR/J9HiHdWeppUygloiIRJLEy" + "J9mnl30RYh7bL3+ylw59/lXBPSjfAzt22LYFUqkb8OJxYpsfIG/1u3495zuMf3kzzcHOXizC" + "lJJIFeaI8jmmG8aLz4ltfgDyjLMYRtnynHYs8vNH+ZzSjcyLo9pYBTBBkuKTKLc16aVR7V7+" + "fLfCMXJkF5xya6uUSegX5I6bWTjRw/uJdB/D+xk5QNPtEKw8S5kkRZly7nFQN4ApcszEOKu5" + "yFBiEuR40iSJQlqJnsxvQuZTTwTNSZA/FcSkpNKtx6iMZs10lhwjD5IM3ldUgMzf8KbizM1N" + "sH99EnOdQYzEGwquSXtseqq20lNLZUiBxyayL8UMPWqymKmARvXDK66PF8DI3IPE7tFaeMzP" + "8GuRuVrL4aYua9bEXLMmtxp2m8BbgU6zpmraKNe0qZWJ64aXu5SuuGxSZuGiXmL4/R5eACPQ" + "Q8z1m3GKxj2a7oOy4kymRKZ2pxTmhys0Jan3H8WS2v3Z1lNCRg6UH3KUWtHK5TNkjRT3+fK/" + "0PUgKk0sJrTOXZ6jkyMJ2vvgGmprpJLuM5QWZcFokOkgIGBUQBF0ZrwCj85RHSVJIAR9WkJc" + "+b5YWZSt/c69FB0/eY+Wl/3Uv7Gu5HpuI2ZNaVFM9Tm8jyh2r8/np6nb8/TlVzfJ42/IEVbK" + "2Bk1oqCshCQyJQo5LcfL/k+bNkm3KyXmmbQU73vE9FCOqhwFLUCgxeUkk2ea1tR5qbmphpLJ" + "VbaqmBwUzpo1I2m1BeKC4KHRsSl6/d2vKZ4UFeUtXeAcsyZmPDdOEuWZKK2Jcu9P8WdrMGti" + "pm/lgDyQC/JBznzZlfoxolOel0dZAL2pWAEQ4c7M3KV//POLTE+crUi51+ZVDPlZlFYaq6AU" + "Q8qYn4SoIIonSUfK3MOfwZ+ZYGwlU7kVp1j5svykf5Dlg5yQV63SGtGrsgWb6nNEFW8Nfcz5" + "i1fpzbeOUlV2TZmU4aewdhSaEqJ7rMl8PBqjDREvtYY91FAlUK1foGqfIA+EBjIDoeiLtHQ9" + "Eq20lDhrRlFGxiJrMsgnzr6fn1yULyrW56ysMlqRg1e2P/75Lfrpj56ijRvW5/RBfPWQXr3i" + "Hr6qSCYHQ9VxA2ussFFqcXGxoADdne30m5+/TH/5+2cFNQNzIlwI/j+HXAYpXaNn2Z9rWMuJ" + "sFTlw8h0mgywwYdd9JKTENMtEeQss7SUSpvPWMau5c/X8PKhXBgxFsVQgTyQs76uOmcBIYgE" + "OdAPkh6AGO4NyuQY3Umm3OOixPz8PDU1NtCrP36M/vXhdwUCF6tR3JRAiXOsn11kaYmREwZB" + "njRBntTKyIBogJx4SkFQcsVMSkU8DL5XSC1egXxNjXU0OzubIw/fLWdUrwVmzRA5qxQcE02Y" + "MHvlpd105PMbWc8O12M9mtImKxUBNSXZ9/dYlV5ICDI5yymBQilBNmdeeT4H5jFt2rSSI/cz" + "8sgDI4cxhbTMUoI9N5GTf66S8B3Kmx2dZt/5WcYvMbngrU1O3iqoaNnFihn96AUvh4//Y+gh" + "RVoOx82b4/LO6L0Ptslxjhyh57UctXuz3prSAVB6XoqRA63kZO9TxDvcQRAVDkE+eOVLl5mo" + "OuSlnTvb2Kcgy6cGHquIBlqOMsA1F4QqvJNiQJNvX1tLS7EQRZhAsaVETpxT2HKcQ0H+Cvmw" + "ADESFqi/J8TkEWW5ioEPwRjRa4ErXW5ghrO3Q2TETGXPF1B3VZ2fbMt3pTlQbpQfcti1Y8GW" + "pVFo2nNzc0Xvz/5ti8iry7KafHq8WisqmuMzoWpTBnYjHYk7P02eD0fIySpBZWxN1KEfDH76" + "MytyVs2P0hN3PuZ7C6n0fJC8AgdzOX6JZlJRCvhUDotwmCzHW45RgJgwU2hjFXMyoqVNjTy2" + "5mGEsM84oyvKUrOXfS4t0emh07S1w/5NYKUgk+PEGZeqawjY31qnAtBimoIC/eGNo6u6q/zx" + "xUSs8hJtbvPQU1vWuGYNAYevKhAouZPMSih3k6ltWYR+sHiwjv0U8aN1EIV8aSUGPOnk95K8" + "CnRpYYnVLole+8VjqoEgAsfjx4/Lm3Y3b96c8zvkRf5vv/MO9WzYQJ3r1xeUBb87pRvw4utm" + "BcPxVNg7D3dRT6cI4ZH0FByZ47wybFpa29RU8PtyLE5hIUX71geoiZkstI5axkgEJHkFCmRW" + "gGIQ9OvhcVpTlZKfp7a+bJGZLOxa27dvn+pxYpAbY2JNKuUAUD6tu+zylcx1o2fdW85Ou+7u" + "dIB9+P33pc39/bp3kmGhdkN9va4oGEJO3LpFI2fP0p49ewp+/9vn39K3k0kKBkrv96xj5D3a" + "lqSpiTHVMqDmQ1iM9amhvq6OOru6qHfjxqJTz9jAhVbX0tKiWTecnJk7d+Rz3LQCjQPHB2Dh" + "/PMHDqxY4uHhYWn0xg1dK+mxy0AmR0fLwaF4jaxG9m3apPr72NiYXECfhs24wVBIVj7G8dRa" + "L57hZwotNjIcqa6mZqb0tUVaDseFixdp5vZtims8oC9LzsyMrl0GkAXmdWBgYGWXgVHg2MVH" + "9u7VPSyuBVoUEXBgm70WgJja2lo6+umn9OILLxjWsWtdabcq3k5Uth26GK5tOZcuXaJp2Pky" + "vnQIHTz6m97eXqfFVYUryTnGYhMcKjc4OFjWcwj4TjLkt+fhh50WuwCuI+ci84xwqq4du8mU" + "O8mQ76YiHqRTcF2fA1Nm9+F62L2GfN0GUy2HL0638k0aCMS0nEQVjUm0GC2dZ4gFquHg6t4s" + "8rPykHGuD7OnBJsiB+M/iPidwOhElIbOzNP8YvHRiZpqL22/L0Jbe8O2lYsviwLZVSb7S1Pk" + "RGpq5AAUka2dJ6gDfd0hIjFOn/73RtFrHtm1nvp6ShNj9SQbyMF6PgSiZmCKHByJf3dujtZV" + "V1tOjhaF9fXUkc+bpEMfDxf89uL+AerpqtP0HCunTEBMdlxNx9CN6rPM3Nzf3y/gDR8ojJUC" + "6ln03dPVSK++NEjL87eyCf/jey0Lya0EH1ODF4iRZejHzPNMe2stra3y6DQKZBVBepQGAtY0" + "ROiVHz5C0aUZ+RP/a53GsIogPhcjE8NiJ4xim4VpcvB6ksuXL8sFQ7KSIK0JWXZ3ttGvfvai" + "/In/9W69sIIceH3QwYXz5y15bYslQSgOGhoZGZHnPRB1m315g5E9qri+taVJt/doNgzgCwj5" + "3NG3w8PUyfRhBSwJQvHeGBwnjFOn+KykU+sS7LiHg5syyBwOh/GWLfnIYqveo2PZCAHeGwNP" + "BbN4qEGcJHxXbPd0Mdj1ehYj6wK4LLx/wbnakBUtBgsgrHx/jqVjaygY3jyFgcS+vj7Z1YaZ" + "4fPvWk+ztbvV8TxLzffzABPE4FqYMqyFOM/6GJgyV795CuAFPHHihHTxwgV5XQLOHIMgWoIy" + "3trsAlc4n70sdS3WIyDwxhT9xMSELN/+/fvLUpvKXkWVbzucvXu35PUQ+sknnrD9hXo49E5L" + "0Njw//62QyX0CoB1CViqFCvjkcVKgBx05iDGzHx/OeC6+RzA6GYuI6i8m1onjHpSRvOqkKMD" + "Rg9KMoIKOTph5y43txIDuG6auoIVVMhxMSrkuBgVclyMCjkuhivJcWK6wY1wHTnKbZDlRv42" + "P7fBdXGOmW2QepG/zc9tcKX9MLoNUi/yt/k5LXc+XFcgDiPbIPUif5uf2/A/9n+1U7cLqMYA" + "AAAASUVORK5CYII=") + +#---------------------------------------------------------------------- +aero_dock_pane_left = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQKBW/8myz" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAD+tJREFUeNrtXWlsVNcV" + "Pm8Wz9iewTYYbxhjjDFmM4SloKwkipI0QiIhIU2VSlV+VVGrqlX6p5XaRpXa/kilVmqriD/N" + "IqWtQkjSJA2ozdJUQJMGEwwYAwZjDLaxjbHB23iW93q/O3PtWT1vmzevynzS9fO8eXOX893l" + "nHOXJ5ENMT09rfT09FBvby/NBAI5S6fY66XGxkZatGjRnoaGhnfzXW7bY2pqSnnr7beVSz09" + "SiAQUGRZzllA/EgH6fX19T2d77InQ8p3BpJx6vRpxe/z0YoVKyxL88qVKzQxOUltGzfaSh6O" + "fGcgGb2XL9OyZcssTbO+vp6nazfYjpzZYJBcLpelaSI9pGs32I6cAuZRIIdBUZR8ZyEtCuTY" + "GNZ27hpgVW2WJFspaAmwJTkgxsquxq4EfeXJQTpOpzPfRU6Lrzw5aDV2VQhsSQ5gV4FZCVuS" + "Y/WYY9eKUCDHxsg5Od0XLyrXBwdpdnaWxsfHKZvIh4eHeYhEIpYIQHI4yO1y8TQPvPnmgtmD" + "TldeXk4ej4dqamtpdXNzTtW8nJCzf//+1q3btnWNsAKHgkFau24dFbnd5PP5sv724MGDVFZW" + "RqFQKJflngM0Na/XS1VLl9ITe/dmfX5ycpLnbWhoiA4dOqQsraqibVu35oQk08k5deqUcvXa" + "NaqprqYtd9yhKw50aVa1HJGeWogKVlFRQa2trTQwMEB//+ADZXl9PbW1tZlKkqnknDhxQpmZ" + "maGHH3qIHA79niEQY1m3ZlCVrquro5qaGmpvb+fl37Jli2kEmeZb+/LLL5XikhLavn27IWIA" + "CEuWZUsCKoFR5QPlRblRfsjBLJmaQg5mL8PhMK1paTElU0JoWgPGD62/MVMzRPkhB8jDjPhM" + "IaefjTGbN282pYB6gdnTYEjWPItqtsoOOUAeZsAwOcfb25WNGzfm1T9VU1NLvX2D9If9B/gV" + "n/MFyAHygFyMxmWYnJGRET4o5gvQmm6OTdKrf/mUvCWV/IrPuJ8vQB6Qi1EYIufcuXPKqqam" + "vAkBBAzdCNArb7RTib96LuAz7ueTIMgF8jEShyFyrjNDbCkz3vIBv99P/UNhev9fg+T1VaUE" + "3Mf3eC4fqGRygdfBCAzZOZMTE1RcXGx5wUtLS2lorIjauybIW7wk43PtXbO0aY2P6ip93LK3" + "NI9Mrb59+7ahOAyRg+VEbrfb0kIDgUCAGmrLaUmFN+uzxeyRWzdvWZ5HyMXocitD5MAeMXuK" + "t8jj4fYHDDvEnw74fuzmdVUa4q3pzN4G5F3YRkjXbGTKv1rYbspgZWMjDbG+uq62lht0C9kh" + "agoPAjItUhROz/7+fmq0cPmvWtiOnA0bNtDb77zD3fjwWRUVFeUsLXiX4bjsOneOHn/ssXwX" + "PQWmkGO2lf3Ynj1wgdCRI0coMDubs8J7WVe2vKGBp2dmGczq6m3XcgTamJWN8FVGYcVnDmBW" + "KzTccgrz/akwq1vjsQwODv68u+fyC691hmlg0pj6lw21pRJ9a52T7t65I/dSMglnz56lK319" + "3L5SCwh2eGSEqqqqVP9GbINkShHnRWJWrPKNP50mpfVOum+nQqtKJILN72VfQ0+CJeGSov2f" + "lj4QFMO6CLNGBVMsyK4z7Hp5RqF/fiaRo+sY/e27X0v5HTSo02fOcMchVN1cL5WFmr1k8WKu" + "JabDu++9R5s2baJldXWaNEfkG2XQ4t4KMqO1n2mPHR0dtPfxxyXpkyPHlBdv7qBf3qeQj/Ht" + "dMTI4EGKXkWCGgqtiMD+RBSQpVBYjt4LsUh/+LFCzy86RvfeuTPhd0eOHqXKykpqXrXK8Iyq" + "GqAydHd38/+TCers7MRmXl1bIPWQIyC2QTpePh2i+nskKpKjtT3XiLBEXOzP2l0SvXo2MUX4" + "v7AGYf26dXz5EVwguQ4lJSW0evVqGrlxIyWvvUxIVm+BBMQ2SMcN1s1Usz7MyiEdaVV5JELa" + "QqEQIR/r/dFCIzFvRHwIMhvL6i2QgNgGWVClbQxeLVCT5bgrQnwNVmKftbYuJUMA5Ng/8Wp4" + "vhXyZJMgX/kR+eDkwH+IsSDCGHBi7HFElQA5lkMoBYqkQyFQoiQosTTwPzQ4KUupefdmow1N" + "eu04o/ZflBwlLkhR4c0N1bEmo1VUijLfUuRYfPwai1iZe05J/JFJBTNLmEaMbEVnOUTF5ORE" + "WAQhFhxytMVIjmgrigor2mQkjQTNdZNKNP5ip0RT7Aq7x0EKpfP2i4IYnQfRKoiFBCgWOIpn" + "EbLlTwhXiS1c1Jof8XtHVBhxLScmUEWOq+1K4nikJvCWEwtlbqbzX52hSsytSFHDNJM89NY2" + "vRBpKVm+BwJBB10ZCGa1v+I1Pj35SRhzImHiBqIzNuYgbUloAHo0AZrv1sqLJOrqHKaPPp+l" + "J79eS0WLnRRgbMtxmVlIIFZioW4Ntfnm7QgdPXGb2WJual1VlnU9t56KFj/Wxro1oqAcHfjh" + "rpn7OqYI8CtpVAjYDxpKJerrH6MDH/SQ01PN76MShCJxY0+accZqcjKmm9ICWNc8E6ZPPx+h" + "xWVOqqr0UzgcWihiQ2VxCIGFWW2OsL4sjO0XGBPmujmFjxmyhoAM1Xki1HXhKr3wm8PMoJqv" + "YTJLI6LMq9LpgH462SDMdViIOJEfgSAT2CtvfEF914ZZTXekLI4XceopR3xanBwIKyRHSYpQ" + "TLVW5v+PH3vUhMUeBw0MjtDPfvV6quApNubEtZz4jMULxIqQTERCSLknHoy2ipdf/5BGR8e5" + "RZ9cDiFkPflJIAfdDLo1BJAUUkRrigoyIshSEbxs4Dp78iQ994Nfp62JiB8NKZKGnHy0nPia" + "mq41JT6jULz6gFu//eOf6Xz35TktLpkYPfkR4GPOayMKLQmEqMIjURkbwH1MpYLq62EDkJt7" + "qSWuLDhUDjot6zfRS7/7MT3/01dTvuu5LdOVSZneY/WigShhjgQuc2QQnmKr1GloXkgP6SbP" + "1yAPuId8YbpAlotTavr3n3uaystKExYQgijECycughZgmkRog1GFgI1pE0xjK2Kf3JGo1ibF" + "lAHepUmkiZyu8QjdW7uUfvGTZ+jFl44kfDfLIpwOzysE8RC1B1qQVeRkG7DFXqF0+Xn2mQep" + "ckkZjY2NJcQjbCe9O/QSVGli5EwxgRWz4GWkFcXI4FzgOUeUILXkQH/5x3WiR1uW0ws/eoR+" + "/9r5ue/Qpc3ENDZR+HhBxAvECmTqUsR3uIf1c3PeaXbP7XLQU09t59ra0ND1FILnFivqLIfI" + "R4ycCCNHptKIgwIsriIn7B2FT7YJPlwayAEw/rxxOUQbFpfRvkebuJ3DyWHxTrO0QmlU6bnf" + "WrgnNJmMdHmZH0eISoudtGVLLbtKNDDQnzYeYavIOsoRb+BGyZFTFQA55gCN9xxogRxTEL4Y" + "CdP6+iW0IzBB5T4HjYxH5hyt/Lk0Lcfqg4mS04/7cq71YFzylUjU2lRMdUtl3pVlgnDB6ClH" + "iiqda3SOyVTc5KcDw2EamF5Yfc0n0qnSAiBndnqYmutly3YsWDLNN8Oa0H8YMbdCC7tqlOgN" + "SwqeDtm80tDagip3DphR0fK+4jPTlEHe82ID2IqcvAonXbeaZ7LyTk4ytIhDDLxGZk2h8oaY" + "qmzH0wqj5DisXTSNtIQo9LYcYUvAcocdohdhpupinZh/0SLbrCEQcFUyfb2UKVD+IoclBHlY" + "dfC7HTTBSl5RlKqgq20DIAdr244eO5a5+4mbtXSka10xdbeMEdOUZlc41rVl22VnJuJ32nlY" + "pXM9u9FNn5x0Uv097AYzTvyuqG+thAVvzLfm1uhbA2DjhGPebm+EeFweV3R9nJ9VCP8nRHvq" + "pzJmMltXBYHhDDdcH7j//oxW+pkzZ/jCwYaGhpTfw+r/6OOPqbY2/aESSysrVe+yS04bcYug" + "Fgk77RobydW2ds2H67/47MG/du6klTsUWsMMrXLGhJ+Rwv4ljxR157glbV0fJ4ZdZ5Wou2aS" + "XW8zknrYjdP/JWq99Rltf6At4TfIGPp/CC7bumQ8gxWZKDxqeLoxAxuvbty4QTt37ky76xuG" + "5PT0NG+B6YCVoNjAhV121dXVqtdKC3KCzDbCcl614DvtBgf5Trsn9u6NVs+bDMdPn6346zmZ" + "rk/ltvlWemR6dNk0rd+8kcrSNMVr167x8w1cKgZoLxM4CMWa5HTdDuJwM4Fm8gz7Skupigkd" + "LWQhXOjuplFGclDlAX2CnNHRUU27DFCWhuXLsXA+usvAiKBx7OKu++7T7BZXAzWCKMrDNns1" + "ADFoMYcOH6Z9Tz6pW8a2U6UF7Cp4K1FYK21j2LblXLx4kW/LUOvL0gMM8Bhvmpub813ctLAl" + "OdhAhUPltm7dmtNzCMROMqR391135bvYKbAdOdhlhlN1rXihHojHiSEwUJEuVGc7wXZjDroy" + "qw/Xw+61dDvb8g1DLQeGoFiqapZHGYaYmpOoAsyYnQpkT7OYWdEl3oW1WaRn5iHjQh5G97Qa" + "Isdj0OloBH2DAWrvnKCJqcxz9P5SJ7Wt8dH65hLL8iWWRYFsj8Hx0hA5Pr+fG6CwbK1ekNHS" + "WEwkB+nwv69mfGbXtuXU0pSdGLPnkUDO1NSUJtdNOhgiB0fij9+6RctKS00nR43AWprKyOUM" + "04H3O1K+27d7EzWtKFMVj5m76IRDdfTmTU2um7RxGflxa2urhDd8IDNmFlDL0tWmFUvo2ae2" + "0szE9bmAz7ivZjmsmRA+NWiB8CxDPkbiM6ytVdfU8GNEkCGzCNIiNBCwuMJH3/7mLgpMj/Ir" + "PqudfzGLoPjJP9hO8GIbhWFy8HqSS5cu8YyZeRyKlsXfSLKxoZa+9519/MqXEpu0BUQLOWLq" + "4sL586a8tsUUI3RFQwN1dXXR2rVrudVt9OUN6ZbGZgOer6mu1Kw9GjUDxMQgiIFidLKjI2Vi" + "Ty9MMULx3hgcJ9zb28snrsweg9RC7x5MvRBdGcqM2dbuixf5kcVmvUfHNA8B3hsDTQXHX6EG" + "CZJwT+sKGas2TulZFyDKIsYXzLCirGgxWMtg5vtzTPWtIWN48xQciS0tLVzVRjcj5t/VnmZr" + "dasTaWab7xcGJogR0+M4wPU8G2PQldn6zVOAyODx48eV7gsX+Am3ONYKBVFjlInWZhWEwMXs" + "ZbZnJyYmuOGNo/AHBwd5+Xbv3p2T2pTzKhr/tsOx8fGsz6PQjzz8sOUv1MOhd2qMxor/97cd" + "xkNrAbAuAYfhzebwyOJ4gBwM5iDGyHx/LmC7+RzAyp1thXdTa4ReTUpvWgVyNECPEaoXBXI0" + "Il/bDu0G201TFzCPAjk2RoEcG6NAjo1RIMfGsCU5djoZN5+wHTlYTiS2+uUaydv87Abb2TmN" + "K1fS0NAQX/UpjtrKFZK3+dkNtuw/Dr71lrK2tdWSF+phFx0mCLHNL9/lTobtMiTQ0dGh9F29" + "qumFQlqRvM3PbvgfnhklmOdyrPoAAAAASUVORK5CYII=") + +#---------------------------------------------------------------------- +aero_dock_pane_right = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQJBxqm5sb" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAD6VJREFUeNrtXVlsVNcZ" + "/mc89oztGWyDd8xgjDEGgx02BSVEkKRK8kCWkkWpIjVKX6pIbdVK6UP7UFWV2r60ah8aRbw0" + "SdUsDSFEJAW60SQCSlIMMXYwqwEb23gBY7zNfnu+O3PG1zN3PHebe2+V+dBhPHfuPcv/nfOf" + "/z/bdZANMTs7K/T19dG1a9doLhDIWTrFHg81NjbSkiVLnvT7/QetLrftMTMzI3xw4IBwpa9P" + "CAQCQiwWy1lA/EgH6fX39z9vddlT4bA6A6k4290t+LxeWrlypWlpXr9+naamp6l940ZbycNp" + "dQZSce3qVVq+fLmpaTY0NIjp2g22IycYCpHL5TI1TaSHdO0G25GTxzzy5DAIgmB1FmSRJ8fG" + "MFe5q4BZtdnhsJWBtgC2JAfEmKlq7ErQ154cpFNQUGB1kWXxtScHrcauBoEtyQHsKjAzYUty" + "zO5z7FoR8uTYGDkn59Lly8LN4WEKBoN0584dyiby0dFRMUSjUVME4HA6qdDlEtPc9/77i2YP" + "Nl15eTm53W6qraujNc3NOTXzckLO3r17W7ds3do7xgocDoVo3fr1VFRYSF6vN+uz+/fvp7Ky" + "MgqHw7ksdxKw1DweD1VXVdHTe/ZkvX96elrM28jICB0+fFioqq6mrVu25IQkw8k5e/asMHDj" + "BtXW1NDmTZs0xQGVZlbL4ekpBa9gFRUV1NraSkNDQ/TXQ4eEFQ0N1N7ebihJhpJz+vRpYW5u" + "jh595BFyOrWPDIEY09SaTlO6vr6eamtrqbOzUyz/5s2bDSPIsLG1M2fOCMUlJbRt2zZdxAAQ" + "ViwWMyWgEug1PlBelBvlhxyMkqkh5GD2MhKJ0NqWFkMyxYWmNqD/UPuMkZYhyg85QB5GxGcI" + "OYOsj7nnnnsMKaBWYPY0FI6pnkU12mSHHCAPI6CbnFOdncLGjRstHZ+qra2ja/3D9Ie9+8RP" + "fLcKkAPkAbnojUs3OWNjY2KnaBVgNd2emKY33/mUPCWV4ie+47pVgDwgF73QRc758+eF1U1N" + "lgkBBIyMB+iN9zqpxFeTDPiO61YSBLlAPnri0EXOTeaIVTHnzQr4fD4aHInQx58Mk8dbnRZw" + "Hb/jPitQyeSCUQc90OXnTE9NUXFxsekFLy0tpZGJIursnSJP8bKM93X2BqljrZfqK72iZ29q" + "HplZfffuXV1x6CIHy4kKCwtNLTQQCATIX1dOyyo8We8tZrdM3p40PY+Qi97lVrrIgT9i9BRv" + "kdst+h9w7BC/HPD7xO2biizEydnMow3IO/eNkK7RyJR/pbDdlMGqxkYaYbq6vq5OdOgW80OU" + "FB4EZFqkyAc9BwcHqdHE5b9KYTtyNmzYQAc+/FAcxseYVVFRUc7SwugyBi57z5+nbz71lNVF" + "T4Mh5BjtZT/15JMYAqFjx45RIBjMWeE9TJWt8PvF9Iwsg1Gq3nYth6OdedkIX2fkV3zmAEa1" + "Qt0tJz/fnw6j1Foylp6eHkHtNj94wGpHCGAdrWR6fv369SaJSj+Onfyc/nwuSsMzua2E9V4n" + "fbvNRZvaN4ozriI52HbX0dFBy+vrVVlHGNwDOWpaTog5ZoPMQurq6qInHn887XdYUN09PWLc" + "MHVzvVQWZvaypUtFK1EOT7z6BQmt99HO7QKtLnEQxkM8LEuQErwslyPeN6jpH+AAwPOKMLHB" + "TQ2xzzn2eXVOoH+cdJCz9wS9+52N5NCzzQ8CrKys1CQUbPXD8EZbW9uC68eOHxfjbF69WveM" + "qhKgMly6dEn8O5Wgz06cpN9O3ke/3CkQ6nGBM0GGGBzxz8S9aqqQwAP7LyqALIEisfi1MIv0" + "R0cF+nHF5+S0YpsfIG71YwRJgfEvrEFoYyoPy48wBJLrUFJSQmvWrKGx8fG0PL55LkYNDzio" + "KBav7blGlCXiYv+t2+Wg17vD5LRimx+ANEPMh+EGBQ9WrPdHC40mRiOkYZypmRqmw8w0d5BW" + "tdshpp03pW0My5xQsXbSQp/AaoNczrDBlZjkE8GR8rtDQ96FDAGIJf7QRY4eH2cxK0xUbzbZ" + "0ISxVfQFUZadAvQ9zrgRIPZBQtw4EBwaDAIhToKQSAN/w4JzSMSZJEeLkAWNzy2IQ/q8tBVZ" + "4NjKpRkTJMERF17SOEg0GbXVSBDmW0osEZ/4mYiY58LFM6Vl7kFgzyhtPeh0k50+axVyLYPH" + "o3ceRA2yrfiMst/CLDhZltysyZQwW3oO9q+QUGgJwtQQlFSTQjz+aMKkht/DpJQkySkVilqo" + "Ieb6UIgCIWfW54xojWrLwNOVFWRC5cC/qWY6bHxgjsoLHfO1XVjYHykJgpAeeFwRYV6BJMnR" + "FBQ8C2LOX5mk46fv0u270QUCSU1b7poZIVO6QDRCooNYVOCgm7eidPDoLbp4bowqipwLCNIT" + "opLACQR09Tmc4kzPulyFNDo+RZ9+PkTOwop0MmSEozkvOrBYuhBYKBYnCMM1k9MR2ndokL5f" + "WUgrl1dQ/4wQ78hVpCdtcYgXrQWf4Vg8njS1piUstkDc4XBS/41ReuO9/1IoMt+HKFGFMUlf" + "ZnbrSYUoPCbJmGSMIBiK0s9/c4R6Lw5QvTu+3jqmMuAf+hve+vB3RIjFW0+qWtOyQp8/l1pQ" + "eP+3bt2h19/657xpQly/ZlaL3BAwc5dBagtKU2tCvEZHZWyUn/3qLRoaHqOlzFJQo8aSVlqK" + "SuNGgWBUy0kVJKyfC5eu0u9efVtiGQvEu13pc6lpW9FyMuWFXwtHE2otQ+N6+Ye/pt4vvyQP" + "65OiMsKWC0lVxtVZQnWGovHAK4LY52AYP6RhjRUGKWdmZtLUQqO/nn7w8vP02h//llZTseaM" + "L1Xi3zmQB8SFkWKzzGkYLEgP6QZk5rL+NCbQskCYCdFFHc70nuW13/+EXJW1dHFS+WYvTlKY" + "NZ0gK2aAfZlhhsdkSCDGMX3E2oyfk6N1J5l0j4sUU1NTVLmsgl564Rv0l4PdC36TqsRU8BqL" + "OM0iJ1v/Fw2z8jDBBZCdlJHIX/z0Baqvq6JPRqOqhm+4+gqLxMTDLEtjJhonJCZtOVr3YEYT" + "m5zkBIm5Hn9DLb343DY68PeBpGWH+7EeTaoSOfjffPOUGZDr8xaAkYNaHYxS0rZ1FxXQK688" + "Rn5mrX08EBGvOVWYa5wcUZXF4nGLJLGoMGcUjkrI0SqMWIaWwzE0NCjujN55bx2d7g3Hna2U" + "liNrvpq4J1QK2XIwSc2wjiEUi48IlHld9PDDTTTlLaN3+kLkYqzwCTil4EYG4kQfE2QXoNow" + "8uBMmNRAsuVoGltbrMYlMDExQfVVS2g2WEzeYgcFZ8ML/By5lmPmopFUQyQNCR9nbE6g8ion" + "3dvhI1ruo5OjEXE4xykda1OITA4o0gHRUam1lmtghrO5IcaIGU2eL5BphMFKLJaXG7Mxevtm" + "hIpW+ah7wpxWbcrSKKioycnJjM8n/45fMKXg2fIih5tzMTo2IhDTbFTsyv2UhuUrPjNNGVie" + "FxvAEnKSQsgwtmYJbKBWU2F5y0mFGvHweSE9s6ZYGxdmpr0dTyt08UKaDdk1BCpqLt/4hEWQ" + "8Ju0IsL6Q6yh8y1ZIp++09wF5UiLVxOXmxUu204yIyHdTSa3ZVFpNUE8WNt2/MSJzH0Vu4eX" + "ySlXAROzoGWMmCaZXeEVRTEqZY/7ipymEORmTcVX6KQpVpxK5na4GletEo+nwt55PsakFBh9" + "RlBDKoiBULFpqSrDalElqgqVCWe44fOhBx9MyzevBD09PeLCQb/fn/Y88v6vo0eprk7+UIk9" + "K2bos54CanggSm7mlPiYheZlAVPVHla9mRypEOlocEL58I2HWeWIy+2Kr4/zMVJ8/yZxzbQL" + "b77Y/8EHgkvDTjJsbFrCap0abx4qaGh4mHp7e2nHjh0LfsMid+h/CC5bPnAPVowi32iBcn0G" + "8jc+Pk7bt2+X3fUNB3l2dlasLHLYtqmD2vpO0rtfbadV9wq0tsRB5YwJH9YSMDLcWDPtAEHq" + "VJ9IDPsMYo00I2iafWKSuI9d6P6CqHXyJG3t2DCvRbq6uoT+gQHZkdlMwC6DivJycYxNKXAo" + "3jLWYlrWrJH9/caNG+L5Bi4FHbSHCRyEYhxPrvUijkJGMkbP5eAtLaXqmpqMLRhAi/zPmW46" + "NFhC48HcKrfaUic93+qkbe1t4omIuiwBHLu4a+fOjIXXg5CCkwqLLNhmrwRozdAoh48coWef" + "eUazjG1nSnPYVfBmIr9W2sawbcu5fPmyuC1DywytUsDoQH/T3NxsdXFlYUtysIEKh8pt2bIl" + "p+cQ8F12SG/H/fdbXew02I4c7DLDqbpmvFAPxOPEEDioSHdNBgvSKtiuz4EqM/twPezsk9vZ" + "ZjV0tRy+ON3IN2lglELJSVQB5rDNBLKnWcw8xRLP4tYs0jPykHEuD717WnWR49Y56KgH/cMB" + "6vxqiqZmMo9O+EoLqH2tl9qaS0zLF4jhy63cOvtLXeR4fT7RAYWXbvaCjJbGYqJYiI58NpDx" + "nl1bV1BLU3ZijJ7HATlYzwdHVA90kYMj8e9MTtLy0lLDyVEisJamMnIVRGjfx11pvz27u4Oa" + "VpYpisfIKRM+oHrr9m2qrq7WF5eeh1tbWx14wwcyY2QB1SylbVq5jF56bgvNTd1MBnzHdSXL" + "eo0EP9sNViDOcIN89MSn21qrqa2l0bExMUNGEaRGaCBgaYWXXvzWLgrM3hI/8V3pNIZRBEkn" + "/+A71TCtohe6ycHrSa5cuSJmzMjjUNQsRkeSjf46+t53nxU/8d2oLSBqyOFTFxcvXDDktS2G" + "OKE4aAjzM+vWrRO9br0vb8i2UFEOuL+2plK19ajXDeATgyAGhtGXXV1pE3taYYgTivfG4Dhh" + "nDqFiSuj+yCl0LpqVSu4KkOZMdt66fJl8chio96jY9gIAd4bA0vl3LlzYg3iJOGa2hUyZm2c" + "0rJmgpeF9y+YYUVZ0WKwlsHI9+cYOraGjOHNUxhIbGlpEU1tqBl+yq3S02zNbnU8zWxnAHEH" + "E8Tw6XGshbjA+hioMlu/eQrgGTx16pRw6eJFcV0CzmRDQZQ4Zby1mQUucD57me1e7D2C440p" + "+uHhYbF8u3fvzkltynkVlb7tcOLOnaz3o9CPPfqo6S/UO/jRR4qcxor/97cdSqG2AFiXgMPw" + "gjk8slgKkIPOHMTome/PBWw3nwOYubMt/25qldBqSWlNK0+OCmhxQrUiT45KWLXt0G6w3TR1" + "HvPIk2Nj5MmxMfLk2Bh5cmwMW5Jjl5NxrYbtyJFug8w1pFsg9S5jygVs5+fo2QapFgteqNfY" + "aHXR02BL/YFtkOtaW015oR520WGC8Ok9e2wnC9tliEPLNki1QKvxr1hBHR0dtpTD/wDriTgZ" + "SBhbDwAAAABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_dock_pane_top = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAGcAAABlCAYAAABQif3yAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzoyMTozMiArMDEwMExUiZ4AAAAHdElNRQfZAxkQKSNpU8hr" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAEFhJREFUeNrtXWlsXNUV" + "Pm8W22OPYzu24yXxEscxzk621kDaAGVTFVqxCoRaxJ9WlSr6j1+V2p+tVLX9U1URUlNVXdgK" + "EhRCgYKgSShtFpw4qx3I6iReEie2x57tvZ7vzVz7eebNzNtm3kPyJ109+828e885313Oucsb" + "iTyISCSiHDzyOf3peIKGp+SildMa9tH31wVoZXvbi21tbT9wW+9MSG4LkInp6Wnl8Rc/J2XN" + "nXRfn0JdIYlCfL+MJS3ja4Cvfr76DOancEoi8R8Jvkb5OsvXKU6DEYU+/UQi3xcHaPdj7S8x" + "QU+7rb8WAbcFyMR/j/STtKqPfnFHkqoUifxszYAPZPDfTIwkpWqUmVoFgtD+ZAVJoQSI4hvb" + "JYUeu8dHL8z00dD5z57ir3iKHKMVsGTYcyxOnTskKkumjFpMgKRgUqa6h1Lleg2eI2dsRqGm" + "ComKN9IsBMppDfnUcr0Gz5GziHl4bswBUJuVHAmQyFyXp+j8LcYhtbxSNVOT8GTLwcCtKGlC" + "cE0bT0kzZLYDUpSFSc7436vwZMsBGXE2mo+vki/loamMpK+Skr5nEHKa0KQiPLa0ay0vbEFe" + "gyfJgbsrswVlad6YPjajTCk/WnWlTdR4lQC1lShz+Qm3mtSy/G6rrAtvkiOn3Fw/SEmnpOZz" + "lRwTLUd0ZSIYVVtNOikWuslSwZPkoLtJLqjhCwNPswOldvyaD0ZTZah5erRf8yQ5MFxc03Ik" + "zXiDq3oxUd0XEJJulXE5lZBfwqNNx5PkJLj/iSdT82gQEC1lriuT0/9bcQjSLVJc0ULVLBdb" + "jnGkxgSFr0gStyApVfPF6CCZdwiSmi5NzRctSE5l4lFuik/O4NCQcvXKFYpGozQxMVFw8N1z" + "gY2WSNVqdezxpQyrOgWa6NNnsuVox5lk2jlIpLtM0XJefe21vOKhyNraWiovL6fmlhZa3d1d" + "1Fn9opCze/fu3q3btp0cHRmheCxGa9aupbJgkMLhcMFn9/z2E3rpukJN3K8tLZeoOihRlV+i" + "CvZ2y5iooC81O+03YRYxCx1jdqJ8neYbk3GiGzE45xL9jfPayd977NFHC+Y1NTVF8Xicrl27" + "Rnv37lUaly2jbVu3FoUkx8k5evSocvHSJWpuaqItmzdbymOWW84UG66cI1AI6FfdLYkUf8rj" + "MkOO6NJATpTJmeUmM8PkRNjjmI4paqwTjyeNZcYQFayuro56e3tpeHiY3n7nHaVtxQrauHGj" + "oyQ5Ss7hw4eVmZkZevCBB8jnsz4zFOVaHWGCKlm6crYbNx61GxNdGRwF2SQ58MxinFc0nWaS" + "qTJAdtI4N1lobW2l5uZmOnTokKr/li1bHCPIsbm1I0eOKKHKStq+fbstYlRwTZ7mqj7Do/Ys" + "J9T4WDKV4rL5pD7LA4varaXzRIpwGRG+2iFHNSLrC72hP+zglE0dIefosWNKgkfx23p6nJEq" + "keraoolUbVdTOi5BDyScBW2C9xXmJpaU9T9X3XNZ04I0ZZBNcgSgP+wAeziRnyPkXOYx5vbb" + "b3dGwzRkTVIKJHR33+0I0IrpS+rVJxV+Rpu/k4AdYA8nYJucg4cOKRs2bCC/353JQzgG326V" + "6PjJL+gnL/xaveJ/M96co/KwHWAP2MVuXrbJGR0dVQdFt7BxaYCuXJugn//yVaqsblWv+B/3" + "3QLsAbvYhS1yTp06pazq6nLNCJvrAzR58Sr97FfvU3Vdx1zC/7iPz90C7AL72MnDFjlXORBr" + "bGx0RfmeGj9dPzdOL77yBYVr27MS7uPz2/h7bvRwDWyXEQ7C7cBW1ZqanKRQKFRyxTurfRQd" + "jtAHn82oXVku4PNvJqepu62KTtxIlFTGKnarb926ZSsPW+REYzEKBoPOa+bL36SvRhS6t6uK" + "WpsqC2YVrpToo7HcvnKxNlHALrCPHdgiR+bATjIzd28ADSGJqhCzlPlyGm6Wg8qP2eAhA9LP" + "jKema/RQwc9XBX1UnS7Xacg21yI8t2Tw3PoAfXTMT8u/wcbnCh8OSBxcEoXYNy73pyY+A+m5" + "tYQB3bGVd0mZxMGnRBWyQuX8fNCnUJlfoUbmrIpJqd8r0fc2e84U3iNn51130LqDn9Kfj/fR" + "mq8ptLrSR7VMSpjJCLGhy/mKjjRgYm4NDSfGCZs6p5nQCU7XufWdmeUAeh9Rr/wf+taOO9xW" + "PQuOkKM4vPnr7ef76P1/H6CX35NpKFK8NeTVPB79tNdH9z9zp6M6ONXVe67lCNz/jTs5uS2F" + "u/Dkjs+vOpxqhbZbDgRxulv7qsOpbm0ul4GBAeXcuXM0Mztr+GFEwGZnCCoqKqijvZ3Wrl1b" + "IlPZx4kTJ+j8hQs0a8I2MOzI6CgtW7bM8DMhtk1nZyetX79eEnnQ62+8oWzatImWt7ZSWVmZ" + "4cwwuQdyzLScGAdml4eHqb+/n77z8MNZn2N9/tjAgJo3ZnidjqMyEQgEqH7pUhhE9/M333qL" + "rNgGcgv7WLHNo488IklYGKoOh6mjo8O0Yii8oaHBklHOnz+vTm+sW7duwf19+/ereXavWmV/" + "RdUAUBkGBwfVvzMJOn78OC1ZssSSbayQo7XN5NQU+c59+SUtX7686EbIxIoVK+gcC6EFdrZg" + "D8I67vKw/QhTIMVOlZWVtHr1ahodG8uSEfK5ZhvmJYD5HzTtUgNlxqLRBV0i/nZjBhktNJlI" + "ZHXPkM8t24CXRVfaw3AtCFVdcFoYE7jtkGe2HLfkEXLYIsdOjJPPC1O7tyJ7aWb1LOVzAnPk" + "WMlIsfhcTgUyxp9SQ69MOxXQqn1ExQwIAaysPSj8jFHhMeiK76JwvZYh8rG7DmLWEPnk19pG" + "yF1IPqEb7GNWF61tfFqjmIUZYs4Px2g25iv4nBOt0awOotx8nwOQH3oUir+EfpZ6I81zgcwb" + "pjKiwoZElH/q7E06fDJOO7++lFrqKct9zmeQUiJft4bafP1WkvYfvsWxWJB6V9VQssA+XisV" + "Tduj2BpzxBiR69lAIEgjY5P08WfD5AvWLVBWSZ9k1iOq1OTkLDerBUg0PZNgfUZpaY2fljVU" + "UyIRz5exLV3mujUrSU73qXpJknx04dII/fGV/1FMs55spJXKmrGsVCkfcUIeAegDvaAf9MzU" + "XWsfKzYVZfm0AphNuQRAhDs+PkF7/vLBgrPkipJRETIqhhg8rcpjJWUSkU++OX7SR7OhH/SE" + "vnqV1ooe2hZsu+VkCoA+8/Tgl/Sb3/1V4xkrJIbdzNqhV3tL2XJyyaK9N/+deT1EZYOe0Fd4" + "cYUqrhF5BNQxB1PVMQt7rDBJOT09ndUtdLa30vM/eop+/4d/ZtUMrImIgVT8P9ddsAyKetIs" + "XjJ3Gp4XykO5mes1Qj7IheUCWQ5l6QM9a2uqFmwgBFHIF/ZBMgM4UMIbVMmBsQp5HnoQz2WS" + "Mzk5SQ31dfTcM/fRy28ey1I4sw8XELUHeZaKHCPjXy55oF9DfQ3duHFjQT4idrJq1yxX2hI5" + "eQTHWkb7imZ69snt9MZ7F+c8O3wfB4y0TV9rCK1BSoFcXYr4DPcg79zsNN8LBnz0JOsFb+3a" + "tatZBIMctICkRT2EHAE7xpBztByB4eHLVFNTw/FNixrnKEp2y9F71mqNs4tcsszLjE2Iftqy" + "pUXdjAj99CBiFdmCHtoA114QmqPGaYEm39q4hCLREIVZoWgkviDO0Ws5pdw0kumIZHw4px/G" + "Jey77u0KsT6yqlcuiCkYK3pkudLFBlY4u1fITMyIqqQwSrar6u6igZ4rLQC5IT/0gD6lQEm2" + "RqFp37x5M+fzc3+nbpRE8UKy6Olnxqt1oqK5vuMz15KB67J4AK6QM2eEHHNrrkCvB3CZLNdb" + "TibMmEMMvHZWTeHyxtlVdus0eD4EhJKlhtYh0N4zChFLIHJHHGIVCR4PsU+sesmSrPLd7uQC" + "5awcBmz416WIyucCNC5T78ii0WqCfLC3bf+BA7m7H82qpU+vAqbd3RompkvnVDjkc8s24CXQ" + "uXKl+noqnJ0Xc0xGgagZyYzgKBxGxduWGnPsFjXSVcFgeIcbrvfec0/OKH1gYEDdONje3p71" + "PGT/14cfUktLi24ZkO/ayAi18ucJnX1t+YwsbGNm3xvkxV7yy5cvq3umAxs3bJD+/vrrCjLB" + "24/M7AeeZeNgu6qZKBhKDl+5QidPnqQdO3Ys+AyCof+H4QrJge9gRybkRg3XGzMg39jYGPX1" + "9eme+kYgGYlE1MqiB+wE3bdvHwW5jKamJsO2EeTEuLLDPkaBxqHa5tQpvPttvnr29/crFy5e" + "NLWTHqcM6mpr1Tkko8BL8eq5Rvaw4nq4dOmS+n6DgIEBuoINDkIxj6fXepFHkA2aa2Y4XFVF" + "y9jojQX2e58ZHKRxJjkWN/ZLIYKc8fFxU6cMoEt7Wxs2zs+fMrAKvHbx7p07TU+LG4ERQ5QV" + "45i9AwAxaDF7332Xnnj8ccs29pwrLeBVw5cSi3ulPQzPtpyhoSH1WIaVFVqjwACP8aa7u9tt" + "dXXhSXJwgAovldu6dasp79EsxEkylLfjrrvcVjsLniMHp8zwVl0rp8nMAsSv5HgCASrKXZ3D" + "g3QLnhtz0JWV+uV6OL2md7LNbdhqOWJzeqHN4GaAQMzIm6hmowpNzxYuM1QuUWVFfm8W5cUN" + "xjBGIOxh90yrLXLKbU462sGFK7N06PgkTU7nnp2orvLTxtvCtK678Ku/nILYFgWyy22Ol7bI" + "CVdXqwEoIttSb8jo6QwRyTF695OLOb9z97Y26ukqTIzT60ggB/v5zEzd6MEWOXgl/sTNm7S8" + "qspxcowYrKerhgL+BL36j/6sz57YtYm6OmoM5ePkkomYUB2/ft3U1I1uXnYe7u3tlfALHxDG" + "SQXNbF3t6qin557cSjOTV+cS/sd9I9thnYSYU4MXiJll2MdOfra9tabmZvU1IhDIKYLMGA0E" + "LK0L07NP302zkXH1iv+NLmM4RZB28Q+xE2ax7cI2Ofh5krNnz6qCOfk6FDObv1FkZ3sL/fiH" + "T6hX/O/UERAz5IilizOnTzvysy2OBKF40RDWZ9asWaNG3fl2gRolxuzKI77f3NRg2nu0GwaI" + "hUEQA8fo8/7+rIU9q3AkCMXvxlSxU4C3TmHhyukxyCis7lq1CtGVQWestg4ODamvLHbqd3Qc" + "myHA78bAU8Hrr1CDBEm4Z3aHTKkOTlnZFyB0EeMLVlihK1oM9jI4+fs5js6tQTD88hQmEnt6" + "elRXG92MWH83Ygy7W52sQJRZaL1fBJggRiyPYy/EaR5j0JV5+penACHgwYMHlcEzZ9R9CXit" + "FRQxEpSJ1lYqCIOL1ctC38XZIwTeWKK/wmEE9Nu1a1dRalPRq6j21w5vTEwU/D6UfujBBx2d" + "68oHseMFL70zEjTWfdV/7VALswpgXwJehgcySwGQg8EcxNhZ7y8GPLeeA5TyZJuTM+pOw7Pk" + "lOpMaK7zqV6AJ8mxEoRaxSI5JuHWsUOvwXPL1IuYxyI5HsYiOR7GIjkexiI5HoYnyfHSm3Hd" + "hOfI0R6DLDYyj/l5DZ6Lc+wcgzSLzGN+XoMn+w8cg1zT22v6GKRZgHycosMCIY75ua13Jjwn" + "kICVY5BmkXnMz2v4P+EM9joepX/9AAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_down = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo1MTo0MyArMDEwMMndnrAAAAAHdElNRQfZAxkQNALaVrQp" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAhJJREFUeNrtl01v2kAQ" + "ht81FgECjUQUyeKjBrfi0EOJktxzg0uOSaWe0lNP/Wk99lBy7A+oSiO1ORE+BChSTjGfBuPs" + "rATCNSkmyHtpX2ll2czOs+OdWTMMXIPBwKnVaqjX6xiORghK0UgEuVwOhmEgFosx1u/3ncrV" + "FYrFItKpFMLhcGBwy7LQ7nRQrVZRLpXAfl5fO4l4HLquBwb9U41GA2avB6V+e4t0Oi0NTMpk" + "MiCuOuavQlXVtRNGFs+NobPWLhphiO783YZ4gut3tc3OEN9/9fDQt5+0ebEbwttCHG9eR335" + "9A0v5LhDx0LlW+tJm6OTLAr59WDHcTaDiwXk96AqNj5/+eH57fzsEIa+t4k7KMur8TMMPYkP" + "744xMO8Wg+7puZ/5HrhfMI3ZbIb9ZByX708xHt6LK93Tc78+XHu+alXrlNdT+PTxgpepBtu2" + "fc8nu1AotB18Op1C0w7EdRMxxrwJtyn8uXOW9ezIt5ErctlwT+SUrTKkKIo7cvrUTSYTKXDK" + "dEo6V+RULrLkipxeuSy4p9QILmvP5yfhAi4z4VbCZZXaMkfZws/W+g//R+Hz4046fIe3R3S6" + "0YEftChIOtuJR1zRLvHiQ4r3afRxCbLeCRzhzWK73Rb/gNRXvGP8WqmILkLTtEAbRQqu0+3i" + "980NyuUyxGabpila5GarhVGALTJF/TKbFS1yIpFgj6VqglrJraorAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_down_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo1NDo1OSArMDEwMEcuCiQAAAAHdElNRQfZAxkQNxVyqGIt" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAABENJREFUeNrtV02IHEUU" + "/qq6529nFnezLtGNEEk0O5NZI4GoQaLxoCJ4NgjBgAe9K/5c9SToQbx6UaJgQLyJXgIRDUkk" + "t+iS1YDgwSWHMGOyO7Mz0z/l97qqZ3vGnd0ZYb1oDY9XXT39vve+eu9VtwJHo9H4+ufrK8+f" + "XQ6xuh5jt8ZCReNM3Ue9uvjl3NzcKUXgH06fvX7C1B7H08cNDpQUSvxjXlGofWqPWo8JYCiR" + "CCchdZe6Q71OudE2uPy9gv7tEj57qXpeXbh4yXzQfAzvnTQoGwWPKL4WMM4JrERgZdwhDgh/" + "sRExCMURLhjOu1rjrW8M3tz3I/QnPwW4/4RCPrIPjRpaWad2Er2Nl+JELoox+xwguP6tDYOD" + "RYW4sz1wnjzeaW3nnh2VKQXDvYpH/FUYWShpLBPXH4fGPCNaudHC+ctNNG6HI/+35y4fTx6b" + "wZGlaYTRznb91BszQmR0aKhWrUDo+fSrX0YaO/XsImqHp9HK+GcyOq2jOM6CG0kGByhabmo7" + "ly1kHqJNg/X6PF7xAnz48Xd/A37t1adwqDqP9cAM2jIZ+0NbkVSQgAUuI6VE0lLpZ2xs9Z2e" + "waHFBbz7xjNYa/7eF7mWdbkfG/QlGpqL/SDeZEDbyPlQbKx2YuhRMocTt367F+PevTN45+0X" + "0F5bTbRcy3r/WQzZyNplJIO0x7YMPIp2ks2XpM4zJXQr9FCvHcBH77+OBw7ux83OYJmmVKcM" + "JlE7SbekD57SnaUs21iGu5s8vLoBzNy3P9HDI7vnm83GYqg0w7MJF2QiV8YhO52oLep2Y0Q5" + "DQA6VgO332IvNNnIaSSIbB/3XaR9qmN3PUF/jV3kUZrA8WbCqeFSs3tiqEXY043tUHG6O2rr" + "yEcNM1QtiV1hwLW9NNtt5KH1Ktl7bR9Mki6lHtv37K0iz+5zWr6h29KByM81DPaS9z0Fhemc" + "QpnHWdGzbTWn7enmTQCenmI9onepW1xYC4Amy1Hx9wVtnUzBO4x8nTcKSicLXpKuPCA8m7GT" + "gKeUC3iX4NKaNwjeZka3erbWgyDajLwb2PY5xasC1xl8QnNKtSRiPCG4ZHaPtrpOpDIEQ4KJ" + "ogztkuotulrmYpEbnReqo836NhOCJ22UKD2JPpLorbRDY50bAA8t9V1Kj1T3tHt9cm8xySEz" + "IXjax/sMOIxkDIDDlQV2Pl7HAd9KUtvZMe574a6M/8H/q+D63/Mii+Pfzc+jMmugwka+2w4U" + "WdjlnMY054Lrv/xQDheuedj3RIQSi7/C7lLJASV2mIJnDxb/H/T2gC2xyN5e4PM5HpF5vqnM" + "c71M0LlvFc4c9eEfXTq8Ur96pfr58nHUHjV4cEpjhqAVgvHDgocNHYDteOOCy6nGMwT8KEGL" + "rP5JadCjX/mu98dFoBpfwbGHl2z3bDab5uq1ZZxbiXGztXufyPeUNV6sajxypI7Z2Vn1F7X+" + "m7ZM/KBNAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_down_focus_single = aero_down_focus + +#---------------------------------------------------------------------- +aero_down_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo1MTo0MyArMDEwMMndnrAAAAAHdElNRQfZAxkQNALaVrQp" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAhJJREFUeNrtl01v2kAQ" + "ht81FgECjUQUyeKjBrfi0EOJktxzg0uOSaWe0lNP/Wk99lBy7A+oSiO1ORE+BChSTjGfBuPs" + "rATCNSkmyHtpX2ll2czOs+OdWTMMXIPBwKnVaqjX6xiORghK0UgEuVwOhmEgFosx1u/3ncrV" + "FYrFItKpFMLhcGBwy7LQ7nRQrVZRLpXAfl5fO4l4HLquBwb9U41GA2avB6V+e4t0Oi0NTMpk" + "MiCuOuavQlXVtRNGFs+NobPWLhphiO783YZ4gut3tc3OEN9/9fDQt5+0ebEbwttCHG9eR335" + "9A0v5LhDx0LlW+tJm6OTLAr59WDHcTaDiwXk96AqNj5/+eH57fzsEIa+t4k7KMur8TMMPYkP" + "744xMO8Wg+7puZ/5HrhfMI3ZbIb9ZByX708xHt6LK93Tc78+XHu+alXrlNdT+PTxgpepBtu2" + "fc8nu1AotB18Op1C0w7EdRMxxrwJtyn8uXOW9ezIt5ErctlwT+SUrTKkKIo7cvrUTSYTKXDK" + "dEo6V+RULrLkipxeuSy4p9QILmvP5yfhAi4z4VbCZZXaMkfZws/W+g//R+Hz4046fIe3R3S6" + "0YEftChIOtuJR1zRLvHiQ4r3afRxCbLeCRzhzWK73Rb/gNRXvGP8WqmILkLTtEAbRQqu0+3i" + "980NyuUyxGabpila5GarhVGALTJF/TKbFS1yIpFgj6VqglrJraorAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_left = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo0NDo0MCArMDEwMN+SkKkAAAAHdElNRQfZAxkQMBKjjWFJ" + "AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAABGdBTUEAALGPC/xhBQAAAkJJREFUeNrtV02P0lAU" + "PS2lUEIlkxlHpCAEZ89Ol27M8A/czMK4duO/caeJiSZu3SgTN25M3DhBFkMmDhQJEK0apnwM" + "0wK1t+Z1YOqyr2w8yWuT95qcc9+97/UeAS6m06nTarWg6zrOZzPwhJJMolQqoVwuI5VKCcJk" + "MnFqh4eoVCrQcjnIssxVgGVZ6PX7qNfrqO7vQ/jSaDhqOo1isciV+Co6nQ5G4zFEvd2GpmmR" + "khPy+TyIW7xwt0SSpMgFECdxi5EzX8HGBDiOs1kBDH7ymaKoIAjCpQAiXy6XXAlFUfR4aBA5" + "EyBGET2R630LM+tvxpmQNQG8BpE3T8/w8cjEb3MREMe1BuLxOL4bY3z4NIAob/nzq1x+DYQt" + "IBaLodM18PpNA0p6Fwn5kpzqjXZmTUCYRUiR//x1hucv3yOl3lhbY4Gyd+g7QJGffG3jxau3" + "SCg7gXUWLH3nC6BfJI2wUC4V8OTxAZ4+qwXWiGexWPgp8J40EeYwTRM72xk8OrgfEMC+CRzD" + "sEUYhoFi4ToePriDuBTzBdD20zqrOWl1Mmz0ej1kMhncu3sTn5u2XwORHEOG4XAIbfcazm0F" + "aUXExdQO3oS8MXZbrz1t6ZL/gG3ba2uRtEKUYirMf2Hj/cB/AZ4A1hxsREDCdUKrVyNvULD0" + "HyBO4vackXsokXNtGR0R3t0RkSddf0iX1Hw+h3TbNYnvajXPKGSzWe7ekILsDwY4bjZRrVbh" + "JX80Gnnu+Fu3ixlnd0zR3yoUPHesqqrwB18A5ik1mQXQAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_left_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo0NjozNCArMDEwMCXtbZ4AAAAHdElNRQfZAxkQLw561jOY" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAABAVJREFUeNrtV02IHEUY" + "fVXTO70/M+yOExNd4oIRkgljDIiyQZR4FD0rQlDw6E1RDwkoIqiHXLzlKK4Iwb2peFDJHgxx" + "dS+LcTMhhw0qJkvG7Jjsz8xOd1f5qqu6p9eNMB2Y9WLBm6+nf+p79X2vvqoSYFtdXf3ql8bl" + "52aWQlxbVxhkmyxJvFz3UK8dmq1Wqy8IOv/+xEzjSV17AsePaTw0KjDCF4cFUKQtEB6vJSz6" + "bWYYERFqoEvbpW3TXm1rfDsvIBsX8OlLte/E3PkL+vTqNN4/rlGCQEE6hzGEta5TkYOATsCf" + "SBtCGqGy9wJ2+vo5jbcqP0J+fDHA/qcEisqyHnSL6MTjz+GnBYxv+SdDso/x1rvgPBudvb6A" + "8Z0nrQNpXsJIZaxBNt/a/c8bJf0vME3pDAGlbG4ieikYLUgrPOV6MULU4i5EqK0j7XyYazMz" + "RGYkXsImhbAvpIJ0Q8/jHM55MmLl+out6hFMCUR8OyCksiMX0kYj7gV26CInCZVxbvofKQhs" + "0Jq6IPkkISKTFKQRcB9plWGtt+ujH8QRcBgfEmj+3sYe1hVTY0J3PyUQhYiLhHkQa8Hlalvo" + "7hITRYErl5r44txNrNyMUGQkEpKZFLBUKiu2AjKhduKLLXKKkB9MjQn89kcLs18vo+Dvi++b" + "gQZRTwtecjMk3UiaHAlb97VlGidfO2306dy8N+krNK5cx+kz51GamMKo77TB3Ea6Nw1lEoFA" + "WSKR00SaBpU/Dff4EteuN/HOB5/dUZyh01hKwITEpMDAEAl0EpV/6KIPDDPHlxYX8eprH94x" + "Oqb/bmT7TFMw09SodgJUWJ/HKZoSpWqmjU9BDMWrI1dJt0L20w7Wj+LMRyfxxtuf7Hi2fFvh" + "V+45vuTYp9IUBMAaZ8IGmW0SbaKjLLZULzr9ovFXhMn778V7p07sIGD62wyxvQ6ABDZC+6BD" + "bEUWXYdA5UOH33yzAhw++ADeffMZ+MVCSsD013YzIUMgIgHFkWt+TFBJW6TYpQ2IxOaB6efz" + "qwHWS+N4/tkDGC95lgCfbdJXkNUA1E7RKbcoZStknqacKBeaIer7q5jurGGC+8Em05Msfr0I" + "DLgttRRGDpQxe4Ob3s3tQ/F2g4BJ7Q90fivYuaP4z3dE/xOQye9uMjG+ksrg7RkRGKMwy0W5" + "KyR8yr7M+r5GPRrf3itHhjC3WODhJILPyVv27FowSgy7tWAo51pgmqkBoVtlhyPEffmePX+U" + "6bg8h/iM6D16pH6jvjC/9+zSMTw4rXGIZ8MJeivTMS/hmzOiMCTypSl2Trulbeldp71NIsu8" + "cfEnoHZrHo8dfdjuMVqtll74eQlnLyusbAz2gHbfmMSLNYnHH6mjUqmIvwGdqbciWIcx6wAA" + "AABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_left_focus_single = aero_left_focus + +#---------------------------------------------------------------------- +aero_left_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo0NDo0MCArMDEwMN+SkKkAAAAHdElNRQfZAxkQMBKjjWFJ" + "AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAABGdBTUEAALGPC/xhBQAAAkJJREFUeNrtV02P0lAU" + "PS2lUEIlkxlHpCAEZ89Ol27M8A/czMK4duO/caeJiSZu3SgTN25M3DhBFkMmDhQJEK0apnwM" + "0wK1t+Z1YOqyr2w8yWuT95qcc9+97/UeAS6m06nTarWg6zrOZzPwhJJMolQqoVwuI5VKCcJk" + "MnFqh4eoVCrQcjnIssxVgGVZ6PX7qNfrqO7vQ/jSaDhqOo1isciV+Co6nQ5G4zFEvd2GpmmR" + "khPy+TyIW7xwt0SSpMgFECdxi5EzX8HGBDiOs1kBDH7ymaKoIAjCpQAiXy6XXAlFUfR4aBA5" + "EyBGET2R630LM+tvxpmQNQG8BpE3T8/w8cjEb3MREMe1BuLxOL4bY3z4NIAob/nzq1x+DYQt" + "IBaLodM18PpNA0p6Fwn5kpzqjXZmTUCYRUiR//x1hucv3yOl3lhbY4Gyd+g7QJGffG3jxau3" + "SCg7gXUWLH3nC6BfJI2wUC4V8OTxAZ4+qwXWiGexWPgp8J40EeYwTRM72xk8OrgfEMC+CRzD" + "sEUYhoFi4ToePriDuBTzBdD20zqrOWl1Mmz0ej1kMhncu3sTn5u2XwORHEOG4XAIbfcazm0F" + "aUXExdQO3oS8MXZbrz1t6ZL/gG3ba2uRtEKUYirMf2Hj/cB/AZ4A1hxsREDCdUKrVyNvULD0" + "HyBO4vackXsokXNtGR0R3t0RkSddf0iX1Hw+h3TbNYnvajXPKGSzWe7ekILsDwY4bjZRrVbh" + "JX80Gnnu+Fu3ixlnd0zR3yoUPHesqqrwB18A5ik1mQXQAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_right = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo0NToxOCArMDEwMEtfu5QAAAAHdElNRQfZAxkQLyM/CW/t" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAkpJREFUeNrtVz2PEkEY" + "fnbZQ+AgGD+R5YSAxVkRLfwF5vgH11xlbeNPsbE2Ftf4C+RiY2OijeGu8GIusEjgiJ4Ej689" + "YHedd8zgsBgt3Fkan+TNZnY3eZ55v2ZeDQzj8dir1+uwLAsT24ZKxGMxFAoFFItFJBIJTRuN" + "Rl714ADlchlmNotoNKpUwHQ6RbvTQa1WQ2VnB9rh0ZGXSiaRz+eVEvvRbDYxGA6hW40GTNMM" + "lZyQy+VA3PoFc4lhGKELIE7i1kNn9mFtAjzPW68AgUXwhaKwoGnaLwFE7rru4gOZWKsiFwJ0" + "/+7tqQ6rw7JTVxcd4hOchvyCVPXOHbz9cA57soHtUhqO4yjxgMBSDogPo4mDN+/OcCVt4Ob1" + "JGazmTJvLEIgu4Uwmzt48fI9mq2vPBzyP/9qlF9LZeh/KeP5/mucffuOSCTC/wnCBOcfPSDj" + "6bN9fDppBOYJucJ4DtARSfbzKI6vCHjyeA+X05sYstMrCJA3RZVxAZTpwvx4tPcQ166m0ev1" + "Ak2+lTIkctk1G0YEu7sPeBV0u91AyQmCyxALEiBUbcYjuH/vFnsC7XY7cHK5yS01Iqr3ZELH" + "3VIc5g0X/X4/cHKx4d+ehiTgYvwFd0w3sIT7G1auQiRCZefzY+33gf8CuAD5eAxdwCXWfqkH" + "qLyAyKDNUismTuLmkxErSmTZWEbZr/puSOQxNh9Sg5vP5zBKbEh8Va3yQSGTySifDWmTndNT" + "fDw+RqVSAQ/+YDDg0/HnVgu24umYdn97a4tPx6lUSvsBjEDOU65zEi4AAAAASUVORK5CYII=") + +#---------------------------------------------------------------------- +aero_right_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo0ODo0NiArMDEwMKZ+RR0AAAAHdElNRQfZAxkQMQU5RdXP" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAA/ZJREFUeNrtV09oVEcY" + "/83sy27UfZhtNLWxKNaDK6sNlJZIabHgpdB7KYiCR28W7EEPIkLbgz1481hIaSt4a6UUWkyh" + "Imm9hKbpSg7pIUVjotnGJG5235uZft+bmc1bk8A+NTn1W743b98bvt9vvn9vRoBkbm7uxp/V" + "ux8Mjce4t6ixkdJflDhZCVApH7je29v7oSDwX48PVd8x5bdx9IjB/q0CW2hitwDyNOZIA7qX" + "sNqp8DIUaWyAJo1NGus0/l03+GlEQFZv46sT5Z/F8K3b5vLcID49alCEQE46wESFHZ1RkYGA" + "8UoXZZiQQazts4iMfnzT4JPSb5BfjkV49V2BvLasN1oUgQR0OfieAGPLh+SSl8nfZhPA097p" + "KwgwdpawbogEnpFOjazpeBv3P6uXzDrKok2KgNY2NopQcpwL0iaedlY4EY14hiQ0Fsg4DL7n" + "yhCplQSeTUuFndBKSLf0LOBw4H7F2tlLRr1CsEVA0eyIVNLLAi19K9VhnWvHOOc7UllI6BQ4" + "21euHLkvSHrjiUgfAp7I9d9H/n44VUdPl1hhbdrzoxM1ZrV6W7FfmyegYiRNIp8TmH6k8N3N" + "R5j4axalvGwj8TyqUupJrhDgdqktCZb5xRjXf5jEvw9q2EutudXNMgKyPT96jVgV2kNgX1Jc" + "Ur2w0VS4+MWPqE5Mob+giAS9z6j84/jrVC7ERrcW0+aByJXi03Lhs69x7/4sXqLszOIBg7Xd" + "7xPRpD3ALklCsE6nOX3mc1RHR9FNOaLWMLiWxs5e7O4jF+amsuoXm5Th0KxB73JEEwMMyNXF" + "dvXKOQQ7dmFiXnVchp5IRC5oENgy/VmiZJ+n7zKtA9/T2ve0+kAELNDLZY1VH/1L54+j/5Wd" + "+GVGZWrF3tVRAm71CWEsKQuq0x4AEWB2DdV6gkI+h7Nn38ee3SXcmIptvDJ0Ik8gcbu2thMi" + "ZIr3HJFqI6CIgKaJtvNtLwY4duw1LBS349vJJgJC9puULASiBNwkMW/QAw4Dd1jpynGFgKvR" + "Wfo+9+yUGBwIgd0hRmbipDXL9LehQ1mvCTEOL0alq8DLP080vpmOkd8XYqzWecI9j6zakEzX" + "NW49iFGPs6TcCySw2fI/Aemvm8mEsXLuPtixRWAblURI3/7NIFGgwg+7JBYoxxk7OHW4C8Oj" + "OTqcKBSoaEMq0iIpb8u6iSbNRRedkHLP0Ih8K+6mimZbhcCeP0ICDoeRnBGDNw5XZip3Rvqu" + "jR/BvkGDA7QB6SG0kPeGBFjgM6JgEtnClIDT2OAzIZFYpPExEZmkB2O/A+X5Ebw5cMjuM2u1" + "mrnzxziu3dWYXtrYA9qubRIflSXeer2CUqkk/gNN/sDRnOMoBAAAAABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_right_focus_single = aero_right_focus + +#---------------------------------------------------------------------- +aero_right_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs+MAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo0NToxOCArMDEwMEtfu5QAAAAHdElNRQfZAxkQLyM/CW/t" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAkpJREFUeNrtVz2PEkEY" + "fnbZQ+AgGD+R5YSAxVkRLfwF5vgH11xlbeNPsbE2Ftf4C+RiY2OijeGu8GIusEjgiJ4Ej689" + "YHedd8zgsBgt3Fkan+TNZnY3eZ55v2ZeDQzj8dir1+uwLAsT24ZKxGMxFAoFFItFJBIJTRuN" + "Rl714ADlchlmNotoNKpUwHQ6RbvTQa1WQ2VnB9rh0ZGXSiaRz+eVEvvRbDYxGA6hW40GTNMM" + "lZyQy+VA3PoFc4lhGKELIE7i1kNn9mFtAjzPW68AgUXwhaKwoGnaLwFE7rru4gOZWKsiFwJ0" + "/+7tqQ6rw7JTVxcd4hOchvyCVPXOHbz9cA57soHtUhqO4yjxgMBSDogPo4mDN+/OcCVt4Ob1" + "JGazmTJvLEIgu4Uwmzt48fI9mq2vPBzyP/9qlF9LZeh/KeP5/mucffuOSCTC/wnCBOcfPSDj" + "6bN9fDppBOYJucJ4DtARSfbzKI6vCHjyeA+X05sYstMrCJA3RZVxAZTpwvx4tPcQ166m0ev1" + "Ak2+lTIkctk1G0YEu7sPeBV0u91AyQmCyxALEiBUbcYjuH/vFnsC7XY7cHK5yS01Iqr3ZELH" + "3VIc5g0X/X4/cHKx4d+ehiTgYvwFd0w3sIT7G1auQiRCZefzY+33gf8CuAD5eAxdwCXWfqkH" + "qLyAyKDNUismTuLmkxErSmTZWEbZr/puSOQxNh9Sg5vP5zBKbEh8Va3yQSGTySifDWmTndNT" + "fDw+RqVSAQ/+YDDg0/HnVgu24umYdn97a4tPx6lUSvsBjEDOU65zEi4AAAAASUVORK5CYII=") + +#---------------------------------------------------------------------- +aero_tab = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAMAAACxiD++AAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFq6ysra6urq+vr7CwsLGxsbKysrOzs7S0tLS0tLW1tba2tre3t7i4uLm5uru7vL29" + "v8DAwMDAwsPDxMXFxsbGycrKzc3Nzc7Ozs/P09TU19fX2dnZ2tra29vb3Nzc3N3d3t7e4ODg" + "4uLi4+Pj4+Tk5OTk5OXl5ubm5+fn6Ojo6enp6+vr7Ozs7e3t7e7u7+/v8fHx8vLy8/Pz9PT0" + "9fX19vb29vf3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAA0PbvAwAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2" + "qefiJQAAAP9JREFUOE+t0tlSwjAUgOFjZQuxuOBSFURSSOyq0qYNEd//tUzCaIeLk9743Zyb" + "f5LOSUH3AC3vyEWIuIw06KvHRmGqKIJ3+u1RzaD0BpL+S3DwfIO5oqAHDxPk1LOpr9oGe0/h" + "ArXHmSCjLbpIpSobyBa3o5DSWqJaF+xqlPykEE/LHFWmU2AkS1GZCdYkFajkjZhAxCghCLwS" + "zlCcE1j1BpOeE176gqU/mMBy3F0Rb/mpZENh0QWxyJNTfD6HRXfFthgNndFgcJzDa2aCv0WZ" + "tUj7blLdP9nZ6PCZATtPft+qjELt/vAm/HCzCNYmuA2O5xqzmzOwAuIG0AfGfgDFvqY+8bKe" + "lgAAAABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_tab_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAIAAAAJNFjbAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "ABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAABPtJREFUSEu9ldtPI2UYxovR" + "jZd65Z3xxv/AO2/0wnihiZpodgV21cSsiyYbs8ZkiQQSDUaynBaIB0ACLOsegJaWlkNpObSW" + "XQ5dlgUqPQ3DtPRIW9pO5/DNtPGZFjeVte2F4uTtxcz3e96n7/t+802VJEkqlapx2LQXE589" + "80xVVRVu//319FO5F587c/Xc6yoYXOrW983vzrqOrExqPcBuRTLOQ94T5/cSApMU/EnxIFUh" + "wIAEDxW0jyKZRSr+Vv3d724YFYPaDn2Iyy5H5I2Y/MeR7EllaTbrz2QDXC7E5yJ8LlopwIAE" + "DxW0yOBOylOO8CedOlUikfio0wAD239tYPEkatu0qng8/j8ZWCPyg5i8cyS78y3y/dWicL5L" + "5QNMoUVQQYsMzqR8XEEsHr/QaQhksosheS0qbyVkZzJLpbP7yhgUTYjLQV8+wOQHkIMKWmTA" + "LJcKLSoYYDimgHw/Ij9U5qxMiU5nGTZ3AI+M4lE+wIAEDxW0yLCdkBeODWIxGDCsPOUn1jBZ" + "P5TyRcjelEynZaawnSoFGJDgoYIWGTZjktkTUyo4PDw832nA2iRDFoNkNSptxpXNin1GpeX9" + "dNaX9ygfYECChwpaZNiISXPuWM1jAyolj9NkLkCWIxJGjQLxRzwpeS9d6FWFAAMSPFTQIsPa" + "oTRbbADnmx5iYMhSUFqJKpPYgQdeOgw8P4/yAQYkeKigRYZ7EWnala8gGo2iRVgbdAvafdGc" + "L8KOSaBRCdmFOtCrVIUAAxI8VNAigzVE9LtFBljrdQpjtDjrJ5aQhEngj6BYNLTgUT6U7EcK" + "DxW0yLAQJLqCQTgcru00bMXk6zvCTY+oY4g5INnC0nq+Udv5OlBf+QADEjxU0CKD0U/UO48N" + "Ogy2kPTGdPKilW20cx3b/K9O4bZXnKDFKYYANR+Q+dKBVTAgwUMFLTK0bPENJqamVavy+Xy1" + "7YbFgPSKNnl2gb2ywjVv8j0OYdAl3qZEDU30DJn2kZnSgVUwIMFDBS0yNG3wXxvzBgzD1LQb" + "5vzSy2PJt43sJRvXYOdbt4RfdsVht3iXUpS6fTJZOrAKBiR4qKBFhqtr/JUZprp1QkXTdE27" + "Hv/ihd8SrxlSF5bYr1YzzQ+5rh2+3ymMeIQ7XnF8T1SXDqyCAQkeKmiR4fI9rq7YAG/A8yOJ" + "VydT1Qvsl/cz325wndt8764w7BJuecRRShwrHVgFAxI8VNAiw+c27jNDvgKKolDBKRp4vd7T" + "NfCcuoHHc0oV1GEG1yZUbrf7w7YKM8A+0dGifp/8Y2AHT9BklCI33GLvrti+JTTa+QY7V6dz" + "fdyhrWyALYhNvIrzi8mUiqX9zDzNGilW706P7aZGHMn+9eC7Tepv+iZVLperfIvUlLgWlc61" + "6j5o0TwZ7/+gQTz5vLZVU//zxO82m2JQ3aaf9ZGX7iTenEl9amXr1zMtj7gfHfwgXgKvoHwk" + "9pK1rdp0Op0qunDL87zJZFpZWSl+zrKsKIqDQ0MWiwXHhGLw3vdqq5//YjnTZOe6d/ght/Lq" + "4vAyHSjfHxyQP5kcl7vVhJDc3680yw4NDeGje+J5MBjs6u52OByKAX5N/bp3mtVnr2lLxcUu" + "3a1R9fWurvaOjuLo7unp6+8/8RC3AwMDJrMZh9CxwfLyslqj0ZW+jHNzFqt1XK0eHRsrDo1G" + "ozcYTjzE7fT0tP3BA2TH9Sf2aVnapn4zWAAAAABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_tab_focus_single = aero_tab_focus + +#---------------------------------------------------------------------- +aero_tab_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAMAAACxiD++AAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFq6ysra6urq+vr7CwsLGxsbKysrOzs7S0tLS0tLW1tba2tre3t7i4uLm5uru7vL29" + "v8DAwMDAwsPDxMXFxsbGycrKzc3Nzc7Ozs/P09TU19fX2dnZ2tra29vb3Nzc3N3d3t7e4ODg" + "4uLi4+Pj4+Tk5OTk5OXl5ubm5+fn6Ojo6enp6+vr7Ozs7e3t7e7u7+/v8fHx8vLy8/Pz9PT0" + "9fX19vb29vf3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAA0PbvAwAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2" + "qefiJQAAAP9JREFUOE+t0tlSwjAUgOFjZQuxuOBSFURSSOyq0qYNEd//tUzCaIeLk9743Zyb" + "f5LOSUH3AC3vyEWIuIw06KvHRmGqKIJ3+u1RzaD0BpL+S3DwfIO5oqAHDxPk1LOpr9oGe0/h" + "ArXHmSCjLbpIpSobyBa3o5DSWqJaF+xqlPykEE/LHFWmU2AkS1GZCdYkFajkjZhAxCghCLwS" + "zlCcE1j1BpOeE176gqU/mMBy3F0Rb/mpZENh0QWxyJNTfD6HRXfFthgNndFgcJzDa2aCv0WZ" + "tUj7blLdP9nZ6PCZATtPft+qjELt/vAm/HCzCNYmuA2O5xqzmzOwAuIG0AfGfgDFvqY+8bKe" + "lgAAAABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_up = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo1MToxNCArMDEwMESarloAAAAHdElNRQfZAxkQMyBAd2MK" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAh9JREFUeNrFl0tv2kAU" + "hY+NBXbAElS0QTwColKX4Q+gbvmDXXXVriq160olq7b7Rk2zICsejWyUqkmQgEIMxvWxZAti" + "0eCoHo40ssZj+5vrO3fmXgmuut2u4zb0+33MZjPEJU3TUKvVUK/X2SRlOp067ZMTNBoNNJtN" + "JJPJ2OCWZcEwTXw/OwO50o/zc0fPZFCtVmOD3tdgMMB4MoHc7/VQKpWEgalyuQxy5Tv3VyiK" + "IhROHrmyUOo97QXuOM7+4L4CZ/uziVuSJG3CCRYFX5+AcDg5iURiP3Ba7bOE+3xde/H5huWi" + "4SHLV6uVEKAsy5uW86hbLBZC4FzpoVCzbVsI3OcFcP5yUfBQqBEuyufkhFb7Y+BMubheHguX" + "fXiURjH7sSw7yIKivh/Ao4g+KxQK6A1MvHr9wbuyv35a7arI8Gw2i+ubCd6++4KUlveu7PN+" + "rPBcLoer33d48/4bDvTDoLHP+xyPop0zR13XYfxaov3VhJZ5Fhr/+NlE62UFh090jMfj/wdP" + "p9O4uk3itDNB6iC/9bnTjoXjFxmUnu42AQ/+0GKZz+c4KuaQz6kPflBTJYxuRrtZnnJjlbsb" + "N/xtsc7x2+thkIH8S6M/9tbdkkbyGxwn1yuX3OBDsVj0Dpc4j1aCVVWFYRhYLpdQnrsV46d2" + "26siGK9xFoo0zhwO0bm4QKvVgudsd3F4JfLPy0vPv3GJVh9VKl6J7EaP9Be4+2JJRD7+lAAA" + "AABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_up_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo1NTo1MyArMDEwMAycPlQAAAAHdElNRQfZAxkQOBMcU9vX" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAABFhJREFUeNq1V82LHEUU" + "/1VNz863yWyUyCSaEPzYuGtkwY8QYwLiQfTgwYsgBPMXeDJXvYmo+Qc8KEFIULyJHhQWNcSE" + "3KLrLgqLoMYVkplIdmZ2PrrL36uqnulOsu50YB68ed3V3fV771fvvZpSoDSbzS9/Xll9+czy" + "EFc3IkxLGlWNE/MBjj17RBljPlQE/uH1MytHzcEjeOGwwYGSQokvzigqbUCbo9UTAhhqKMqL" + "IW2PdpN2g/pbx+DH7xX02gWcPblwWi2dv2Debz2Dd48bVIxCjiiBFjBeE1iJwumkIg4If5ER" + "NRiKIxxgtOhpjVNfGby15xL0xz8NsP+owkzoPpqmiBP5MEL9RUBw9bWuwe6iwvRWOi2C0yhp" + "CO6kSzkVCWJvzBYqopBtScwdruM8sHj+wkYuiWGMBxTrHxrvQdZcMCat0S33qcgFbMBBTau0" + "y3CL6K0yfmxCibzDoYkz3pdelGbA0U53Ir4RqfHLmq9FcHVmSy1D+GbEphnNF5cdLFYuAR65" + "MsgJqNcwMZkFzxB5THXcbGzUXk1iGS240BGmPEw3lqwlkcyfcbNxGHbOKEW7W/M4cpVYb7Em" + "I+0pQM/qIHIq8w1NMnLyMwhdHw98pCOqI39/NwnnGY2tMKwwLjUL7tbE0Iqyp1Ot5/HqqOwJ" + "FyYot/MKA5EZMTOOfOi8smuv3Yc26RLdRWeMPLnOoU++oV/SVOTnmuzv5H22oFDLK1S4nRVZ" + "DTN0JK/d7pbLAB7vYn2i92jbHLg5AFp9KV6Fs5zreAy+ycg3+KDADiMDOZuuCibnMjYLeEy5" + "gPcIvsmQuwTvMKPbfWNrfTAIx5H36FWHDpR5V+A4g7c0x1RLIkYZwSWz+5yr57UbOgwJJgwT" + "tEuqt+lqhYNFLvSMUB2O69tkBB/adm1IuwBL9E47ZMA6lwIfOup71D6p7mv/98m3VvHC3AIu" + "tzuYI//2zG27WJy8cW1bBjyGFQ8+al5RQs02Ksvxyr4Ae9t/WqvV9t8k548l858JYeOlhsLy" + "yhrePHXaWrnPUg13DX5oNsDf/9zAO+99jnKtYa3cy/hUwRd3Bbj5xzre/uAb1Or7Rir3Mi7P" + "s8jEbz+yI4fm79fxyRdrqO588LbnH322hjdezePRvbP4pRVONOdE4PtrGr2rHXx7qWup3krk" + "+bGwjYceqNCB4bbzOnD9//yv86Tx/IEKGrvL205YLSssXds68iROcC+PRxXmf5WNfCsHpEF8" + "xwlLE/DUve7a6Z2kyO8reY0arwU3OPl4HktXctjzHCenw1V2l2oeKLF2Cjm3scQNZzjByUKO" + "WvfwoDdgSyyytxf4fZ5b5Az/qdxHnyoE3fW1wonFAMHiwmOr85cvzn26fBgHnzZ4uKyxk6BV" + "gvFgwc2GDsB1vEnEdjj+cA8BDyVo0+Eb1CbZ+5Unxr/OA3PRRTz5xILrnq1Wy1y+soxzqxHW" + "29M7ON1f0XhtTuOpQ/Oo1+vqPxxtdiUOpmR7AAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +aero_up_focus_single = aero_up_focus + +#---------------------------------------------------------------------- +aero_up_single = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAYAAADqgqNBAAAALHRFWHRDcmVhdGlvbiBUaW1l" + "AG1lciAyNSBtYXIgMjAwOSAxNzo1MToxNCArMDEwMESarloAAAAHdElNRQfZAxkQMyBAd2MK" + "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAh9JREFUeNrFl0tv2kAU" + "hY+NBXbAElS0QTwColKX4Q+gbvmDXXXVriq160olq7b7Rk2zICsejWyUqkmQgEIMxvWxZAti" + "0eCoHo40ssZj+5vrO3fmXgmuut2u4zb0+33MZjPEJU3TUKvVUK/X2SRlOp067ZMTNBoNNJtN" + "JJPJ2OCWZcEwTXw/OwO50o/zc0fPZFCtVmOD3tdgMMB4MoHc7/VQKpWEgalyuQxy5Tv3VyiK" + "IhROHrmyUOo97QXuOM7+4L4CZ/uziVuSJG3CCRYFX5+AcDg5iURiP3Ba7bOE+3xde/H5huWi" + "4SHLV6uVEKAsy5uW86hbLBZC4FzpoVCzbVsI3OcFcP5yUfBQqBEuyufkhFb7Y+BMubheHguX" + "fXiURjH7sSw7yIKivh/Ao4g+KxQK6A1MvHr9wbuyv35a7arI8Gw2i+ubCd6++4KUlveu7PN+" + "rPBcLoer33d48/4bDvTDoLHP+xyPop0zR13XYfxaov3VhJZ5Fhr/+NlE62UFh090jMfj/wdP" + "p9O4uk3itDNB6iC/9bnTjoXjFxmUnu42AQ/+0GKZz+c4KuaQz6kPflBTJYxuRrtZnnJjlbsb" + "N/xtsc7x2+thkIH8S6M/9tbdkkbyGxwn1yuX3OBDsVj0Dpc4j1aCVVWFYRhYLpdQnrsV46d2" + "26siGK9xFoo0zhwO0bm4QKvVgudsd3F4JfLPy0vPv3GJVh9VKl6J7EaP9Be4+2JJRD7+lAAA" + "AABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +aero_denied = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAADxklEQVQ4jbWUzWuUVxTGn3Pe" + "+955k8nMJE5m0vqRZCaUYomG0uJGjDR0UXBRUj+6Kqg7kSy6SBf5A7ropiB07aK4qIsWIYsu" + "ioXBQoRKqWhJ1eq0sWqSmWQyk8y8H/e+p4t8oJ2YuPHA2dzD+fHwnHMuiQheR/BroQJQOxWv" + "Z7N9cRB8nAA+dIEBAIiAvwPgJ04kro1Vq/Mv66XtrCgVi9osLEx1K/V57+HD6a5Dh8B9fSDH" + "ga1WsXr7Niq3btVrUfS1yue/HH34MNwV/HM+n1HN5vd7+/vHsmfPQu3bt60i8+wZli5fxr/l" + "8nXT2fnJBwsLK8/XX/B4ZnhYqWbzyv5icaz34kXwnj2IrYUoBXge4HkQpRBbC85kkL1wAfuH" + "hsZUs3llZnhYvRQclMvnsqnUidTp04DWoEwGnE6DEwmQ44AcB5xIgNNpUCYDaI3UqVPIplIn" + "gnL53LbgmULB9YCp9LFjcHM5KM8D+z6o0QD+l9RogH0fyvPg5nLIHD8OD5iaKRTcTd6W/KhS" + "OZJOJgc7R0ag4ngd8gqhAHSOjMArlQbrlcoRAL+8oJhFjiaLRWhmrN29ixYzfNdF6LqIXBdG" + "a1itEWsNaA24LoQZ5s4duAC6hobAIkfbFDOQ78jlQPU6zNIS3jh/Hqz1jmolDFE7eRIqk4GX" + "zYKBfDtYJGDfB9VqkNXVV7IBAOT+fYjrrs9DJGgDE/Ns+OABkExCBQHmL10CM4OMAVkLAkAb" + "3hEAIgJZC7YW9OgRwnodzDy7xds8kF97et70iMrFfF6T1gAzEEWAMburBvBwcTH0RQbfX15+" + "Cjw3vIOl0tMgiq7VVlbA9Tq4VgOvrYGDYNes1esIoujawVLpaZtiAPitu/sta8yt/o6OVI/a" + "8X/aimVj8E+r1XCUeu/dWu3+tmAA+D2dHvetvdqtlDrgOEgQbQsMRDBnLWrGGM9xzozU6z88" + "X28D29VV/LF370d+HH/bFOntIkKGCJuLFwJYEcGqCDqJKh7zZ+88efKj09WFHcFbtuTzOW61" + "vghEPo1EDtiNdweASzSnib6Tjo6vum/eXCwUCm39dO/ePUxMTDizs7Oq0WjoMAy1tVbHceyK" + "iJsFOs4wv32AqF8AzMXx3FWRP5cAn4hCZo6YOdRah8lkMhwYGDCTk5NGzc/PY21tDcYYiuOY" + "RIQ30gGgKiL4xpi/AJSxvsIWAIjIAaBEJBYRx1rLxhhqtVqoVqu0rRXT09N048YNPH78mKrV" + "KjWbTfi+TwDgeZ4kEgn09vZKX1+fjI6OYnx8vA3yHxWIwp50Lj49AAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +auinotebook_preview = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0" + "RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJXSURBVHjahFJRSBNxGP/d/+52" + "W66ildPKJB9EMSwjFSNoUkS+GYg9pi9R9tJeopcgC3yKYvRUMHA+VBJUmpQPQSySKINqEGSB" + "Np3aNjs3N8+7285d/7sxa9yw3/G777v/932/+76PP6PrOgw8D876dYImWJAEZPpW8l89nYea" + "i8KGgMHRYPitvgkCw0G9qaNXD4x80Qs1BknRnzaBEfX1e+G758PQaEgvnP8VULA5lCS8/T7T" + "NUQK4ApO4j/1l3s6N/zA8MiGTxiGgUGowGwkhqkfc5Bl1SKwlM6i90y75dzsoKX9fNPLF2Mt" + "sZVGuMt3YPDpK7jsDnj7uiEIfH6ClAjF5rAKHD1xcW99a927C5e6hP3luwCGwONpRjwm4tqA" + "H7du9pmJDG9HrsSeSE3dvmdnz512tFZVQaGjaCyBjedRubscxzva8PrNJzNR0xmsKsQq4KzY" + "fqDW7UY8o4KjxRzLmpYlBLUNNZj48BVRMQlWA7I5yTqCvcyuq+s0qmkQiC1/QeiTo1ajNpWS" + "oMoMVJVyXbZ2sDj9S5sMh2l7CjJUJGswq0HNZBCNLmEhPA0xsQpJUSHJJUZILCbuxuZF7fv8" + "ApbTaaysrSEpSVgURdy//RDJxAp2RvzgMgkQzbpEziVEbgQfBeuXPY1dqcMS4W08cnIWY0Pj" + "iIXjuNI2A0dsDmXyT3yUTtESZ5EAU3CuDvhD7ydDB1mWg6zQWelSj2ydwbE9v1Fd4TQZmHLj" + "yTfBzP88PsgUCZTCne4qFycID7Zt4TuqK50TFaTmZMP1x5l/c/4IMABbKBvEcRELXgAAAABJ" + "RU5ErkJggg==") + +#---------------------------------------------------------------------- +whidbey_down = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAaHWVZ3egZ3e1cYCncYa0dpC4cYXGcpDBc5fWd6Dld6Pwi5OzgJbUkJjQkqHC" + "hafggqfwh7Dwk6Xgl7fwoKjWp7fXsbbWoLfnoLjwpMLwscHnsMfxtdD0wMHg5eTo5/D49/f3" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAverH2wAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAF4SURBVDhPbZTpYoIwEITRGqAQ1ChqOFrx/R8y3SObq8yvsHwZhglaOdH7HZbJIp1W" + "YW7t7w68LOcwDaxd5+lhC3q18zwOMhTWIjtZ+3wGfFmWFYZjgJl9vWC/1x30AI2zzExzIcqz" + "a2RxC2Ak2n4zJmEx1TgaY8R7AtHsdgMS1IivJRZHyN5lA6PMEgwZ2JVYs23bxwuWG3PGdF3X" + "ImvtBO/KqAl38ytgO+WqMz1SDDz7KXaCbatU5YYARt+SbUHg61zT9/iMHsQZKHBI9A1S6njk" + "fpuCRTjmJVQBymfxlfuCc5IX0cMhnhvCMYO8KCdCV0L9GbMz8Fhqous1ugbWw/32k2oDtFUn" + "do2sz1ywqWvCElz6pq4pS3CRVxooMvjqsI2+v5LwXCVrljfrGclhqH2v5e+Nr6VnYltgBct7" + "iDDExm+grvm0ouL/QwrjN1CHXvczYAz0xF5Pp9w168zfAhjeH9gSle8hnWutldL6H7rHOq2P" + "agd1f/M7VhKuYPh3AAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +whidbey_down_single = whidbey_down + +#---------------------------------------------------------------------- +whidbey_down_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" + "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" + "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAGeSURBVDhPfdOLUsIwEAVQCCixFSggVfBFQWpVjKJo+f8fi3ezSZq2jDsDhHB62Wyh" + "o319Vctg9V2tO34p5H0bHw5D4Xe9FULK5bKhb6UcDs/cprNdMYiprhee30khaStx2NpudwCb" + "JHG8WAhbEkU0cZgtUge0iYrjCEUuilheOWysS2U9GpluGJJ1mKyg1LHZn6NYNNYUCWuozSjr" + "FVxnLGQUjZPJlLJKCk7piar0Nk2zS90RAhINVDZN5yUeNZuhbjq6BzmZomYoICr/Yr5mtcry" + "fL2mfnvjSd2anvkSsqBZUazN2XS/YVNLrc2Qut3yHAj/10OWFwVRtrpPvZo5cL+28A7fnxfv" + "G6Ps74GwsfXCsXKkMnWWko39DKukAbjUygKfskFqYLnnKvcHdQT9sA0EPdgD1ts9Vr2G/fpp" + "pDMeAg3gWe2fgn9V9d+0yW5edCylQurnwJejZ/7VPJpZ7V+C1PBsFrPFXAul6rSRi2S2uFmq" + "kdrK1frcWOq1kXrC6osHulnq963Wa3Nm9kOySrVpq1/yr5vNbtdK1foPGIxy6qmqIg0AAAAA" + "SUVORK5CYII=") + +#---------------------------------------------------------------------- +whidbey_down_focus_single = whidbey_down_focus + +#---------------------------------------------------------------------- +whidbey_dock_pane = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAaHWVcHiYZ3egZ3e1cHilcYCncYa0dpC4ZobHcYXGcpDBc5fWcZjgd6Dld6Pw" + "i5Ozl6e3q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dwk6Xgk7Tkl7fw" + "oKjAoKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo" + "4Of35/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAA1jVbdgAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAdFSURBVGhDtZpxe6I4EMbtbQVXrHJuaY8KWq/XW3Sr196u8v0/GTfzThICRIh9nssf" + "u4rw42UyM5kJHVVXjDQah/EV51ejK05+SKMwjK/BX0Gfzu9ms2kY3PgL8qd/nc/vCB+GN/54" + "b/p0sVjMaRA+9Mb70hku9GvUe9IBV3TC+9rejy5wTfdX70VneJ7LHRaLu7uIPNPL9j50hp+a" + "w9NzPOhQfvrHHqeZn/phOmzeofvZfpA+zTFa2rNsFk2GPWeIruB5y+5En00mg1E7QNfw/CSP" + "oEaZ51kWDavvpxu4phOWB+hJMqi+l17DFb0sBa+eJB3KOX30xLIFeAQXvKYTvtf2PfTVbrtd" + "6xsonrKMoafhJAwu5/vL9NWO6Rp/iZ5OJsFlfI/2onh7oxvQYKOsaeALjTV944fK2DFn489o" + "ryqmA69NDrtjWPSwZyHs9RlWr+h5Qzt9UdqzPvhATTBMn/Uu4QOxut9r24vFdzSUvUh+lk37" + "6wMXfVNf8sF0mdrt9nGF8YbB3ppNl/WpK8eNHPTNxuCXHx/a9q+vZz3exZvW6+m5NPhi58B3" + "6Yfj2zYRHcuSgOI5Bi0fDgeiT/nT8oxTi2K3U1dZz9ChH5gu+GXJ9HNRvP/dgoOfyEGox/Tn" + "nVlo04kNm34DHPRfv7psxuujywqm4rBo41t0Vs4uvl4/PXHUNLj7/f6VRvte5RJTjxBo4Zv0" + "A3sDxw2d+EeTcnzd4qnIdR43zZ/EbSUjNfEN+oHppFsiEZOmxn5/ZJOBvt1uNivrNyvk2nib" + "fmA6W0W0Z6FGkL0sNvLYt0L/aKeLtnqLTvCD2FzRNR53VelSZ8l1IfhfdqqDbRaWcWo6nWZs" + "zrk1SZLVvww40oBeZTG9oDwbOm6pDy8svKHzA9Y2Z3oUgU5WOSIXdOjAv/Nv1hLJ5aZRr+lQ" + "XhNYevSEZye6ZJo2PZNpd9ANXtFFuYtOM0p50UnP4Dm2VeQZavVCZ6cqudziCOL/szSKYkh7" + "hReu62UJv/MyS8+HM2AZuUwNgwcdTlVSkasrrppOgSL0Rg2ME9l6uD8/cqmWd643T0Y90xEO" + "azku48RzCu0vau1z0lNEhJu++Epkoks4dOhjPPaL+Hl+gf4upmlplzaIPGdUIbewXls7OTvo" + "xktbdK6auNyAWz266fOHaoQ4ZKNpOl940vRXHQN99BU9XMkzqylo3+7u0nTEdkHkKzoKRUNH" + "tccxeoEOwxs6XQqK0GdRNFoVKkqEDo+8lk4Syq2UsDWd2ubxKHtm5dzVid1Fe5bOjCx4kUt7" + "mohf8QPCMg3ttGERjp4z1Yk27O5HV15r6MbuVF1S2xbHo+pRNblNf88SaN9sVIpyaSfDYhnU" + "dEQK7A54ELO/f6VJqC2joknF4bmfPgadw4UtY+hmo4Vj9ZanWNtd07PsRfmDuYqTgc43nAei" + "e8TEu4OuWh7kGcb70kViKfR7phdvVA808gw34thHkBzJ+EZHSquH5NfzN5p1ZU+S/kM3fZxE" + "owBnCF2lWFAivcWi8jvUYydDBujAZ0JX7XD5Q0yTMT0EnVf6emHh9FC3anptgu3nc5ueppC2" + "0nfT//OdqRcOA5HeoVsbFGZdFbxFJ3/7C3ShyTPoz/C4PwHnhau+rLmxVdcEwNunRdEYNcFK" + "8Wv6jO4cBL8DfuC1xbqssbVi1TOMN6chHoSu1Ws6ByLZBfDzObEX8yRqNvd2LaZsLzt3k8lY" + "1g8aDw+Ukc3gfatAzMJjapTnOdEb2yqNOtLgSdwkMHBWGEIxxmQS/iYTqvAyGSmN9rZEswZW" + "eJkaC0Af4/ieBrPHY6kWWniCh+0NoVb9DjzbPLhZNhH07f4+CIK4heYbT0V7d0ui3XvcSvLk" + "QEbXROPnz859zFGOLGptZhRDru2UTt9EeB3ISj31TQ784fBIRwVeVTQtrq2gbs93G0Vfvtg9" + "3/Ft92KqdXWfI1cpVCspOOMnjg3QLr0aRwpOxuGOj+i7orD6JarnqVugEE2sfnXs2khx0CsD" + "r6rv33U3w/3MZvNCQ/dP3EI+1c2pa5fGRbfa2e/SApohXbw6RmFk0a2rzMd+ujRclAI0XnYh" + "pBRH1ujfhuil6yZX6LTEmlEnl158H91uFVVtr+t7ne0o9iKXSdSxHjpvLJieqLmXar5xaPfs" + "Ll2mP8IMWqRzTy/PSTplzIvqe7Qndit3gc4581Paq4p23lHpYP+dH6K5lyoZSce1U3+vz0xb" + "dMZLgcD/AB5aode9Qb+/S5VmtEsDUNMH334MxKqpcxw+4/HWbIAuNSbXgc3RLIo+4zNyjeBR" + "ZdbjRKuFKec+F03qqrpCtuieb/uGLGNXyDbdR7mugXsezlUhn06D3iJED+2qvkcDpCpUvzdl" + "nnTVnSg6vavxfT/spb1Wz9qpnPN7Q+mrXTsmF1I+78j0PHpq13jOLR7v966mV6jS0BX0vAJq" + "OZ+3dlLP8UnDH+7nkUpRHMf/399CVFUcf7nu7zj+A8yummsi9EdGAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +whidbey_dock_pane_bottom = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" + "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" + "q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjA" + "oKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of3" + "5/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAaHenigAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAejSURBVGhDpZkLe9o2FIYpTVeWrG3Srmy9stk0LTPJMKMhmYM9KOuSERqydAX8//+H" + "dy6SLF+QRXeepwtg+9XnT+fotlqyRQRey+1vcX9S2+Lm08Bz3f42+C3ond5xt9txnRf2guzp" + "b3u9Y8C77gt7vDW94/t+DwLwrjXelo5wpm+j3pJOcEEHvK33dnSGS7q9eis6wqOIW/D942MP" + "MtPKexs6wlfZsMwcCzopX/2jx6prp76aTp4X6HbeV9I7EUVOexh2vXZ15lTRBTzK+Q70brtd" + "WbUVdAmPVvwKIuIoCkOvWr2ZruCSDlgMog+HleqN9BQu6HHMePEmQdWYY6IPNS+IB3DGSzrg" + "jd4b6KOr6XQsGxA84YyiB27bdTaP95vpoyukS/wmetBuO5vxBu2z2fU1NACBpowh6AvEGL7h" + "S4WYmN3W12hPEqQTXlpOvlNodNcwERpzBtULepTRDl+E9tAEr1gTVNO7xim8olbnc+k9O34F" + "IfwC+WHYMa8PyuiT9JHPSOeunU7PRhTXFJitYWeQ3joqaaiEPpko/ODzZ+n9xcVaxi1n03jc" + "WccKP7sqwRfpi5vr6ZB1DGIAcuYoNH9YLIDewU+DNd06m11diae0dyjQF0hn/CBG+no2u73M" + "wYk/5B9JPXV/VOiFPB3Y5Ol7ghN9uSyyES9/HSRkFZZFHp+jo3JM8fH4/ByrJsOdz+cXEPm2" + "4gF1PZVADp+lLzAbsG7gxt+zlJuLKb0VpM7ZJHuJ05ZHpCw+Q18gHXRzJVKniZjPb9Ayok+n" + "k8lIu6aVXB6v0xdIR1dYe+hKBPilsWkcez+TF/XhIq9eowN8wZ4LusRTq2K4lKPkeMb4pT7U" + "kTe+Zk5Kh9uU5zi2DofD0b8IuIEgvcIxOaF8UHRqUv7sa3hFxxdMPUe65xEdXLmhsaBAJ/wt" + "XtOmSFxuKvWSTspTAkr3zundgc4jTZ4ecreX0BVe0Fl5GR16FMbFUnpImaO7wu+Qqmc6JlWM" + "yy2sIPwbBp7XJ2kXlIXjdFqi6zjNwvvRHeQMPyZC4YlOSRXDIleuuFI6FArTM2tguhHdo/bx" + "lWMxveN6c6XUI53KYcy/c6ywT0n7RzH3ldIDqohyuv8WyEDncijQW/TaHznPow30W7Ymp523" + "QZA5tYTGFtSra4dkJ7rK0hwdV0243KC0Oiun906TGtUhmibp+OBK0i9kDZjoI3i5GHtWUmj7" + "dnwcBDX0hSpf0GmhqOi02sMa3UAn4xUdHiUK07ueVxvNRJUwnTJyWzpIiKe8hE3psG1u1cIP" + "qBx3dew7aw+DrpJFWVSmPRhyXuELkjMZ7XBg4dY+hGInmvHdji6yVtGV77C6hG1bv19LzsQm" + "N5vv4ZC0TyZiiCrTDsbSNCjpVCnkO8GdPub7W+iE1BlRTaIO12Z6i+hYLuiMoquDFqzV19jF" + "0ndJD8OPIh/UUzgYyPEGxwHvhGritoQutjw0ziDels4SY6afIH12DeuBzDiDG3E6R+AxEvGZ" + "HSnMHjy+rt9Drws/QfonuenDQdRz6A6miyGWKJ48YhHjO6mnkwwOohM+ZLrYDsef2JoQ6S7R" + "caZPJxYcHtKtmpybyPteT6cHAUkbydbkX2wZ9sKuw9ILdO2AQs2rjNfokG9/EZ1p/A7yM2Xc" + "nwTHiSt9LHuwla4JCK/f5nktWhOMBD+ld6Flx/mN4AucW7THMkcr2noG8eo2qgemS/WSjoUI" + "vhB8vR7qk/nQy27u9bWY8J5P7trtFs8fEKenMCKrwHMrh23B6CjlUQT0zLFKZh2p8CCu7Sg4" + "KnRJMUW77b7kDhV47owAIn8skV0DCzx3jQaAj/3+CQSyWy1eLeTwAHfzB0K59Tvh0XPnxSCL" + "gG8nJ47j9HNobLjD2otHEvm9x2sePLGQadcE8UVZrLf3hdIVKwu2Nl2oobLjlMK+CfCykIX6" + "ekPvAdHC5eWDOtNp3wTdUnYUVNzzvfa8V6+0PV+93mg8f56z6WWj8eDBPaSLLaXbbZccgBbp" + "ScsTcDBnvb5Tv7+H8cMz1cCrRr2BP+3f0/arrbKDlBJ6ouBJ8vedO/eBvr+/t/fsWV1EAwLh" + "+/v3ztPNadkpTRld286C8vuIgdjb24VA8u4us78HvHZvyUczXSpn/sOH5BGjkV6JN9LrqPwR" + "kZ5CMDP32XjKYaITXOhcZkNryTOYY6ADe3f30f7BY9S7RPFN/A/GUtGbzcPvNuM30+t1YIMt" + "Kb3ZfLqEfxn6IcSPG/EG7XeBffAY4gkEYDHUH3qVN28Oj47evfsa7Uly99FBlk7ecyNIB/ih" + "7xvg5lO3nRy9KeCCfgjKu8ZjN3O+7xidOTzy/f91preDnlPOsO8i4Bu4cuR/zZme3kuIJ3o2" + "oEOPQHnFgWH1/wEFPNFx6lexxGSpVC7XkaaxaKeUbqPchp6Q96n2TxArgP9RZYtaA5vHUcRn" + "bV9ZeJ6usM10Vt98wgmDyfJrNP2l4hm6XDF7CATiZTZih0aRFdySjup5/PqZMlEe5Vbpt9Oe" + "AJ7pkOewhSie+Ja3Y0tPdpgOBRrZKrf1HZV9Q3T03Fb5NvTk25+wQKPrsyq30+vWzsAjSI+i" + "LeC2OcNyTjudc219VP0O/wGW4JFYg7jH7QAAAABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +whidbey_dock_pane_center = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAGDeAJUqQIEOkIkewJFKlJlayMlSiMle1K2G0LmnSNnDgR2OkQ2O1UGagUHCo" + "VXSzaHWVZ3egZ3e1cHilQ2TAQHDAQnLSVnfFQXfgcYCncYa0dpC4VYTTRIDjVYbgZobHYIfT" + "ZpPXcYXGcpDBc5fWYIjgYZHgcZjgd6Dld6Pwi5Ozq62xgIjQgJbUkJjAkJjQgJjggKDXkqHC" + "k6TWlrDXhafggqfwh7Dwk6Xgk7Tkl7fwoKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjpMLwscHn" + "sMfxtdD0wMHg6tTN4Njk5eTo4Of35/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAXehG6QAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAdqSURBVGhDtZoNW9pIEMc5emrB651VUDRUpEkqb5d6SBOUXq9Q8dprke//aXLzsrvZ" + "hGWz+NzN87RCzP74M5mZzGyspDvYOGh4wx3OTys7nPx+HHjecBf8DnS/3wtD37t47S7InX7V" + "7/cA73mv3fHOdH8wGPTBAO85413pCGf6Luod6QQXdMC7+t6NznBJd1fvREd4kvAnDAa9XgCR" + "6eR7FzrCV3lzjBwHOilf/a3bKnRTX04nn2/Q3XxfSvcTsoL2OA6DdnnklNEFPCn4Hehhu12a" + "tSV0CU9W/BWErZMkjoNy9Xa6gks6YNGIHkWl6q30DC7o6zXjxTcZl9UcGz3SfEE8gDNe0gFv" + "9b2FPlnMZlP5AYInPKPoY6/tXWyv99vpkwXSJX4bfdxuX2zHW7TP5w8P8AFg6JQpGL0Bm8I7" + "/FIxBmbYeI72NEU64aXLye9kGt2z3AitMYPqBT3JaYc3Qntsg5f0BOX00HoLL8nVL1+k79nj" + "CzDhL5Afx769PzDR77Il35DOl3Y2u5mQPZBhtMb+KDt1YvggA/3uTuFH375J33/69CTtK0fT" + "dOo/rRV+vjDgN+nLx4dZxDpGawBy5Cg0v1guge7jq9ETnTqfLxZilfYdNuhLpDN+tEb603z+" + "9a8CnPgRHyT1dPmTjatQpAObfPo7wYn+48cmG/Hy6CglV2FaFPEFOirHEJ9Ob28xazRuFIYt" + "sjjOf9p6RJeeUqCAz9OXGA2YN3DiHzrjw4du66zT6VyCNZvNdzk+hy1XpDw+R18iHXRzJtJF" + "Y4uvrrpdgBP98vJds9vNfqmlXBGv05dIR6+w9tiThLet62tkn50h+xzs8GVL/lIvF0X1Gh3g" + "S/a5oEt8+PYtws/AFP2wxfgfeqkj3ww052R0OE35HGtrFEWTfxBwDUZ6NauDnSq6LNNM1/CK" + "jl8w8znSg4DoEcDZG0U64b9indBukdhuKvWSTsqVV+iOH9zSBe0C3Eiv/3yFJxjoCi/orNxE" + "73YBbqbXiS5vAJn+TD3TMajW2G5hBuHPeBwEQ1wbtjrklfuCoePrtVDgsV3QujWFJzoF1Rqa" + "XNlxafSOoOO1zeye6TWkf8KvvBa3d+w3V8r3SKd0mPJxthVeU9Q+adno9Rco3kwfXAEZ6JwO" + "G/QG6nKhg+cL2nkMgsippFRbUK+uHYKd6G/edDoUiPcmz9TrB3jSjZnef59WqLag0yQd262V" + "pLfedC5L6RMImzXEPK1EjTS+9XrjcQX9Qpkv6NQoKnqzc8lZZNOu6LBUo4dBUJnMRV1hOkXk" + "rnRIqPWMW9iMDmNzoxLfo3Kc6tjvrD0eh1Qhm5BI27XX9qt06YnOSzW673mV+1hMojm/P4+u" + "/A7dJYxtw2ElvRFDbj7e44i0d09F9TL5vba/f6Rrp0yhq0rwiyHG+xVc4swzIpugijnQq0TH" + "dEHPKLraaMFcPcEAkn6X9Dj+CAs/NM/PMedVzMhyg3Vg/6A6xhpsoIuRh+oM4rfSD/P0Q3qP" + "dQbolEzzB+gHcnUGB3HaR+AaifjcRAp3j3iCS3svqV5J7Z37jL63R9IFXZRYogRyi0XUd1JP" + "OxlsRCc8weuQTmwd/gGH9gUd7/SyjcCF+vaQvDeR7/t9nT4mZZNXzC8asKsBnrBB1zYo1H2V" + "8RodEvnPrfRaDei/ERwb8GxZfmMr6wkIr58WBA3qCU5Pi7qJXf2V4Eu8X2rLclsrWj+DeHUa" + "5QPTnwr0GhjQCQ4tQ+bzJImC/HCv92LC97xz1243qMKjvXpVq0n9NchQpRx/6SvlRM9tq+T6" + "SIUPcfdFwZ8mk9oLVMxksJ+OKEnZfAywOB6DFbcl8j2wwPOlydbDq/DgYG8P/6Funa3wAPeK" + "G0KF/p3w6POL16McHfQfHR1Uq9W9XwIKRM2GpB7gG1sSxdnjhIsnJjJNTWDfvxdo2lG8Y8Bo" + "E0IOmbZTNuYmwMtEFuphbjLgl8sbOMrwNPXMG1mbM99JEBwf6zPf48Pi47zAf8QuJUK6GCm9" + "sG3YAN2kp41AwME5OPEBfTGfa/Mq9PmPcBAmQ21ebZg2Ugz0VMHT9PNn3odAgyn57iPYjBta" + "bKz922w4Ne3SmOjaOPuZR0BlPMWLY5BGGl1bpV7a6TxwQXmQeN6F4FacqoZ9G8JKl0Mu0++0" + "75AVFyveRtdHRdHby/5eVjvIvcDkEnHMQseNBTUT5fdS1TtMbcvu0nb6TW6SM+7pJQlIh4K+" + "Vb1Fe6SPclvoAdiztKcp7LxTp0P77+jp/F4qVySZ10b91pjxC3TEczeF/xHc01Jv8wPs8c5d" + "mtLOA0BGL336UZKrqs8xxIzDU7MSOveY2AfmLd8UPSdmeA3jqcvMbAV3C9XOPS+bxKqsQ9bo" + "jk/7yjyjd8g63UW57IEtX87UIa9WpdHCRAftor+nAYhbl//0OZ+cTgQdntW4Ph920p6pR+XQ" + "zrk9oXT0jApMbKRcnpHJ6+ioXcY91haH53s701Pq0mgOtTwCKgSfs3ZQj/kJ5g53i0ihaDgc" + "/n9/C5Gmw+Hxbn/H8S+cD8xcYY4GnAAAAABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +whidbey_dock_pane_left = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" + "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" + "q62xgIjQgpXEgJbUkJjAkJjQgKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjAoKjW" + "qLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of35/D4" + "8Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAA+wCLtAAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAeDSURBVGhDtZr/f9JGGMdprZPJnHSKm9OKI4DG0K5kWAptGIw5FGqpdQL5//+Q7Ply" + "d7kkR3L4ms8PWmjyzifP3T33PM+1FO1gQ6/u+DtcH5V2uPh86DmOvwt+B7p7etLpuE7jmb0g" + "e/qr09MTwDvOM3u8Nd3tdrunYIB3rPG2dIQzfRf1lnSCCzrgbX1vR2e4pNurt6IjfDTiJ3S7" + "JycezEwr39vQEb5OmuXMsaCT8vUn3dYdO/XFdPJ5hm7n+0K6OyJLaQ+CjtcsnjlFdAEfpfwO" + "9E6zWbhqC+gSPlrzKwgLR6Mg8IrV59MVXNIBi0b0fr9QfS49hgt6GDJevMmwKObk0fuaL4gH" + "cMZLOuBzfZ9Dv1xMp2P5AMETnlH0odN0Gtvj/Xb65QLpEr+NPmw2G9vxOdrn8+treAAYOmUM" + "Rh/AxvAJXyrAidmpf432KEI64aXLye9kGt3J2Qhz5wyqF/RRQjt8ENqDPHhBTlBM7+Ru4QVr" + "9epK+p49vgAT/gL5QeDm5wcm+n58y2ek89BOp4NLsmsynK2B24svvTQ8yEC/s6/wvc+fpe9n" + "s420W55N47G7CRV+vjDgs/Q7D+/fE/heCECeOQrNPyyXQHfxp96GNM/ni0U/oz5DP3iIdML3" + "QqRv5vPb9yk48fv8Jamn4R9lRiFNPzg8rCJ+j+BEX62ybMTLb3sRuQqXRRqfogP88BDo9/b2" + "LnDVJLhXV1czsPSzwh4NPS2BFD5JP3j0E1j1YeUeqE9SbmZTmikwdQaT5K942nJESuIT9INH" + "TK9WAL+n46+ubm54HqJNJpcaX1tyabxOBzjR0fWofl8ilkudTXHs7Vz+Ug8XafUaHeFEl+ol" + "frlcgmy5pjhKjueMX+mhjnzT1ZwT0w8eVcHwCfg/eqdc/hsBN2BMVNGeMH8pOj1Q7jNdDa/o" + "oDxDr/+LMw/gpDtDJ/wt/k7bIjHdVOolHd2SpFcrv9K7A50jTZoe0FrdGOgKL+jkcyMdRhTi" + "opEe0MzRvcLvEKtnOsJXutXQ7yRtRrNwHG9LIaVltO9xLCDPhPw1m8ITnZSv4M1XT9BqtRXS" + "f8ZbYaEwPZEDfxJ0ws/QaaHY3jHfXCv1SP+OmCl65elTvPWd2PuM9KGznd59BWSgf0/wtPYK" + "wYHO+/YW+i27JqWdyyCYOaXo5csamK79SW1V/fE+rVRc/DRXUnTMmjDduMCLBmb66XlUOm+3" + "k3T0vaLPbOiX8HIhjizmgOh3Kt9OTobDknt8nKCvVjiq1Qprp2wvRzs5XtEBr9E7npem07Tc" + "lQ4SwimnsDEdyuZ66WLUPW63flN+B+3o90qZtctlbvL7sO/58gXJMwnt0LBwgD46Pm614lHd" + "ge6l6MrvkF1C2eb7pWhwDeqBv/qorSapfTIRIcqkHRxL2yAODmqnzJ5GleANH+f7ACLDcbtt" + "pG/y6XWi44JL0FWjBddqf4r4BL1WuV8+Eo5XmjAYyHiDUcY7q+Mltwa6KHkozvTRNxl62Uhn" + "B4RMP8NL5teQDyTiDBbi1EfgGAnqf1+vtSBZk47fvA107R9l0RcMPc9rULBgOsVIESk92WIR" + "8R0KMJ45HCNrSC8/x3sDpotyOPzIrgmQ7hAd9lxtY8HwEJdqcm96MwXntFtM5m21Un5PvkE2" + "1DD0FPyfDdgsPUPXGhRqX33TpXmp6LhrM13ydDrNONrTl7hxyX01qVz6HX3v/onqdfqDB/8Q" + "XvBjegdmeqPxB8GXuLdo9ERrRctnoFWi06uVB/uYEyj1ko4LEfxC8M2mr2/mfS9Z3Ou5mBvg" + "qmo9Qbc/flyt3uX7N5vz875m2LdqsFvQXKV8NAJ6oq2SyCNJfatFdA2OCh1STNZsOs95QAWe" + "B2YIlm5LJHNgUk/0JBwwvn8Ghux6nSJjGg9wJ90QSuXvLvqG4b0kAj6dnTUaDT+Fxge7rD3b" + "kkjXHp0O8GHW38Xag/lfvmSeo77FlQWlTQfWkKmdkqmbmE5RQqiHusmAXy4H8C3DowiGxdQK" + "ytZ8r1+320dcvXHNd3O9eKeydfGcGywJIFcScMQ3DQ1QQ736uv2DLA1B/Rzpi/lcq5cgn4dq" + "AZZoX6tX66ZGioEe/RLXnR8+yGoG65nJ5B2YrJ+whLyILzV1aUz0+I7oA1RLXCuxcRUvvoNl" + "pNG1u9SP+XQuuCAESDp3ITiZp+CS34bIpcsil+mwxSqLg0suPo+ul4q08bCJ9J2kQ0bnmVwi" + "vsuhY2NBJkupXqrqrGLCmNNd2k4fkBtk5Db29FA7Rsyt6nO0w1Ye2xY6xsyv0g67FZ90cP+d" + "8oxEL5XTuSOxro36c+eMm6IjnhME/IfgTh68oKf3IqmdC4CYXnj6UbBWER97Rg0Day/qYOs5" + "gXngST08wXB2UKi8mB4xvps+96C0oPDMqcAz8ELs+/SJ0P90ZsP4DN1GuYVnhPpvdlYm1FMB" + "LTJUu5MyO+3S94IOZzW258PFo0ozVc571A7pnN0Jpa12oR5Phq3OyOTasdQu8RhbLM73dqZH" + "L1A3VQU5R0CpBW+tHdTj+gSzh+/0txC+73+7v4WIIt8/2u3vOP4D32mBB1S/lsMAAAAASUVO" + "RK5CYII=") + +#---------------------------------------------------------------------- +whidbey_dock_pane_right = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" + "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" + "q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjA" + "oKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of3" + "5/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAaHenigAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAe+SURBVGhDtZr/W9pWFMYtW1en67RzunWdpUvQlgWdMCoyJFkotbaRCrMryP//f2Tn" + "yz25N19ILn2enV8Qkn7y5s2555570414jRh4dbezxvnxxhonXww81+2sg1+D3jw7bbWarvPM" + "XpA9/eXZ2SngXfeZPd6a3my322cQgHet8bZ0hDN9HfWWdIIrOuBtvbejM1zo9uqt6AgPAr5C" + "u3166kFmWnlvQ0f4Ih2WmWNBJ+WLf8xYtOzUV9PJ8xzdzvtKejOgyGj3/ZbXqM6cKrqCBxnf" + "gd5qNCpHbQVd4MGCb0HFMgh836tWX05P4EIHLAbRe71K9aV0DVf05ZLx6k4GVTWnjN4zvCAe" + "wBkvdMCXel9CH96Mx6FcQPGUMwl94DZcZ3W9X00f3iBd8Kvog0bDWY0v0R5Ft7dwAQg0JYSg" + "LxAhfMOb8jExW/Uv0R7HSCe8WE6+Uxh0t2QiLM0ZVK/oQUo7fFHa/TJ4RU9QTW+VTuEVY3Uy" + "Ee/Z8RsI5RfI9/1meX9QRB/pf/IJ6fxox+P+kOKWArPVb3b1qT8XXKiAPhol+O6nT+L99fW9" + "xB1nUxg275cJ/rvjV3l8nj6d3Y57fGJ3CUDOnATNf0ynQG/iX917OjU6Pn6Vx+foU6QzvrtE" + "+n0U3b3PwInf4x9JfbR/cHzSzj3iLB3Y5OlrghN9Ps+zES+/duO7h/tMz+IzdFSOKR6Gl5c4" + "alLcyWRyDZG91rL7cBfjGPiZHErTp5gNOG5grPyVpsyux3RXkDr9UfoQw3ePgJ5J0RR9inTQ" + "zSORHpqKyWSGlhF9PB6NhsYxgP9IdMSn1Zv0KdLRFdbuu4IAvww21bHXkRxEONEPjtCblHqD" + "DvApe67ogqerqnIpVTKMGD+vPd5mY3b3ITLqNR3yOvEca2uv1xv+i4AZBOlVjsmE8gYPvnv8" + "eFvhmX7S/ls/2oSO4097jnTPIzq4MqNakKMT/v2mST86Anz7dxm1QiflmoDSvUu6d6BzpcnS" + "fXrsSGfxqB28B/xY8IrOyovo8EShLhbSfcqcXzc3t5lMgeqDQJUSpmMdX2K7hSMIP/2B53VI" + "+jVlYainJTqO0yzcH51RQ/pcx2LxR6AqFdGpDi6hyZWOS9OhAjM91QPTiege0jc3t7b350r7" + "PAw/zsEcVo90moFC7EM1HZ4pab9Sc18hfUAj4jBHh7xk9UDnCp6j1+m2rzjPgxX0O7EmpR1H" + "VRD0kU61BfsrUzskO9GTLM3QsWvCdoPSCo1P0Skvg9t+vEHjEEe+0PEfLoR+LWOgmn5wMIeU" + "Ad9D+OTMudxAX2jkKzo1igmduj0coyvoZDxrBzJgFf03rGhAH0ZqlDCdMnJd+hbSKSWFjvl/" + "ctLc8N+gclzVse+s3R+0SNYQnyi1v+mMJN8HPc6rGtH3Te1Cf+OrlWjKdzu6ytra1ve75Ln2" + "nSra8cVG3FeL3HS++z3SPhqVaG95Hk2DRFeFQPmO9BcvMN9fwgpdO0M+LGQc3pfT60R/ipVA" + "j9VwvkcV51seq89x70J8F7rvXynj+Rflu9QbrAPeOY2Jpzk6wb9RlYDwtnSeO5ZMP0f6T1CA" + "M9r39va+ljrD6lMrUpg9uL7ev4anrrV/lEUfFlHPoTOwvJs1cj4XuHTYpJ52MjiITnif6Wo5" + "vPzI1vhId4n+i8yrwNzDWQQ/STn7jkHen52Z9MGApA3lavKJV4a1sOuw9CK6guvVAeMNOuTb" + "O6Izje9B/sb9K+ctHq4n86rWLnBj7UF4TW8BvU49wVDxNR2POc6fePAtzHvKmoSewM2VDeIT" + "OqzlXJfpol7ocAi2ZxgOQ6n26BHyf6AwPDd9N7znnbtGo87zB8TFBVTkJHDfymFbEvzO7pMn" + "iq6V66dqPlqEw/5FAgdGzyXFFI2G+ys/UI4HD7T6JFvSOZPKHN5zNADwZ6dzDoHsep27BY1H" + "c3bIG0lFlYmZ/p0eLXruPOumEfDt/NxxnE4GjRdG9Vs7TyBMW4x8l97sOTrAOxe0aoL4/Dl3" + "neRXHFmwtHlQAzpYn4HnV8OAh4Sg3UalHtZNBfjptA+/MjyOIXO2dnay8IK19nPPOzzkW+E1" + "3+z25irp1tV1ZtilQK+k4IAH+ldiQPJZsF6tewpO6iOk30SRsV6Cfh5WCzCf94z1aq2Whxfu" + "EyTwOP7wQVYzuJ4Zja4gZP0Es1bzUsut5ZRn8j1//AMvAZPgVbz6DWZ7g14At9rjgBIgeN6F" + "4Facqkb5NoTF/gxCaKVn3INeKZTiy+jG7gxOHjKlqvadpMPY84osKR6r5plRRGsONTVJ9eSJ" + "Sr7h0C7ZXVqtvU9GCKZwTw+1Y8Vcqb7EmV6C1mrT+5FBgDXzi7THMey8U6dD++94E+m9VK5I" + "Mq4L9ZfmTDNDR7z2neCuMfTyFyjfdeMuLdFOm9fJU7V481Sxp5f0Oen9d/pm8dasgi59Tvad" + "Da6ZLN7bVNEVnrpMHQuAyyxQMpgs3q/qDtmgWymvrJHSiGS1Wym3ouc75MXCwvNst7TSQcmc" + "dlt1qHZvyuy0y+oE8h7p8K7G9v1wZc7oNgpHFdE9oJdlij5mSZe8x9pS+ZZpfbrCY22xeL8n" + "fFvt4D3qplVBySugjGH2dMRDrgDdznPrjFS4Tqfz//1fiDjudA7X+38c/wE5II6oZulXWgAA" + "AABJRU5ErkJggg==") + +#---------------------------------------------------------------------- +whidbey_dock_pane_top = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAF0AAABdCAMAAADwr5rxAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagaHWVcHiYZ3egZ3e1cHilUHjRQXLw" + "cYCncYa0dpC4R4DwU4PwZobHYIfTcYXGcIjVcpDBc5fWZpHxcZjgcJj3d6Dld6Pwi5Ozl6e3" + "q62xgIjQgpXEgJbUkJjAkJjQgJjggKDXkqHCk6TWhafggqfwh7Dgh7Dwk6Xgk7Tkl7fwoKjA" + "oKjWqLDIp7fXsLDIsbbWoLfnoLjwsLjjl8D4pMLwscHnsMfxtdD0wMHg6tTN4Njk5eTo4Of3" + "5/D48Ofh9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAaHenigAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAe1SURBVGhDpZkNexJHEMcxrTVNao3G0PoSaXmJ4l1soBhCCUdBmkaPCDFWCN//e1z/" + "M7O7t/fC3aHzPMqFu/3t/2ZnZmeTUrCBnZ83m2cbPB+UNni4NxweHx/9tsGIDei92bBF9B+L" + "44vTu6T8AFb+oTC+ML07gfIjppe/L4ovSofy1nGjIfT9oviC9O6kBZ83flf0ovhi9NccLY2y" + "sv39gvhC9NeT4R/HR5q+Xwa9GL4IvQmvLBcRK4gvQG/+DZcvP8JG2hYF1efTSflxY2HIdLHY" + "gxVwTi696VGCptLz8Xl0Ud4oR90u2vOXNodOyjlYFjoa+VPT89Rn010ol+xXdP1Bq/oI9jA7" + "azPprguX23T4R7QbejY+i/6q1YJXpLYwlZ0foz/4LqOkZdBfvaJgaZQzPbP3IAu/nv7rEYxi" + "g+xgIfVrgX+44FV99HAP7J2dra216jO0/3RULkfpPAP9p+lg37u3Hp65r/oHByE9GvDy/e4u" + "2Bnw7F3bD+kQbGbS1w/y4Dk9wd29vcePtc5dtp9/1rOQ8jt3MjfBnFwlPLtgd2dnG7YD291V" + "88Et2fBU7eNQz2fgiU3kLWVPnhBflHfCRwcpb5GifTw2+M5n4Mkf21vbh7fanvzCPoLy25XB" + "+9MUfJI+v55NuqKjswLw7v3729vPDVounj6ld6Grzi0/6vvTqRplvUOCPie64Dsrot9u3X//" + "PgbHj5VthgPP8BkGDZtx58TpYNODo7cMZ/ri3yQb3/yjv+0EN77QE/gYnZTjuclodH4OONON" + "XV1dXcLic606V7PZdDoaDRP4KH0O4TPaOPHgX1HK9eWE32oy6fXG0VtXRJ/QmDg+Qp8THbqZ" + "PmxGZF+Ty5g+mYzHA+see4X8ksTb9DnRySui3atpBPxlsQk1euvrm+JzQ4/43qIDPhefK7rG" + "86x4d8tGI1/wC7CnfEtpH7asyAnpeMz4fOh5XrfbHfxHgGsY61Ue05h3hs7TGrqFN3R6wdDn" + "RHccpsMr1ywuQWf8Dd3TZPpstUK8prPykEDSnXN+d9Dl1eN0T5Y9hW7wii7K0+hY0ekauseR" + "Y3tF3iFUL3Ra9tUSRhlEn17fcdos7ZIDYkQ3lNH9JSB4P36CPSPDlBk80zmoVp8+faJBZCEd" + "iSJ03LVM0Rl/Sa+8kmQaLpmi8UTngB3J95qONWXtFyqYU+l9zoh0euslyKBLOiToFX7tC4nz" + "4Rr6jbgmph3SW60TxH0p4Npi3klpR7Az3URpjL5iv7suh1UvnX5yFpQ4D8lp2jM0cKnplzoH" + "sugDvNyKVlZTWiewN2/6/RL5hTNf0VcR+gB+4ThfQ2fHGzqGMkXoruOUBr7KEqFzRIbai9Eh" + "YTXheLXorlurlLx3pByrENHu9V0ji5ciTXu/K3FFEtgzEe1us1YrvfOYbejivWJ0FbWGbvzu" + "wmq1drsU9Jgd0iWbvC5rH49ViUrTDsfyNqjpJptaDK+2Kd5fYhFS6JLm2fQK0yldyDOG/obg" + "z55xNgUvaIm131UlQAm+UPFgRlEl0MWGqoxzyjlxk0KvgS65KviidJG4Evop0f0Z+oFInXFE" + "uaIz3qpxqJEw2ZnfYtXVakH6R1pzolMRdar8hNBViWWKU6syXHeprB4mYynLQWe8J/ShTL76" + "KK7xiF5jOu304cZC5UErN3Tx/cmJTe/3WdpAz6Y/aWbPA1ukJ+jkF9XymX1V8BYd8cYt3kBo" + "8g76miOOe705bVzhMFt5qF1Fjv2Y41S4Jxgofkh3MXO1+ifD57S3WMMs5TadnWMe43wQulav" + "6ZSI8AvDb2+79mbedep1iRYxuxdTvicPuW69XpH9A3Z2hopsDMsJn5sWuGmUD4egq2hJ0vXS" + "EhyPGTgprLFitnq99lwWVKwpi9GHRZVHtSvfE5yCygLgst0+hRG7UpFuIYYHvBZVHqeLevJ5" + "9VknisBPp6fVarUdQ9PErB5wlaHpfueiIMWTloZPTbAvXxLzmG8ps3C0cZFDgJs4T1tV/g54" + "nchKve/zzh+z+byHbwQeBFiWuM/jMSMzvnCcw0O5ZPX+9Wx6Ybp1Ncc1dSmo0QpO+HpCecLv" + "xKw4Cg484ESf+r51XkI/j9MCUrRrnVcr1Wro77WewQ0DD4IPH/Rphs4z4/EFTJ+f6Ah5HhJT" + "4Hl/mfggR0Bj1FmZ8xPSyKInlad6xnpMjkQoARqPZnuqW3GuGokDcGSSzN9x6EOu0LHFGguL" + "SyY+i24f5lRvr/t7Xe2Qe06aS9R3GXT6xYI5E+neW21UFv2kth6/nt6LnOQUXW2rZi5IR8Vc" + "i8/Qjr/ShLaGTjXzq7QHAX5/zZ0O7eZMl0aUtnD6TyqSzutU/Zkx04zRCS8NgqKjcFmpVyxX" + "w6ekSzPa5QAQ0pMlNzZBzu/0TJ+TEjNwS0rhKp5NVDGlz2lFOjXq1aKtxZqoydGu8dxlhrYE" + "3LRzX5dNalTYIVv0QsrzqphsJ7pDtulFlBeiJzvk5TI3WuTFc/1u1PPxR3WokXbum/yu8Rz3" + "RO92sYVa7dw308X3mu6kbdCbVwJrhIp7qi1prcXXxrseJ3gqXPF27ts9Q4FJuvlUkLb7p09R" + "KGZkKHdpsOLwYhGphLXbbTqeZ3gifmsD7UHQbh/WNoEH/wMcYo64Ex2PFwAAAABJRU5ErkJg" + "gg==") + +#---------------------------------------------------------------------- +whidbey_left = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAaHWVZ3egZ3e1cHilcYCncYa0dpC4ZobHcYXGcpDBc5fWd6Dld6Pwi5OzgIjQ" + "gJbUkJjQgJjggKDXkqHCk6TWhafggqfwh7Dwk6Xgk7Tkl7fwoKjWqLDIoLfnpMLwscHnsMfx" + "tdD04Njk5/D49/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAQ3JLMwAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAF4SURBVDhPfdTbdoIwEAVQL6htAi0tElBaoVb+/xPTM5M7wc6LLvc6GTIJbnRel/DT" + "ZkUvwXOefsahdqGMJ2LvSwaO4P7d5BdMWejQ9+dzzhOiY4/quu4z44kYSebudbH4REwLm7Q6" + "Jr2hk+lrGR4e7Rb17ZRSdV23v55vxL4vsRCBOesXRrquBbZm0yb7jIHD/EDNKPpUjRBvbmOU" + "Heb7/f6g/aISJhz6R8J4MJvmbM6FGSrPmRaM09i0YZ4zDdHxTN8909I8RMtzyu3NztgwbyxK" + "qytlq6pK0qqROC/0vipGzx0v7ll/MAY2Y1G1SWv9UpXlCvNlpiPZlyjX2w4VJ/rlZk7+D3Oe" + "DsoXwqoNV5HzKHtidJlUC3eXifuXZcxNE91U4xFLIb6jm8oeWIKLcFPN/jxLKY/HhM3+TUl5" + "OhU48eQN9Y6VTwe6D+kLbJ0W3m5X3m926ntgXb7+eg/z2ZzJhcuusN4Lsds9/WfSuhBes94U" + "C6r/AM3yZVcU56/qAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +whidbey_left_single = whidbey_left + +#---------------------------------------------------------------------- +whidbey_left_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" + "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" + "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAGNSURBVDhPfdRrW8IgFAdwLyuXZLIUy67D6dK0pd3w+38xOuewAYOMN3ue/fbnwHZG" + "R8ej5251Yu33nMfcHw8H1iNOxsiNh5xkGUfvmqIBg2YZ8KBrvM3J5BoGH7NBnW9xMjHMGTjl" + "fQYlxvKYh/V5jErc5MEdJxMOAx/BKxZI0w/LkI340aZx5jZzdmdrU92TjKr8IbB2szHKqv1+" + "r2Y4hFDINzWf082A2Xxu+II0TDNU4KcnAcNPz4TiV0P6pp1XKduM9R0XZdlipXBpnNXpgGl3" + "Hu+qdSnzZ1sb0libpab2rqrKMs/d0tqstz+QhwfUt/dabFrrbYXzy1OsNwf0Fgs2TB+ad77B" + "6SNOba9B/uV49D6ZqIvX3bJp1m++mEBO710rLg8wv8wNmVZj6ZdrxeWatmcZW9FjXbxj3ufR" + "6NPr8wLyHnM28vtc6+INX08+w9LTKednwS9I+TwnJg3+UMoTGw3/7wKndxqyXq3gAdg9ZaO0" + "1oab8yo+mRYLKe1p9se5tpCX/7G+dUfhL8vucupsrDz0AAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +whidbey_left_focus_single = whidbey_left_focus + +#---------------------------------------------------------------------- +whidbey_right = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAaHWVcHilcYCncYa0dpC4ZobHcYXGcpDBc5fWcZjgd6Dld6Pwi5OzgJbUkJjA" + "kJjQgKDXk6TWhafggqfwh7Dwl7fwp7fXoLfnoLjwsLjjpMLwscHntdD0wMHg4Of35/D49/f3" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAWZqHkAAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAFySURBVDhPddPbeoIwDABglDqoFDcVGBVw8P4PyXJoQ0sxN+L3m0NDzVaJx/YoT5k8" + "9fbAhfve2luS77kfhq5rir077pkTZ34Ng7Vt2yRO/ELuUPeOTIWxdOrA3Fc46p/9AVobsgnm" + "Z0b1xRsTeLa+EV1f+jCBQ+8DlnzgsDBX2fLxYFR8WeYtxJF/u65tF95KM0/TNEv+ZzZfkElL" + "TbKhuDEVnJ/4Z1+cufpmfsBwC47newNV1fV6v8cMTqMx67Jkhs0s3YIRsNbqHDCePczWhVIx" + "S28NoVRdRyxrMaR5zZPjdcDJha+opxOf+33ACthtrR/glkY7LzmXs5npjbn3VqqcFHmE2i0E" + "934+fd9PjKXdvylbR7yn/q7FuVB8HOF9uMJUOsjF3retb9PcysuFZ+aA0QrJJXYzC6/Fk+IO" + "Eee628IOquJcx5wP6nYV9cYvGpYBKucNRqNHpfW+r9+580uS63vjD855vvXcF4fvB7r+A9+i" + "Xf4K/oDaAAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +whidbey_right_single = whidbey_right + +#---------------------------------------------------------------------- +whidbey_right_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAAB4AAAArCAMAAABYWciOAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" + "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" + "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAGXSURBVDhPdZTZVoNADEDpaC2CFSqC1hVaxWoVqdv0/39szDIraF7gcHuTTCankbJx" + "6V7tW2TfTprVmDvcNKsxt7ismnbzOPQ1npaMh5zxNMdo4Afr0CfMNK8Bv4UcMdBzwshDHzBS" + "wlWN6QM/UmKecu68hBj40ed8nmrOuN28u/qR+op9XNfANw+mf8asow31ge8Mh9au4zhlRIF+" + "1z2zjwcTiKWL/f6p2zFHHMdJWkpty77/lpCffcQ3IwzHY5+GitkDG8fTddv/MB2v+9n6dlVJ" + "aBxq9/Dk/l+95IDgu8b3eD0GJ1ibTmYwzqFt12wTLn07xKc51XW16XqaF20D1jPVtRHf3XHn" + "Sxyqm1ovC5r+MZ97OcJEj/TULuA+B3ZRFIdm5njd/o1JaSgmvzK7Bh8LXAt8kku1/8KaAr61" + "u+ZsQ1X0Aauks1tsKdhCzGb4gzMKr66uTTzLFwuNnctjmUycb3t2m6om7JPtu3qZyE+yBURI" + "+UogvwAM5QfUYOw/ybIhtVghPuBUXrg/LiHG1NmwcSNXqV+4tHLqnJPo+QAAAABJRU5ErkJg" + "gg==") + +#---------------------------------------------------------------------- +whidbey_right_focus_single = whidbey_right_focus + +#---------------------------------------------------------------------- +whidbey_up = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAaHWVcHilcYCncYa0dpC4ZobHcYXGcpDBc5fWcZjgd6Dld6Pwi5OzgJbUkJjA" + "kJjQgKDXk6TWhafggqfwh7Dwl7fwp7fXoLfnoLjwsLjjpMLwscHntdD0wMHg4Of35/D49/f3" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAWZqHkAAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAFmSURBVDhPhdTtdoMgDAZgW3GKWjsL2i/X2vu/SJaEBBXcWf6Jz3l5i9bMpdNXR3Xa" + "Wc/StXNfKXXawaktm1rrUuWHJCWxX01TA1bqkODYlm3bNjCAVYwji9TbneStJcoWcNR5Yz0V" + "mySvLVJrvW/buq7g7NadVxbpvJ3taSyWUuef9cx6kxwsdU3sprPY0tJEucboqginwZapjfqC" + "1UUhT9BboXb28Twfa42pQjLZQMUCwiHbdZKMdqFsPx+PeZee3w2w3WpXugvUY7GAsXPmLvdx" + "HITzXe4QbK8Klbvsckcr+C/bF0WeZ+52ez6Bw+D2AwxdwAxwhRsaPDp9hA4OLWGpSn1pVlZh" + "X8Cg2dpNLlxwrgFKFpP/sRqZf26Ph3T2Te8w3AyijSlJ8fuA1v/Acfy+0Dxp8DyZig2dr9fw" + "WXj5ExoGnxpy5TSi78c0gRUacvE0XjvfsGnqwuryH3q/d6hz07L6CxOEXf5LAPv7AAAAAElF" + "TkSuQmCC") + +#---------------------------------------------------------------------- +whidbey_up_single = whidbey_up + +#---------------------------------------------------------------------- +whidbey_up_focus = PyEmbeddedImage( + "iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAMAAACCNBfsAAAAAXNSR0IArs4c6QAAAARnQU1B" + "AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA" + "AwBQTFRFAAAAECBXFC9vECiQBS2oIDKMIDigC0CVJUqQIkewJFKlJlayMEiwMlSiK2G0JFTR" + "LmnSKGHmKHDoInDwMGjgNnDgNXLwSFeKQFizR2OkUGagcHiYZ3egcHilUHjRQXLwR4DwU4Pw" + "YIfTcYXGcIjVc5fWZpHxcJj3d6PwgJbUkJjAkJjQkqHChafggqfwh7Dgh7Dwl7fwoKjAqLDI" + "sLDIl8D4pMLw4Of35/D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAQS37pgAAAQB0Uk5T////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////////////////////////////////////////////////////////" + "////////////////////AFP3ByUAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn" + "4iUAAAGTSURBVDhPfdQNV4IwFAZgpEyCVBRZaR8OUcI0yrLw//8xuvfuy22e7jkKZz68uxtg" + "0Pm135fl24XxwB/bNU1VFS/+D77d/TY12lsPe3aLqTkUu3Gxa7cHSC3IsmsHOxZS64pzYTMH" + "23Z7qKFXvpTWwZZd0w5wJivLbHxu14fmtSqUzRhYC5/ZEuY/tVbZ2NjyA1o9/UB9qmrtZG0x" + "teKtdnjSplCmDWXLd7xZF63G0opUzux2Ra5eoLCYShvQqv2io7IymewGUsV9lVYdcG1TqAnd" + "QbSbDbR6bqETkastYbCruob5xTNAhpp27PgK7WqFG8DZvz2kY8DBQwGF68XKW/HUtPCBE1rb" + "dJKCjOMwDLq7gjHbkscvZUEOBiGtLc+NtTdYjCcJyFDsQ2cshOnr1PlYUmH7aTqbqYyEajRS" + "12Bqr6f2V2CaLInjCCqGShJ5NTRAVOQSRokulDWfozap2gLGmaMwetIv7/yeulGpxnb94TCK" + "Hp23fLHAedSgeS/C4fHo/y89R5qqfhF9+xJGvszoH5Xccuo6pVT3AAAAAElFTkSuQmCC") + +#---------------------------------------------------------------------- +whidbey_up_focus_single = whidbey_up_focus + +#---------------------------------------------------------------------- + +whidbey_denied = aero_denied + +#---------------------------------------------------------------------- + +# ------------------------ # +# - AuiToolBar Constants - # +# ------------------------ # + +ITEM_CONTROL = wx.ITEM_MAX +""" The item in the AuiToolBar is a control. """ +ITEM_LABEL = ITEM_CONTROL + 1 +""" The item in the AuiToolBar is a text label. """ +ITEM_SPACER = ITEM_CONTROL + 2 +""" The item in the AuiToolBar is a spacer. """ +ITEM_SEPARATOR = wx.ITEM_SEPARATOR +""" The item in the AuiToolBar is a separator. """ +ITEM_CHECK = wx.ITEM_CHECK +""" The item in the AuiToolBar is a toolbar check item. """ +ITEM_NORMAL = wx.ITEM_NORMAL +""" The item in the AuiToolBar is a standard toolbar item. """ +ITEM_RADIO = wx.ITEM_RADIO +""" The item in the AuiToolBar is a toolbar radio item. """ +ID_RESTORE_FRAME = wx.ID_HIGHEST + 10000 +""" Identifier for restoring a minimized pane. """ + +BUTTON_DROPDOWN_WIDTH = 10 +""" Width of the drop-down button in AuiToolBar. """ + +DISABLED_TEXT_GREY_HUE = 153.0 +""" Hue text colour for the disabled text in AuiToolBar. """ +DISABLED_TEXT_COLOUR = wx.Colour(DISABLED_TEXT_GREY_HUE, + DISABLED_TEXT_GREY_HUE, + DISABLED_TEXT_GREY_HUE) +""" Text colour for the disabled text in AuiToolBar. """ + +AUI_TB_TEXT = 1 << 0 +""" Shows the text in the toolbar buttons; by default only icons are shown. """ +AUI_TB_NO_TOOLTIPS = 1 << 1 +""" Don't show tooltips on `AuiToolBar` items. """ +AUI_TB_NO_AUTORESIZE = 1 << 2 +""" Do not auto-resize the `AuiToolBar`. """ +AUI_TB_GRIPPER = 1 << 3 +""" Shows a gripper on the `AuiToolBar`. """ +AUI_TB_OVERFLOW = 1 << 4 +""" The `AuiToolBar` can contain overflow items. """ +AUI_TB_VERTICAL = 1 << 5 +""" The `AuiToolBar` is vertical. """ +AUI_TB_HORZ_LAYOUT = 1 << 6 +""" Shows the text and the icons alongside, not vertically stacked. +This style must be used with ``AUI_TB_TEXT``. """ +AUI_TB_PLAIN_BACKGROUND = 1 << 7 +""" Don't draw a gradient background on the toolbar. """ +AUI_TB_CLOCKWISE = 1 << 8 +AUI_TB_COUNTERCLOCKWISE = 1 << 9 + +AUI_TB_HORZ_TEXT = AUI_TB_HORZ_LAYOUT | AUI_TB_TEXT +""" Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT``. """ +AUI_TB_VERT_TEXT = AUI_TB_VERTICAL | AUI_TB_CLOCKWISE | AUI_TB_TEXT + +AUI_TB_DEFAULT_STYLE = 0 +""" `AuiToolBar` default style. """ + +# AuiToolBar settings +AUI_TBART_SEPARATOR_SIZE = 0 +""" Separator size in AuiToolBar. """ +AUI_TBART_GRIPPER_SIZE = 1 +""" Gripper size in AuiToolBar. """ +AUI_TBART_OVERFLOW_SIZE = 2 +""" Overflow button size in AuiToolBar. """ + +# AuiToolBar text orientation +AUI_TBTOOL_TEXT_LEFT = 0 # unused/unimplemented +""" Text in AuiToolBar items is aligned left. """ +AUI_TBTOOL_TEXT_RIGHT = 1 +""" Text in AuiToolBar items is aligned right. """ +AUI_TBTOOL_TEXT_TOP = 2 # unused/unimplemented +""" Text in AuiToolBar items is aligned top. """ +AUI_TBTOOL_TEXT_BOTTOM = 3 +""" Text in AuiToolBar items is aligned bottom. """ + +# AuiToolBar tool orientation +AUI_TBTOOL_HORIZONTAL = 0 # standard +AUI_TBTOOL_VERT_CLOCKWISE = 1 # rotation of 90 on the right +AUI_TBTOOL_VERT_COUNTERCLOCKWISE = 2 # rotation of 90 on the left + + +# --------------------- # +# - AuiMDI* Constants - # +# --------------------- # + +wxWINDOWCLOSE = 4001 +""" Identifier for the AuiMDI "close window" menu. """ +wxWINDOWCLOSEALL = 4002 +""" Identifier for the AuiMDI "close all windows" menu. """ +wxWINDOWNEXT = 4003 +""" Identifier for the AuiMDI "next window" menu. """ +wxWINDOWPREV = 4004 +""" Identifier for the AuiMDI "previous window" menu. """ + +# ----------------------------- # +# - AuiDockingGuide Constants - # +# ----------------------------- # + +colourTargetBorder = wx.Colour(180, 180, 180) +colourTargetShade = wx.Colour(206, 206, 206) +colourTargetBackground = wx.Colour(224, 224, 224) +colourIconBorder = wx.Colour(82, 65, 156) +colourIconBackground = wx.Colour(255, 255, 255) +colourIconDockingPart1 = wx.Colour(215, 228, 243) +colourIconDockingPart2 = wx.Colour(180, 201, 225) +colourIconShadow = wx.Colour(198, 198, 198) +colourIconArrow = wx.Colour(77, 79, 170) +colourHintBackground = wx.Colour(0, 64, 255) +guideSizeX, guideSizeY = 29, 32 +aeroguideSizeX, aeroguideSizeY = 31, 32 +whidbeySizeX, whidbeySizeY = 43, 30 + +# ------------------------------- # +# - AuiSwitcherDialog Constants - # +# ------------------------------- # + +SWITCHER_TEXT_MARGIN_X = 4 +SWITCHER_TEXT_MARGIN_Y = 1 diff --git a/autres/aui/aui_switcherdialog.py b/autres/aui/aui_switcherdialog.py new file mode 100644 index 0000000..552cb84 --- /dev/null +++ b/autres/aui/aui_switcherdialog.py @@ -0,0 +1,1216 @@ +""" +Description +=========== + +The idea of `SwitcherDialog` is to make it easier to implement keyboard +navigation in AUI and other applications that have multiple panes and +tabs. + +A key combination with a modifier (such as ``Ctrl`` + ``Tab``) shows the +dialog, and the user holds down the modifier whilst navigating with +``Tab`` and arrow keys before releasing the modifier to dismiss the dialog +and activate the selected pane. + +The switcher dialog is a multi-column menu with no scrolling, implemented +by the `MultiColumnListCtrl` class. You can have headings for your items +for logical grouping, and you can force a column break if you need to. + +The modifier used for invoking and dismissing the dialog can be customised, +as can the colours, number of rows, and the key used for cycling through +the items. So you can use different keys on different platforms if +required (especially since ``Ctrl`` + ``Tab`` is reserved on some platforms). + +Items are shown as names and optional 16x16 images. + + +Base Functionalities +==================== + +To use the dialog, you set up the items in a `SwitcherItems` object, +before passing this to the `SwitcherDialog` instance. + +Call L{SwitcherItems.AddItem} and optionally L{SwitcherItems.AddGroup} to add items and headings. These +functions take a label (to be displayed to the user), an identifying name, +an integer id, and a bitmap. The name and id are purely for application-defined +identification. You may also set a description to be displayed when each +item is selected; and you can set a window pointer for convenience when +activating the desired window after the dialog returns. + +Have created the dialog, you call `ShowModal()`, and if the return value is +``wx.ID_OK``, retrieve the selection from the dialog and activate the pane. + +The sample code below shows a generic method of finding panes and notebook +tabs within the current L{AuiManager}, and using the pane name or notebook +tab position to display the pane. + +The only other code to add is a menu item with the desired accelerator, +whose modifier matches the one you pass to L{SwitcherDialog.SetModifierKey} +(the default being ``wx.WXK_CONTROL``). + + +Usage +===== + +Menu item:: + + if wx.Platform == "__WXMAC__": + switcherAccel = "Alt+Tab" + elif wx.Platform == "__WXGTK__": + switcherAccel = "Ctrl+/" + else: + switcherAccel = "Ctrl+Tab" + + view_menu.Append(ID_SwitchPane, _("S&witch Window...") + "\t" + switcherAccel) + + +Event handler:: + + def OnSwitchPane(self, event): + + items = SwitcherItems() + items.SetRowCount(12) + + # Add the main windows and toolbars, in two separate columns + # We'll use the item 'id' to store the notebook selection, or -1 if not a page + + for k in xrange(2): + if k == 0: + items.AddGroup(_("Main Windows"), "mainwindows") + else: + items.AddGroup(_("Toolbars"), "toolbars").BreakColumn() + + for pane in self._mgr.GetAllPanes(): + name = pane.name + caption = pane.caption + + toolbar = isinstance(info.window, wx.ToolBar) or isinstance(info.window, aui.AuiToolBar) + if caption and (toolBar and k == 1) or (not toolBar and k == 0): + items.AddItem(caption, name, -1).SetWindow(pane.window) + + # Now add the wxAuiNotebook pages + + items.AddGroup(_("Notebook Pages"), "pages").BreakColumn() + + for pane in self._mgr.GetAllPanes(): + nb = pane.window + if isinstance(nb, aui.AuiNotebook): + for j in xrange(nb.GetPageCount()): + + name = nb.GetPageText(j) + win = nb.GetPage(j) + + items.AddItem(name, name, j, nb.GetPageBitmap(j)).SetWindow(win) + + # Select the focused window + + idx = items.GetIndexForFocus() + if idx != wx.NOT_FOUND: + items.SetSelection(idx) + + if wx.Platform == "__WXMAC__": + items.SetBackgroundColour(wx.WHITE) + + # Show the switcher dialog + + dlg = SwitcherDialog(items, wx.GetApp().GetTopWindow()) + + # In GTK+ we can't use Ctrl+Tab; we use Ctrl+/ instead and tell the switcher + # to treat / in the same was as tab (i.e. cycle through the names) + + if wx.Platform == "__WXGTK__": + dlg.SetExtraNavigationKey(wxT('/')) + + if wx.Platform == "__WXMAC__": + dlg.SetBackgroundColour(wx.WHITE) + dlg.SetModifierKey(wx.WXK_ALT) + + ans = dlg.ShowModal() + + if ans == wx.ID_OK and dlg.GetSelection() != -1: + item = items.GetItem(dlg.GetSelection()) + + if item.GetId() == -1: + info = self._mgr.GetPane(item.GetName()) + info.Show() + self._mgr.Update() + info.window.SetFocus() + + else: + nb = item.GetWindow().GetParent() + win = item.GetWindow(); + if isinstance(nb, aui.AuiNotebook): + nb.SetSelection(item.GetId()) + win.SetFocus() + + +""" + +import wx + +import auibook +from aui_utilities import FindFocusDescendant +from aui_constants import SWITCHER_TEXT_MARGIN_X, SWITCHER_TEXT_MARGIN_Y + + +# Define a translation function +_ = wx.GetTranslation + + +class SwitcherItem(object): + """ An object containing information about one item. """ + + def __init__(self, item=None): + """ Default class constructor. """ + + self._id = 0 + self._isGroup = False + self._breakColumn = False + self._rowPos = 0 + self._colPos = 0 + self._window = None + self._description = "" + + self._textColour = wx.NullColour + self._bitmap = wx.NullBitmap + self._font = wx.NullFont + + if item: + self.Copy(item) + + + def Copy(self, item): + """ + Copy operator between 2 L{SwitcherItem} instances. + + :param `item`: another instance of L{SwitcherItem}. + """ + + self._id = item._id + self._name = item._name + self._title = item._title + self._isGroup = item._isGroup + self._breakColumn = item._breakColumn + self._rect = item._rect + self._font = item._font + self._textColour = item._textColour + self._bitmap = item._bitmap + self._description = item._description + self._rowPos = item._rowPos + self._colPos = item._colPos + self._window = item._window + + + def SetTitle(self, title): + + self._title = title + return self + + + def GetTitle(self): + + return self._title + + + def SetName(self, name): + + self._name = name + return self + + + def GetName(self): + + return self._name + + + def SetDescription(self, descr): + + self._description = descr + return self + + + def GetDescription(self): + + return self._description + + + def SetId(self, id): + + self._id = id + return self + + + def GetId(self): + + return self._id + + + def SetIsGroup(self, isGroup): + + self._isGroup = isGroup + return self + + + def GetIsGroup(self): + + return self._isGroup + + + def BreakColumn(self, breakCol=True): + + self._breakColumn = breakCol + return self + + + def GetBreakColumn(self): + + return self._breakColumn + + + def SetRect(self, rect): + + self._rect = rect + return self + + + def GetRect(self): + + return self._rect + + + def SetTextColour(self, colour): + + self._textColour = colour + return self + + + def GetTextColour(self): + + return self._textColour + + + def SetFont(self, font): + + self._font = font + return self + + + def GetFont(self): + + return self._font + + + def SetBitmap(self, bitmap): + + self._bitmap = bitmap + return self + + + def GetBitmap(self): + + return self._bitmap + + + def SetRowPos(self, pos): + + self._rowPos = pos + return self + + + def GetRowPos(self): + + return self._rowPos + + + def SetColPos(self, pos): + + self._colPos = pos + return self + + + def GetColPos(self): + + return self._colPos + + + def SetWindow(self, win): + + self._window = win + return self + + + def GetWindow(self): + + return self._window + + +class SwitcherItems(object): + """ An object containing switcher items. """ + + def __init__(self, items=None): + """ Default class constructor. """ + + self._selection = -1 + self._rowCount = 10 + self._columnCount = 0 + + self._backgroundColour = wx.NullColour + self._textColour = wx.NullColour + self._selectionColour = wx.NullColour + self._selectionOutlineColour = wx.NullColour + self._itemFont = wx.NullFont + + self._items = [] + + if wx.Platform == "__WXMSW__": + # If on Windows XP/Vista, use more appropriate colours + self.SetSelectionOutlineColour(wx.Colour(49, 106, 197)) + self.SetSelectionColour(wx.Colour(193, 210, 238)) + + if items: + self.Copy(items) + + + def Copy(self, items): + """ + Copy operator between 2 L{SwitcherItems}. + + :param `items`: another instance of L{SwitcherItems}. + """ + + self.Clear() + + for item in items._items: + self._items.append(item) + + self._selection = items._selection + self._rowCount = items._rowCount + self._columnCount = items._columnCount + + self._backgroundColour = items._backgroundColour + self._textColour = items._textColour + self._selectionColour = items._selectionColour + self._selectionOutlineColour = items._selectionOutlineColour + self._itemFont = items._itemFont + + + def AddItem(self, titleOrItem, name=None, id=0, bitmap=wx.NullBitmap): + + if isinstance(titleOrItem, SwitcherItem): + self._items.append(titleOrItem) + return self._items[-1] + + item = SwitcherItem() + item.SetTitle(titleOrItem) + item.SetName(name) + item.SetId(id) + item.SetBitmap(bitmap) + + self._items.append(item) + return self._items[-1] + + + def AddGroup(self, title, name, id=0, bitmap=wx.NullBitmap): + + item = self.AddItem(title, name, id, bitmap) + item.SetIsGroup(True) + + return item + + + def Clear(self): + + self._items = [] + + + def FindItemByName(self, name): + + for i in xrange(len(self._items)): + if self._items[i].GetName() == name: + return i + + return wx.NOT_FOUND + + + def FindItemById(self, id): + + for i in xrange(len(self._items)): + if self._items[i].GetId() == id: + return i + + return wx.NOT_FOUND + + + def SetSelection(self, sel): + + self._selection = sel + + + def SetSelectionByName(self, name): + + idx = self.FindItemByName(name) + if idx != wx.NOT_FOUND: + self.SetSelection(idx) + + + def GetSelection(self): + + return self._selection + + + def GetItem(self, i): + + return self._items[i] + + + def GetItemCount(self): + + return len(self._items) + + + def SetRowCount(self, rows): + + self._rowCount = rows + + + def GetRowCount(self): + + return self._rowCount + + + def SetColumnCount(self, cols): + + self._columnCount = cols + + + def GetColumnCount(self): + + return self._columnCount + + + def SetBackgroundColour(self, colour): + + self._backgroundColour = colour + + + def GetBackgroundColour(self): + + return self._backgroundColour + + + def SetTextColour(self, colour): + + self._textColour = colour + + + def GetTextColour(self): + + return self._textColour + + + def SetSelectionColour(self, colour): + + self._selectionColour = colour + + + def GetSelectionColour(self): + + return self._selectionColour + + + def SetSelectionOutlineColour(self, colour): + + self._selectionOutlineColour = colour + + + def GetSelectionOutlineColour(self): + + return self._selectionOutlineColour + + + def SetItemFont(self, font): + + self._itemFont = font + + + def GetItemFont(self): + + return self._itemFont + + + def PaintItems(self, dc, win): + + backgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) + standardTextColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) + selectionColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) + selectionOutlineColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) + standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + groupFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + groupFont.SetWeight(wx.BOLD) + + if self.GetBackgroundColour().IsOk(): + backgroundColour = self.GetBackgroundColour() + + if self.GetTextColour().IsOk(): + standardTextColour = self.GetTextColour() + + if self.GetSelectionColour().IsOk(): + selectionColour = self.GetSelectionColour() + + if self.GetSelectionOutlineColour().IsOk(): + selectionOutlineColour = self.GetSelectionOutlineColour() + + if self.GetItemFont().IsOk(): + + standardFont = self.GetItemFont() + groupFont = wx.Font(standardFont.GetPointSize(), standardFont.GetFamily(), standardFont.GetStyle(), + wx.BOLD, standardFont.GetUnderlined(), standardFont.GetFaceName()) + + textMarginX = SWITCHER_TEXT_MARGIN_X + + dc.SetLogicalFunction(wx.COPY) + dc.SetBrush(wx.Brush(backgroundColour)) + dc.SetPen(wx.TRANSPARENT_PEN) + dc.DrawRectangleRect(win.GetClientRect()) + dc.SetBackgroundMode(wx.TRANSPARENT) + + for i in xrange(len(self._items)): + item = self._items[i] + if i == self._selection: + dc.SetPen(wx.Pen(selectionOutlineColour)) + dc.SetBrush(wx.Brush(selectionColour)) + dc.DrawRectangleRect(item.GetRect()) + + clippingRect = wx.Rect(*item.GetRect()) + clippingRect.Deflate(1, 1) + + dc.SetClippingRect(clippingRect) + + if item.GetTextColour().IsOk(): + dc.SetTextForeground(item.GetTextColour()) + else: + dc.SetTextForeground(standardTextColour) + + if item.GetFont().IsOk(): + dc.SetFont(item.GetFont()) + else: + if item.GetIsGroup(): + dc.SetFont(groupFont) + else: + dc.SetFont(standardFont) + + w, h = dc.GetTextExtent(item.GetTitle()) + x = item.GetRect().x + + x += textMarginX + + if not item.GetIsGroup(): + if item.GetBitmap().IsOk() and item.GetBitmap().GetWidth() <= 16 \ + and item.GetBitmap().GetHeight() <= 16: + x -= textMarginX + dc.DrawBitmap(item.GetBitmap(), x, item.GetRect().y + \ + (item.GetRect().height - item.GetBitmap().GetHeight())/2, + True) + x += 16 + textMarginX + #x += textMarginX + + y = item.GetRect().y + (item.GetRect().height - h)/2 + dc.DrawText(item.GetTitle(), x, y) + dc.DestroyClippingRegion() + + + def CalculateItemSize(self, dc): + + # Start off allowing for an icon + sz = wx.Size(150, 16) + standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + groupFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + groupFont.SetWeight(wx.BOLD) + + textMarginX = SWITCHER_TEXT_MARGIN_X + textMarginY = SWITCHER_TEXT_MARGIN_Y + maxWidth = 300 + maxHeight = 40 + + if self.GetItemFont().IsOk(): + standardFont = self.GetItemFont() + + for item in self._items: + if item.GetFont().IsOk(): + dc.SetFont(item.GetFont()) + else: + if item.GetIsGroup(): + dc.SetFont(groupFont) + else: + dc.SetFont(standardFont) + + w, h = dc.GetTextExtent(item.GetTitle()) + w += 16 + 2*textMarginX + + if w > sz.x: + sz.x = min(w, maxWidth) + if h > sz.y: + sz.y = min(h, maxHeight) + + if sz == wx.Size(16, 16): + sz = wx.Size(100, 25) + else: + sz.x += textMarginX*2 + sz.y += textMarginY*2 + + return sz + + + def GetIndexForFocus(self): + + for i, item in enumerate(self._items): + if item.GetWindow(): + + if FindFocusDescendant(item.GetWindow()): + return i + + return wx.NOT_FOUND + + +class MultiColumnListCtrl(wx.PyControl): + """ A control for displaying several columns (not scrollable). """ + + def __init__(self, parent, aui_manager, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, + style=0, validator=wx.DefaultValidator, name="MultiColumnListCtrl"): + + wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name) + + self._overallSize = wx.Size(200, 100) + self._modifierKey = wx.WXK_CONTROL + self._extraNavigationKey = 0 + self._aui_manager = aui_manager + + self.SetInitialSize(size) + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouseEvent) + self.Bind(wx.EVT_CHAR, self.OnChar) + self.Bind(wx.EVT_KEY_DOWN, self.OnKey) + self.Bind(wx.EVT_KEY_UP, self.OnKey) + + + def __del__(self): + + self._aui_manager.HideHint() + + + def DoGetBestSize(self): + + return self._overallSize + + + def OnEraseBackground(self, event): + + pass + + + def OnPaint(self, event): + + dc = wx.AutoBufferedPaintDC(self) + rect = self.GetClientRect() + + if self._items.GetColumnCount() == 0: + self.CalculateLayout(dc) + + if self._items.GetColumnCount() == 0: + return + + self._items.PaintItems(dc, self) + + + def OnMouseEvent(self, event): + + if event.LeftDown(): + self.SetFocus() + + + def OnChar(self, event): + + event.Skip() + + + def OnKey(self, event): + + if event.GetEventType() == wx.wxEVT_KEY_UP: + if event.GetKeyCode() == self.GetModifierKey(): + topLevel = wx.GetTopLevelParent(self) + closeEvent = wx.CloseEvent(wx.wxEVT_CLOSE_WINDOW, topLevel.GetId()) + closeEvent.SetEventObject(topLevel) + closeEvent.SetCanVeto(False) + + topLevel.GetEventHandler().ProcessEvent(closeEvent) + return + + event.Skip() + return + + keyCode = event.GetKeyCode() + + if keyCode in [wx.WXK_ESCAPE, wx.WXK_RETURN]: + if keyCode == wx.WXK_ESCAPE: + self._items.SetSelection(-1) + + topLevel = wx.GetTopLevelParent(self) + closeEvent = wx.CloseEvent(wx.wxEVT_CLOSE_WINDOW, topLevel.GetId()) + closeEvent.SetEventObject(topLevel) + closeEvent.SetCanVeto(False) + + topLevel.GetEventHandler().ProcessEvent(closeEvent) + return + + elif keyCode in [wx.WXK_TAB, self.GetExtraNavigationKey()]: + if event.ShiftDown(): + + self._items.SetSelection(self._items.GetSelection() - 1) + if self._items.GetSelection() < 0: + self._items.SetSelection(self._items.GetItemCount() - 1) + + self.AdvanceToNextSelectableItem(-1) + + else: + + self._items.SetSelection(self._items.GetSelection() + 1) + if self._items.GetSelection() >= self._items.GetItemCount(): + self._items.SetSelection(0) + + self.AdvanceToNextSelectableItem(1) + + self.GenerateSelectionEvent() + self.Refresh() + + elif keyCode in [wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN]: + self._items.SetSelection(self._items.GetSelection() + 1) + if self._items.GetSelection() >= self._items.GetItemCount(): + self._items.SetSelection(0) + + self.AdvanceToNextSelectableItem(1) + self.GenerateSelectionEvent() + self.Refresh() + + elif keyCode in [wx.WXK_UP, wx.WXK_NUMPAD_UP]: + self._items.SetSelection(self._items.GetSelection() - 1) + if self._items.GetSelection() < 0: + self._items.SetSelection(self._items.GetItemCount() - 1) + + self.AdvanceToNextSelectableItem(-1) + self.GenerateSelectionEvent() + self.Refresh() + + elif keyCode in [wx.WXK_HOME, wx.WXK_NUMPAD_HOME]: + self._items.SetSelection(0) + self.AdvanceToNextSelectableItem(1) + self.GenerateSelectionEvent() + self.Refresh() + + elif keyCode in [wx.WXK_END, wx.WXK_NUMPAD_END]: + self._items.SetSelection(self._items.GetItemCount() - 1) + self.AdvanceToNextSelectableItem(-1) + self.GenerateSelectionEvent() + self.Refresh() + + elif keyCode in [wx.WXK_LEFT, wx.WXK_NUMPAD_LEFT]: + item = self._items.GetItem(self._items.GetSelection()) + + row = item.GetRowPos() + newCol = item.GetColPos() - 1 + if newCol < 0: + newCol = self._items.GetColumnCount() - 1 + + # Find the first item from the end whose row matches and whose column is equal or lower + for i in xrange(self._items.GetItemCount()-1, -1, -1): + item2 = self._items.GetItem(i) + if item2.GetColPos() == newCol and item2.GetRowPos() <= row: + self._items.SetSelection(i) + break + + self.AdvanceToNextSelectableItem(-1) + self.GenerateSelectionEvent() + self.Refresh() + + elif keyCode in [wx.WXK_RIGHT, wx.WXK_NUMPAD_RIGHT]: + item = self._items.GetItem(self._items.GetSelection()) + + row = item.GetRowPos() + newCol = item.GetColPos() + 1 + if newCol >= self._items.GetColumnCount(): + newCol = 0 + + # Find the first item from the end whose row matches and whose column is equal or lower + for i in xrange(self._items.GetItemCount()-1, -1, -1): + item2 = self._items.GetItem(i) + if item2.GetColPos() == newCol and item2.GetRowPos() <= row: + self._items.SetSelection(i) + break + + self.AdvanceToNextSelectableItem(1) + self.GenerateSelectionEvent() + self.Refresh() + + else: + event.Skip() + + + def AdvanceToNextSelectableItem(self, direction): + + if self._items.GetItemCount() < 2: + return + + if self._items.GetSelection() == -1: + self._items.SetSelection(0) + + oldSel = self._items.GetSelection() + + while 1: + + if self._items.GetItem(self._items.GetSelection()).GetIsGroup(): + + self._items.SetSelection(self._items.GetSelection() + direction) + if self._items.GetSelection() == -1: + self._items.SetSelection(self._items.GetItemCount()-1) + elif self._items.GetSelection() == self._items.GetItemCount(): + self._items.SetSelection(0) + if self._items.GetSelection() == oldSel: + break + + else: + break + + self.SetTransparency() + selection = self._items.GetItem(self._items.GetSelection()).GetWindow() + pane = self._aui_manager.GetPane(selection) + + if not pane.IsOk(): + if isinstance(selection.GetParent(), auibook.AuiNotebook): + self.SetTransparency(selection) + self._aui_manager.ShowHint(selection.GetScreenRect()) + wx.CallAfter(self.SetFocus) + self.SetFocus() + return + else: + self._aui_manager.HideHint() + return + if not pane.IsShown(): + self._aui_manager.HideHint() + return + + self.SetTransparency(selection) + self._aui_manager.ShowHint(selection.GetScreenRect()) + # NOTE: this is odd but it is the only way for the focus to + # work correctly on wxMac... + wx.CallAfter(self.SetFocus) + self.SetFocus() + + + def SetTransparency(self, selection=None): + + if not self.GetParent().CanSetTransparent(): + return + + if selection is not None: + intersects = False + if selection.GetScreenRect().Intersects(self.GetParent().GetScreenRect()): + intersects = True + self.GetParent().SetTransparent(200) + return + + self.GetParent().SetTransparent(255) + + + def GenerateSelectionEvent(self): + + event = wx.CommandEvent(wx.wxEVT_COMMAND_LISTBOX_SELECTED, self.GetId()) + event.SetEventObject(self) + event.SetInt(self._items.GetSelection()) + self.GetEventHandler().ProcessEvent(event) + + + def CalculateLayout(self, dc=None): + + if dc is None: + dc = wx.ClientDC(self) + + if self._items.GetSelection() == -1: + self._items.SetSelection(0) + + columnCount = 1 + + # Spacing between edge of window or between columns + xMargin = 4 + yMargin = 4 + + # Inter-row spacing + rowSpacing = 2 + + itemSize = self._items.CalculateItemSize(dc) + self._overallSize = wx.Size(350, 200) + + currentRow = 0 + x = xMargin + y = yMargin + + breaking = False + i = 0 + + while 1: + + oldOverallSize = self._overallSize + item = self._items.GetItem(i) + + item.SetRect(wx.Rect(x, y, itemSize.x, itemSize.y)) + item.SetColPos(columnCount-1) + item.SetRowPos(currentRow) + + if item.GetRect().GetBottom() > self._overallSize.y: + self._overallSize.y = item.GetRect().GetBottom() + yMargin + + if item.GetRect().GetRight() > self._overallSize.x: + self._overallSize.x = item.GetRect().GetRight() + xMargin + + currentRow += 1 + + y += rowSpacing + itemSize.y + stopBreaking = breaking + + if currentRow > self._items.GetRowCount() or (item.GetBreakColumn() and not breaking and currentRow != 1): + currentRow = 0 + columnCount += 1 + x += xMargin + itemSize.x + y = yMargin + + # Make sure we don't orphan a group + if item.GetIsGroup() or (item.GetBreakColumn() and not breaking): + self._overallSize = oldOverallSize + + if item.GetBreakColumn(): + breaking = True + + # Repeat the last item, in the next column + i -= 1 + + if stopBreaking: + breaking = False + + i += 1 + + if i >= self._items.GetItemCount(): + break + + self._items.SetColumnCount(columnCount) + self.InvalidateBestSize() + + + def SetItems(self, items): + + self._items = items + + + def GetItems(self): + + return self._items + + + def SetExtraNavigationKey(self, keyCode): + """ + Set an extra key that can be used to cycle through items, + in case not using the ``Ctrl`` + ``Tab`` combination. + """ + + self._extraNavigationKey = keyCode + + + def GetExtraNavigationKey(self): + + return self._extraNavigationKey + + + def SetModifierKey(self, modifierKey): + """ + Set the modifier used to invoke the dialog, and therefore to test for + release. + """ + + self._modifierKey = modifierKey + + + def GetModifierKey(self): + + return self._modifierKey + + + +class SwitcherDialog(wx.Dialog): + """ + SwitcherDialog shows a L{MultiColumnListCtrl} with a list of panes + and tabs for the user to choose. ``Ctrl`` + ``Tab`` cycles through them. + """ + + def __init__(self, items, parent, aui_manager, id=wx.ID_ANY, title=_("Pane Switcher"), pos=wx.DefaultPosition, + size=wx.DefaultSize, style=wx.STAY_ON_TOP|wx.DIALOG_NO_PARENT|wx.BORDER_SIMPLE): + """ Default class constructor. """ + + self._switcherBorderStyle = (style & wx.BORDER_MASK) + if self._switcherBorderStyle == wx.BORDER_NONE: + self._switcherBorderStyle = wx.BORDER_SIMPLE + + style &= wx.BORDER_MASK + style |= wx.BORDER_NONE + + wx.Dialog.__init__(self, parent, id, title, pos, size, style) + + self._listCtrl = MultiColumnListCtrl(self, aui_manager, + style=wx.WANTS_CHARS|wx.NO_BORDER) + self._listCtrl.SetItems(items) + self._listCtrl.CalculateLayout() + + self._descriptionCtrl = wx.html.HtmlWindow(self, size=(-1, 100), style=wx.BORDER_NONE) + self._descriptionCtrl.SetBackgroundColour(self.GetBackgroundColour()) + + if wx.Platform == "__WXGTK__": + fontSize = 11 + self._descriptionCtrl.SetStandardFonts(fontSize) + + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetSizer(sizer) + sizer.Add(self._listCtrl, 1, wx.ALL|wx.EXPAND, 10) + sizer.Add(self._descriptionCtrl, 0, wx.ALL|wx.EXPAND, 10) + sizer.SetSizeHints(self) + + self._listCtrl.SetFocus() + + self.Centre(wx.BOTH) + + if self._listCtrl.GetItems().GetSelection() == -1: + self._listCtrl.GetItems().SetSelection(0) + + self._listCtrl.AdvanceToNextSelectableItem(1) + + self.ShowDescription(self._listCtrl.GetItems().GetSelection()) + + self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) + self.Bind(wx.EVT_ACTIVATE, self.OnActivate) + self.Bind(wx.EVT_LISTBOX, self.OnSelectItem) + self.Bind(wx.EVT_PAINT, self.OnPaint) + + # Attributes + self._closing = False + if wx.Platform == "__WXMSW__": + self._borderColour = wx.Colour(49, 106, 197) + else: + self._borderColour = wx.BLACK + + self._aui_manager = aui_manager + + + def OnCloseWindow(self, event): + + if self._closing: + return + + if self.IsModal(): + self._closing = True + + if self.GetSelection() == -1: + self.EndModal(wx.ID_CANCEL) + else: + self.EndModal(wx.ID_OK) + + self._aui_manager.HideHint() + + + def GetSelection(self): + + return self._listCtrl.GetItems().GetSelection() + + + def OnActivate(self, event): + + if not event.GetActive(): + if not self._closing: + self._closing = True + self.EndModal(wx.ID_CANCEL) + + + def OnPaint(self, event): + + dc = wx.PaintDC(self) + + if self._switcherBorderStyle == wx.BORDER_SIMPLE: + + dc.SetPen(wx.Pen(self._borderColour)) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + + rect = self.GetClientRect() + dc.DrawRectangleRect(rect) + + # Draw border around the HTML control + rect = wx.Rect(*self._descriptionCtrl.GetRect()) + rect.Inflate(1, 1) + dc.DrawRectangleRect(rect) + + + def OnSelectItem(self, event): + + self.ShowDescription(event.GetSelection()) + + +# Convert a colour to a 6-digit hex string + def ColourToHexString(self, col): + + hx = '%02x%02x%02x' % tuple([int(c) for c in col]) + return hx + + + def ShowDescription(self, i): + + item = self._listCtrl.GetItems().GetItem(i) + colour = self._listCtrl.GetItems().GetBackgroundColour() + + if not colour.IsOk(): + colour = self.GetBackgroundColour() + + backgroundColourHex = self.ColourToHexString(colour) + html = _("") + item.GetTitle() + _("") + + if item.GetDescription(): + html += _("

    ") + html += item.GetDescription() + + html += _("") + self._descriptionCtrl.SetPage(html) + + + def SetExtraNavigationKey(self, keyCode): + + self._extraNavigationKey = keyCode + if self._listCtrl: + self._listCtrl.SetExtraNavigationKey(keyCode) + + + def GetExtraNavigationKey(self): + + return self._extraNavigationKey + + + def SetModifierKey(self, modifierKey): + + self._modifierKey = modifierKey + if self._listCtrl: + self._listCtrl.SetModifierKey(modifierKey) + + + def GetModifierKey(self): + + return self._modifierKey + + + def SetBorderColour(self, colour): + + self._borderColour = colour + + \ No newline at end of file diff --git a/autres/aui/aui_utilities.py b/autres/aui/aui_utilities.py new file mode 100644 index 0000000..d6c701a --- /dev/null +++ b/autres/aui/aui_utilities.py @@ -0,0 +1,678 @@ +""" +This module contains some common functions used by wxPython-AUI to +manipulate colours, bitmaps, text, gradient shadings and custom +dragging images for AuiNotebook tabs. +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx + +from aui_constants import * + + +if wx.Platform == "__WXMAC__": + import Carbon.Appearance + + +def BlendColour(fg, bg, alpha): + """ + Blends the two colour component `fg` and `bg` into one colour component, adding + an optional alpha channel. + + :param `fg`: the first colour component; + :param `bg`: the second colour component; + :param `alpha`: an optional transparency value. + """ + + result = bg + (alpha*(fg - bg)) + + if result < 0.0: + result = 0.0 + if result > 255: + result = 255 + + return result + + +def StepColour(c, ialpha): + """ + Darken/lighten the input colour `c`. + + :param `c`: a colour to darken/lighten; + :param `ialpha`: a transparency value. + """ + + if ialpha == 100: + return c + + r, g, b = c.Red(), c.Green(), c.Blue() + + # ialpha is 0..200 where 0 is completely black + # and 200 is completely white and 100 is the same + # convert that to normal alpha 0.0 - 1.0 + ialpha = min(ialpha, 200) + ialpha = max(ialpha, 0) + alpha = (ialpha - 100.0)/100.0 + + if ialpha > 100: + + # blend with white + bg = 255 + alpha = 1.0 - alpha # 0 = transparent fg 1 = opaque fg + + else: + + # blend with black + bg = 0 + alpha = 1.0 + alpha # 0 = transparent fg 1 = opaque fg + + r = BlendColour(r, bg, alpha) + g = BlendColour(g, bg, alpha) + b = BlendColour(b, bg, alpha) + + return wx.Colour(r, g, b) + + +def LightContrastColour(c): + """ + Creates a new, lighter colour based on the input colour `c`. + + :param `c`: the input colour to analyze. + """ + + amount = 120 + + # if the colour is especially dark, then + # make the contrast even lighter + if c.Red() < 128 and c.Green() < 128 and c.Blue() < 128: + amount = 160 + + return StepColour(c, amount) + + +def ChopText(dc, text, max_size): + """ + Chops the input `text` if its size does not fit in `max_size`, by cutting the + text and adding ellipsis at the end. + + :param `dc`: a `wx.DC` device context; + :param `text`: the text to chop; + :param `max_size`: the maximum size in which the text should fit. + """ + + # first check if the text fits with no problems + x, y, dummy = dc.GetMultiLineTextExtent(text) + + if x <= max_size: + return text + + textLen = len(text) + last_good_length = 0 + + for i in xrange(textLen, -1, -1): + s = text[0:i] + s += "..." + + x, y = dc.GetTextExtent(s) + last_good_length = i + + if x < max_size: + break + + ret = text[0:last_good_length] + "..." + return ret + + +def BitmapFromBits(bits, w, h, colour): + """ + BitmapFromBits() is a utility function that creates a + masked bitmap from raw bits (XBM format). + + :param `bits`: a string containing the raw bits of the bitmap; + :param `w`: the bitmap width; + :param `h`: the bitmap height; + :param `colour`: the colour which will replace all white pixels in the + raw bitmap. + """ + + img = wx.BitmapFromBits(bits, w, h).ConvertToImage() + img.Replace(0, 0, 0, 123, 123, 123) + img.Replace(255, 255, 255, colour.Red(), colour.Green(), colour.Blue()) + img.SetMaskColour(123, 123, 123) + return wx.BitmapFromImage(img) + + +def IndentPressedBitmap(rect, button_state): + """ + Indents the input rectangle `rect` based on the value of `button_state`. + + :param `rect`: an instance of wx.Rect; + :param `button_state`: an L{AuiNotebook} button state. + """ + + if button_state == AUI_BUTTON_STATE_PRESSED: + rect.x += 1 + rect.y += 1 + + return rect + + +def GetBaseColour(): + """ + Returns the face shading colour on push buttons/backgrounds, mimicking as closely + as possible the platform UI colours. + """ + + if wx.Platform == "__WXMAC__": + + if hasattr(wx, 'MacThemeColour'): + base_colour = wx.MacThemeColour(Carbon.Appearance.kThemeBrushToolbarBackground) + else: + brush = wx.Brush(wx.BLACK) + brush.MacSetTheme(Carbon.Appearance.kThemeBrushToolbarBackground) + base_colour = brush.GetColour() + + else: + + base_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) + + # the base_colour is too pale to use as our base colour, + # so darken it a bit + if ((255-base_colour.Red()) + + (255-base_colour.Green()) + + (255-base_colour.Blue()) < 60): + + base_colour = StepColour(base_colour, 92) + + return base_colour + + +def MakeDisabledBitmap(bitmap): + """ + Convert the given image (in place) to a grayed-out version, + appropriate for a 'disabled' appearance. + + :param `bitmap`: the bitmap to gray-out. + """ + + anImage = bitmap.ConvertToImage() + factor = 0.7 # 0 < f < 1. Higher Is Grayer + + if anImage.HasMask(): + maskColour = (anImage.GetMaskRed(), anImage.GetMaskGreen(), anImage.GetMaskBlue()) + else: + maskColour = None + + data = map(ord, list(anImage.GetData())) + + for i in range(0, len(data), 3): + + pixel = (data[i], data[i+1], data[i+2]) + pixel = MakeGray(pixel, factor, maskColour) + + for x in range(3): + data[i+x] = pixel[x] + + anImage.SetData(''.join(map(chr, data))) + + return anImage.ConvertToBitmap() + + +def MakeGray(rgbTuple, factor, maskColour): + """ + Make a pixel grayed-out. If the pixel matches the `maskColour`, it won't be + changed. + + :param `rgbTuple`: a tuple representing a pixel colour; + :param `factor`: a graying-out factor; + :param `maskColour`: a colour mask. + """ + + if rgbTuple != maskColour: + r, g, b = rgbTuple + return map(lambda x: int((230 - x) * factor) + x, (r, g, b)) + else: + return rgbTuple + + +def Clip(a, b, c): + """ + Clips the value in `a` based on the extremes `b` and `c`. + + :param `a`: the value to analyze; + :param `b`: a minimum value; + :param `c`: a maximum value. + """ + + return ((a < b and [b]) or [(a > c and [c] or [a])[0]])[0] + + +def LightColour(colour, percent): + """ + Brighten input `colour` by `percent`. + + :param `colour`: the colour to be brightened; + :param `percent`: brightening percentage. + """ + + end_colour = wx.WHITE + + rd = end_colour.Red() - colour.Red() + gd = end_colour.Green() - colour.Green() + bd = end_colour.Blue() - colour.Blue() + + high = 100 + + # We take the percent way of the colour from colour -. white + i = percent + r = colour.Red() + ((i*rd*100)/high)/100 + g = colour.Green() + ((i*gd*100)/high)/100 + b = colour.Blue() + ((i*bd*100)/high)/100 + return wx.Colour(r, g, b) + + +def PaneCreateStippleBitmap(): + """ + Creates a stipple bitmap to be used in a `wx.Brush`. + This is used to draw sash resize hints. + """ + + data = [0, 0, 0, 192, 192, 192, 192, 192, 192, 0, 0, 0] + img = wx.EmptyImage(2, 2) + counter = 0 + + for ii in xrange(2): + for jj in xrange(2): + img.SetRGB(ii, jj, data[counter], data[counter+1], data[counter+2]) + counter = counter + 3 + + return img.ConvertToBitmap() + + +def DrawMACCloseButton(colour, backColour=None): + """ + Draws the wxMAC tab close button using `wx.GraphicsContext`. + + :param `colour`: the colour to use to draw the circle; + :param `backColour`: the optional background colour for the circle. + """ + + bmp = wx.EmptyBitmapRGBA(16, 16) + dc = wx.MemoryDC() + dc.SelectObject(bmp) + + gc = wx.GraphicsContext.Create(dc) + gc.SetBrush(wx.Brush(colour)) + path = gc.CreatePath() + path.AddCircle(6.5, 7, 6.5) + path.CloseSubpath() + gc.FillPath(path) + + path = gc.CreatePath() + if backColour is not None: + pen = wx.Pen(backColour, 2) + else: + pen = wx.Pen("white", 2) + + pen.SetCap(wx.CAP_BUTT) + pen.SetJoin(wx.JOIN_BEVEL) + gc.SetPen(pen) + path.MoveToPoint(3.5, 4) + path.AddLineToPoint(9.5, 10) + path.MoveToPoint(3.5, 10) + path.AddLineToPoint(9.5, 4) + path.CloseSubpath() + gc.DrawPath(path) + + dc.SelectObject(wx.NullBitmap) + return bmp + + +def DarkenBitmap(bmp, caption_colour, new_colour): + """ + Darkens the input bitmap on wxMAC using the input colour. + + :param `bmp`: the bitmap to be manipulated; + :param `caption_colour`: the colour of the pane caption; + :param `new_colour`: the colour used to darken the bitmap. + """ + + image = bmp.ConvertToImage() + red = caption_colour.Red()/float(new_colour.Red()) + green = caption_colour.Green()/float(new_colour.Green()) + blue = caption_colour.Blue()/float(new_colour.Blue()) + image = image.AdjustChannels(red, green, blue) + return image.ConvertToBitmap() + + +def DrawGradientRectangle(dc, rect, start_colour, end_colour, direction, offset=0, length=0): + """ + Draws a gradient-shaded rectangle. + + :param `dc`: a `wx.DC` device context; + :param `rect`: the rectangle in which to draw the gradient; + :param `start_colour`: the first colour of the gradient; + :param `end_colour`: the second colour of the gradient; + :param `direction`: the gradient direction (horizontal or vertical). + """ + + if direction == AUI_GRADIENT_VERTICAL: + dc.GradientFillLinear(rect, start_colour, end_colour, wx.SOUTH) + else: + dc.GradientFillLinear(rect, start_colour, end_colour, wx.EAST) + + +def FindFocusDescendant(ancestor): + """ + Find a window with the focus, that is also a descendant of the given window. + This is used to determine the window to initially send commands to. + + :param `ancestor`: the window to check for ancestry. + """ + + # Process events starting with the window with the focus, if any. + focusWin = wx.Window.FindFocus() + win = focusWin + + # Check if this is a descendant of this frame. + # If not, win will be set to NULL. + while win: + if win == ancestor: + break + else: + win = win.GetParent() + + if win is None: + focusWin = None + + return focusWin + + +def GetLabelSize(dc, label, vertical): + """ + Returns the L{AuiToolBar} item label size. + + :param `label`: the toolbar tool label; + :param `vertical`: whether the toolbar tool orientation is vertical or not. + """ + + text_width = text_height = 0 + + # get the text height + dummy, text_height = dc.GetTextExtent("ABCDHgj") + # get the text width + if label.strip(): + text_width, dummy = dc.GetTextExtent(label) + + if vertical: + tmp = text_height + text_height = text_width + text_width = tmp + + return wx.Size(text_width, text_height) + + +#--------------------------------------------------------------------------- +# TabDragImage implementation +# This class handles the creation of a custom image when dragging +# AuiNotebook tabs +#--------------------------------------------------------------------------- + +class TabDragImage(wx.DragImage): + """ + This class handles the creation of a custom image in case of drag and + drop of a notebook tab. + """ + + def __init__(self, notebook, page, button_state, tabArt): + """ + Default class constructor. + + For internal use: do not call it in your code! + + :param `notebook`: an instance of L{AuiNotebook}; + :param `page`: the dragged L{AuiNotebook} page; + :param `button_state`: the state of the close button on the tab; + :param `tabArt`: an instance of L{AuiDefaultTabArt} or one of its derivations. + """ + + self._backgroundColour = wx.NamedColour("pink") + self._bitmap = self.CreateBitmap(notebook, page, button_state, tabArt) + wx.DragImage.__init__(self, self._bitmap) + + + def CreateBitmap(self, notebook, page, button_state, tabArt): + """ + Actually creates the drag and drop bitmap. + + :param `notebook`: an instance of L{AuiNotebook}; + :param `page`: the dragged L{AuiNotebook} page; + :param `button_state`: the state of the close button on the tab; + :param `tabArt`: an instance of L{AuiDefaultTabArt} or one of its derivations. + """ + + control = page.control + memory = wx.MemoryDC(wx.EmptyBitmap(1, 1)) + + tab_size, x_extent = tabArt.GetTabSize(memory, notebook, page.caption, page.bitmap, page.active, + button_state, control) + + tab_width, tab_height = tab_size + rect = wx.Rect(0, 0, tab_width, tab_height) + + bitmap = wx.EmptyBitmap(tab_width+1, tab_height+1) + memory.SelectObject(bitmap) + + if wx.Platform == "__WXMAC__": + memory.SetBackground(wx.TRANSPARENT_BRUSH) + else: + memory.SetBackground(wx.Brush(self._backgroundColour)) + + memory.SetBackgroundMode(wx.TRANSPARENT) + memory.Clear() + + paint_control = wx.Platform != "__WXMAC__" + tabArt.DrawTab(memory, notebook, page, rect, button_state, paint_control=paint_control) + + memory.SetBrush(wx.TRANSPARENT_BRUSH) + memory.SetPen(wx.BLACK_PEN) + memory.DrawRoundedRectangle(0, 0, tab_width+1, tab_height+1, 2) + + memory.SelectObject(wx.NullBitmap) + + # Gtk and Windows unfortunatly don't do so well with transparent + # drawing so this hack corrects the image to have a transparent + # background. + if wx.Platform != '__WXMAC__': + timg = bitmap.ConvertToImage() + if not timg.HasAlpha(): + timg.InitAlpha() + for y in xrange(timg.GetHeight()): + for x in xrange(timg.GetWidth()): + pix = wx.Colour(timg.GetRed(x, y), + timg.GetGreen(x, y), + timg.GetBlue(x, y)) + if pix == self._backgroundColour: + timg.SetAlpha(x, y, 0) + bitmap = timg.ConvertToBitmap() + return bitmap + + +def GetDockingImage(direction, useAero, center): + """ + Returns the correct name of the docking bitmap depending on the input parameters. + + :param `useAero`: whether L{AuiManager} is using Aero-style or Whidbey-style docking + images or not; + :param `center`: whether we are looking for the center diamond-shaped bitmap or not. + """ + + suffix = (center and [""] or ["_single"])[0] + prefix = "" + if useAero == 2: + # Whidbey docking guides + prefix = "whidbey_" + elif useAero == 1: + # Aero docking style + prefix = "aero_" + + if direction == wx.TOP: + bmp_unfocus = eval("%sup%s"%(prefix, suffix)).GetBitmap() + bmp_focus = eval("%sup_focus%s"%(prefix, suffix)).GetBitmap() + elif direction == wx.BOTTOM: + bmp_unfocus = eval("%sdown%s"%(prefix, suffix)).GetBitmap() + bmp_focus = eval("%sdown_focus%s"%(prefix, suffix)).GetBitmap() + elif direction == wx.LEFT: + bmp_unfocus = eval("%sleft%s"%(prefix, suffix)).GetBitmap() + bmp_focus = eval("%sleft_focus%s"%(prefix, suffix)).GetBitmap() + elif direction == wx.RIGHT: + bmp_unfocus = eval("%sright%s"%(prefix, suffix)).GetBitmap() + bmp_focus = eval("%sright_focus%s"%(prefix, suffix)).GetBitmap() + else: + bmp_unfocus = eval("%stab%s"%(prefix, suffix)).GetBitmap() + bmp_focus = eval("%stab_focus%s"%(prefix, suffix)).GetBitmap() + + return bmp_unfocus, bmp_focus + + +def TakeScreenShot(rect): + """ + Takes a screenshot of the screen at given position and size (rect). + + :param `rect`: the screen rectangle for which we want to take a screenshot. + """ + + # Create a DC for the whole screen area + dcScreen = wx.ScreenDC() + + # Create a Bitmap that will later on hold the screenshot image + # Note that the Bitmap must have a size big enough to hold the screenshot + # -1 means using the current default colour depth + bmp = wx.EmptyBitmap(rect.width, rect.height) + + # Create a memory DC that will be used for actually taking the screenshot + memDC = wx.MemoryDC() + + # Tell the memory DC to use our Bitmap + # all drawing action on the memory DC will go to the Bitmap now + memDC.SelectObject(bmp) + + # Blit (in this case copy) the actual screen on the memory DC + # and thus the Bitmap + memDC.Blit( 0, # Copy to this X coordinate + 0, # Copy to this Y coordinate + rect.width, # Copy this width + rect.height, # Copy this height + dcScreen, # From where do we copy? + rect.x, # What's the X offset in the original DC? + rect.y # What's the Y offset in the original DC? + ) + + # Select the Bitmap out of the memory DC by selecting a new + # uninitialized Bitmap + memDC.SelectObject(wx.NullBitmap) + + return bmp + + +def RescaleScreenShot(bmp, thumbnail_size=200): + """ + Rescales a bitmap to be 300 pixels wide (or tall) at maximum. + + :param `bmp`: the bitmap to rescale; + :param `thumbnail_size`: the maximum size of every page thumbnail. + """ + + bmpW, bmpH = bmp.GetWidth(), bmp.GetHeight() + img = bmp.ConvertToImage() + + newW, newH = bmpW, bmpH + + if bmpW > bmpH: + if bmpW > thumbnail_size: + ratio = bmpW/float(thumbnail_size) + newW, newH = int(bmpW/ratio), int(bmpH/ratio) + img.Rescale(newW, newH, wx.IMAGE_QUALITY_HIGH) + else: + if bmpH > thumbnail_size: + ratio = bmpH/float(thumbnail_size) + newW, newH = int(bmpW/ratio), int(bmpH/ratio) + img.Rescale(newW, newH, wx.IMAGE_QUALITY_HIGH) + + newBmp = img.ConvertToBitmap() + otherBmp = wx.EmptyBitmap(newW+5, newH+5) + + memDC = wx.MemoryDC() + memDC.SelectObject(otherBmp) + memDC.SetBackground(wx.WHITE_BRUSH) + memDC.Clear() + + memDC.SetPen(wx.TRANSPARENT_PEN) + + pos = 0 + for i in xrange(5, 0, -1): + brush = wx.Brush(wx.Colour(50*i, 50*i, 50*i)) + memDC.SetBrush(brush) + memDC.DrawRoundedRectangle(0, 0, newW+5-pos, newH+5-pos, 2) + pos += 1 + + memDC.DrawBitmap(newBmp, 0, 0, True) + + # Select the Bitmap out of the memory DC by selecting a new + # uninitialized Bitmap + memDC.SelectObject(wx.NullBitmap) + + return otherBmp + + +def GetSlidingPoints(rect, size, direction): + """ + Returns the point at which the sliding in and out of a minimized pane begins. + + :param `rect`: the L{AuiToolBar} tool screen rectangle; + :param `size`: the pane window size; + :param `direction`: the pane docking direction. + """ + + if direction == AUI_DOCK_LEFT: + startX, startY = rect.x + rect.width + 2, rect.y + elif direction == AUI_DOCK_TOP: + startX, startY = rect.x, rect.y + rect.height + 2 + elif direction == AUI_DOCK_RIGHT: + startX, startY = rect.x - size.x - 2, rect.y + elif direction == AUI_DOCK_BOTTOM: + startX, startY = rect.x, rect.y - size.y - 2 + else: + raise Exception("How did we get here?") + + caption_height = wx.SystemSettings.GetMetric(wx.SYS_CAPTION_Y) + frame_border_x = wx.SystemSettings.GetMetric(wx.SYS_FRAMESIZE_X) + frame_border_y = wx.SystemSettings.GetMetric(wx.SYS_FRAMESIZE_Y) + + stopX = size.x + caption_height + frame_border_x + stopY = size.x + frame_border_y + + return startX, startY, stopX, stopY + + +def CopyAttributes(newArt, oldArt): + """ + Copies pens, brushes, colours and fonts from the old tab art to the new one. + + :param `newArt`: the new instance of L{AuiDefaultTabArt}; + :param `oldArt`: the old instance of L{AuiDefaultTabArt}. + """ + + attrs = dir(oldArt) + + for attr in attrs: + if attr.startswith("_") and (attr.endswith("_colour") or attr.endswith("_font") or \ + attr.endswith("_font") or attr.endswith("_brush") or \ + attr.endswith("Pen") or attr.endswith("_pen")): + setattr(newArt, attr, getattr(oldArt, attr)) + + return newArt + diff --git a/autres/aui/auibar.py b/autres/aui/auibar.py new file mode 100644 index 0000000..88bb509 --- /dev/null +++ b/autres/aui/auibar.py @@ -0,0 +1,3926 @@ +""" +auibar contains an implementation of L{AuiToolBar}, which is a completely owner-drawn +toolbar perfectly integrated with the AUI layout system. This allows drag and drop of +toolbars, docking/floating behaviour and the possibility to define "overflow" items +in the toolbar itself. + +The default theme that is used is L{AuiDefaultToolBarArt}, which provides a modern, +glossy look and feel. The theme can be changed by calling L{AuiToolBar.SetArtProvider}. +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx +import types + +from aui_utilities import BitmapFromBits, StepColour, GetLabelSize +from aui_utilities import GetBaseColour, MakeDisabledBitmap + +import framemanager +from aui_constants import * + +# wxPython version string +_VERSION_STRING = wx.VERSION_STRING + +# AuiToolBar events +wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN = wx.NewEventType() +wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK = wx.NewEventType() +wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK = wx.NewEventType() +wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK = wx.NewEventType() +wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG = wx.NewEventType() + +EVT_AUITOOLBAR_TOOL_DROPDOWN = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, 1) +""" A dropdown `AuiToolBarItem` is being shown. """ +EVT_AUITOOLBAR_OVERFLOW_CLICK = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, 1) +""" The user left-clicked on the overflow button in `AuiToolBar`. """ +EVT_AUITOOLBAR_RIGHT_CLICK = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, 1) +""" Fires an event when the user right-clicks on a `AuiToolBarItem`. """ +EVT_AUITOOLBAR_MIDDLE_CLICK = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, 1) +""" Fires an event when the user middle-clicks on a `AuiToolBarItem`. """ +EVT_AUITOOLBAR_BEGIN_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, 1) +""" A drag operation involving a toolbar item has started. """ + +# ---------------------------------------------------------------------- + +class CommandToolBarEvent(wx.PyCommandEvent): + """ A specialized command event class for events sent by L{AuiToolBar}. """ + + def __init__(self, command_type, win_id): + """ + Default class constructor. + + :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. + :param `win_id`: the window identification number. + """ + + if type(command_type) == types.IntType: + wx.PyCommandEvent.__init__(self, command_type, win_id) + else: + wx.PyCommandEvent.__init__(self, command_type.GetEventType(), command_type.GetId()) + + self.is_dropdown_clicked = False + self.click_pt = wx.Point(-1, -1) + self.rect = wx.Rect(-1, -1, 0, 0) + self.tool_id = -1 + + + def IsDropDownClicked(self): + """ Returns whether the drop down menu has been clicked. """ + + return self.is_dropdown_clicked + + + def SetDropDownClicked(self, c): + """ + Sets whether the drop down menu has been clicked. + + :param `c`: ``True`` to set the drop down as clicked, ``False`` otherwise. + """ + + self.is_dropdown_clicked = c + + + def GetClickPoint(self): + """ Returns the point where the user clicked with the mouse. """ + + return self.click_pt + + + def SetClickPoint(self, p): + """ + Sets the clicking point. + + :param `p`: a `wx.Point` object. + """ + + self.click_pt = p + + + def GetItemRect(self): + """ Returns the L{AuiToolBarItem} rectangle. """ + + return self.rect + + + def SetItemRect(self, r): + """ + Sets the L{AuiToolBarItem} rectangle. + + :param `r`: an instance of `wx.Rect`. + """ + + self.rect = r + + + def GetToolId(self): + """ Returns the L{AuiToolBarItem} identifier. """ + + return self.tool_id + + + def SetToolId(self, id): + """ + Sets the L{AuiToolBarItem} identifier. + + :param `id`: the toolbar item identifier. + """ + + self.tool_id = id + + +# ---------------------------------------------------------------------- + +class AuiToolBarEvent(CommandToolBarEvent): + """ A specialized command event class for events sent by L{AuiToolBar}. """ + + def __init__(self, command_type=None, win_id=0): + """ + Default class constructor. + + :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. + :param `win_id`: the window identification number. + """ + + CommandToolBarEvent.__init__(self, command_type, win_id) + + if type(command_type) == types.IntType: + self.notify = wx.NotifyEvent(command_type, win_id) + else: + self.notify = wx.NotifyEvent(command_type.GetEventType(), command_type.GetId()) + + + def GetNotifyEvent(self): + """ Returns the actual `wx.NotifyEvent`. """ + + return self.notify + + + def IsAllowed(self): + """ Returns whether the event is allowed or not. """ + + return self.notify.IsAllowed() + + + def Veto(self): + """ + Prevents the change announced by this event from happening. + + It is in general a good idea to notify the user about the reasons for + vetoing the change because otherwise the applications behaviour (which + just refuses to do what the user wants) might be quite surprising. + """ + + self.notify.Veto() + + + def Allow(self): + """ + This is the opposite of L{Veto}: it explicitly allows the event to be + processed. For most events it is not necessary to call this method as the + events are allowed anyhow but some are forbidden by default (this will + be mentioned in the corresponding event description). + """ + + self.notify.Allow() + + +# ---------------------------------------------------------------------- + +class ToolbarCommandCapture(wx.PyEvtHandler): + """ A class to handle the dropdown window menu. """ + + def __init__(self): + """ Default class constructor. """ + + wx.PyEvtHandler.__init__(self) + self._last_id = 0 + + + def GetCommandId(self): + """ Returns the event command identifier. """ + + return self._last_id + + + def ProcessEvent(self, event): + """ + Processes an event, searching event tables and calling zero or more suitable + event handler function(s). + + :param `event`: the event to process. + + :note: Normally, your application would not call this function: it is called + in the wxPython implementation to dispatch incoming user interface events + to the framework (and application). + However, you might need to call it if implementing new functionality (such as + a new control) where you define new event types, as opposed to allowing the + user to override functions. + + An instance where you might actually override the L{ProcessEvent} function is where + you want to direct event processing to event handlers not normally noticed by + wxPython. For example, in the document/view architecture, documents and views + are potential event handlers. When an event reaches a frame, L{ProcessEvent} will + need to be called on the associated document and view in case event handler + functions are associated with these objects. + + The normal order of event table searching is as follows: + + 1. If the object is disabled (via a call to `SetEvtHandlerEnabled`) the function + skips to step (6). + 2. If the object is a `wx.Window`, L{ProcessEvent} is recursively called on the window's + `wx.Validator`. If this returns ``True``, the function exits. + 3. wxWidgets `SearchEventTable` is called for this event handler. If this fails, the + base class table is tried, and so on until no more tables exist or an appropriate + function was found, in which case the function exits. + 4. The search is applied down the entire chain of event handlers (usually the chain + has a length of one). If this succeeds, the function exits. + 5. If the object is a `wx.Window` and the event is a `wx.CommandEvent`, L{ProcessEvent} is + recursively applied to the parent window's event handler. If this returns ``True``, + the function exits. + 6. Finally, L{ProcessEvent} is called on the `wx.App` object. + """ + + if event.GetEventType() == wx.wxEVT_COMMAND_MENU_SELECTED: + self._last_id = event.GetId() + return True + + if self.GetNextHandler(): + return self.GetNextHandler().ProcessEvent(event) + + return False + + +# ---------------------------------------------------------------------- + +class AuiToolBarItem(object): + """ + AuiToolBarItem is a toolbar element. + + It has a unique id (except for the separators which always have id = -1), the + style (telling whether it is a normal button, separator or a control), the + state (toggled or not, enabled or not) and short and long help strings. The + default implementations use the short help string for the tooltip text which + is popped up when the mouse pointer enters the tool and the long help string + for the applications status bar. + """ + + def __init__(self, item=None): + """ + Default class constructor. + + :param `item`: another instance of L{AuiToolBarItem}. + """ + + if item: + self.Assign(item) + return + + self.window = None + self.clockwisebmp = wx.NullBitmap + self.counterclockwisebmp = wx.NullBitmap + self.clockwisedisbmp = wx.NullBitmap + self.counterclockwisedisbmp = wx.NullBitmap + self.sizer_item = None + self.spacer_pixels = 0 + self.id = 0 + self.kind = ITEM_NORMAL + self.state = 0 # normal, enabled + self.proportion = 0 + self.active = True + self.dropdown = True + self.sticky = True + self.user_data = 0 + + self.label = "" + self.bitmap = wx.NullBitmap + self.disabled_bitmap = wx.NullBitmap + self.hover_bitmap = wx.NullBitmap + self.short_help = "" + self.long_help = "" + self.min_size = wx.Size(-1, -1) + self.alignment = wx.ALIGN_CENTER + self.orientation = AUI_TBTOOL_HORIZONTAL + + + def Assign(self, c): + """ + Assigns the properties of the L{AuiToolBarItem} `c` to `self`. + + :param `c`: another instance of L{AuiToolBarItem}. + """ + + self.window = c.window + self.label = c.label + self.bitmap = c.bitmap + self.disabled_bitmap = c.disabled_bitmap + self.hover_bitmap = c.hover_bitmap + self.short_help = c.short_help + self.long_help = c.long_help + self.sizer_item = c.sizer_item + self.min_size = c.min_size + self.spacer_pixels = c.spacer_pixels + self.id = c.id + self.kind = c.kind + self.state = c.state + self.proportion = c.proportion + self.active = c.active + self.dropdown = c.dropdown + self.sticky = c.sticky + self.user_data = c.user_data + self.alignment = c.alignment + self.orientation = c.orientation + + + def SetWindow(self, w): + """ + Assigns a window to the toolbar item. + + :param `w`: an instance of `wx.Window`. + """ + + self.window = w + + + def GetWindow(self): + """ Returns window associated to the toolbar item. """ + + return self.window + + + def SetId(self, new_id): + """ + Sets the toolbar item identifier. + + :param `new_id`: the new tool id. + """ + + self.id = new_id + + + def GetId(self): + """ Returns the toolbar item identifier. """ + + return self.id + + + def SetKind(self, new_kind): + """ + Sets the L{AuiToolBarItem} kind. + + :param `new_kind`: can be one of the following items: + + ======================== ============================= + Item Kind Description + ======================== ============================= + ``ITEM_CONTROL`` The item in the `AuiToolBar` is a control + ``ITEM_LABEL`` The item in the `AuiToolBar` is a text label + ``ITEM_SPACER`` The item in the `AuiToolBar` is a spacer + ``ITEM_SEPARATOR`` The item in the `AuiToolBar` is a separator + ``ITEM_CHECK`` The item in the `AuiToolBar` is a toolbar check item + ``ITEM_NORMAL`` The item in the `AuiToolBar` is a standard toolbar item + ``ITEM_RADIO`` The item in the `AuiToolBar` is a toolbar radio item + ======================== ============================= + """ + + self.kind = new_kind + + + def GetKind(self): + """ Returns the toolbar item kind. See L{SetKind} for more details. """ + + return self.kind + + + def SetState(self, new_state): + """ + Sets the toolbar item state. + + :param `new_state`: can be one of the following states: + + ============================================ ====================================== + Button State Constant Description + ============================================ ====================================== + ``AUI_BUTTON_STATE_NORMAL`` Normal button state + ``AUI_BUTTON_STATE_HOVER`` Hovered button state + ``AUI_BUTTON_STATE_PRESSED`` Pressed button state + ``AUI_BUTTON_STATE_DISABLED`` Disabled button state + ``AUI_BUTTON_STATE_HIDDEN`` Hidden button state + ``AUI_BUTTON_STATE_CHECKED`` Checked button state + ============================================ ====================================== + + """ + + self.state = new_state + + + def GetState(self): + """ + Returns the toolbar item state. See L{SetState} for more details. + + :see: L{SetState} + """ + + return self.state + + + def SetSizerItem(self, s): + """ + Associates a sizer item to this toolbar item. + + :param `s`: an instance of `wx.SizerItem`. + """ + + self.sizer_item = s + + + def GetSizerItem(self): + """ Returns the associated sizer item. """ + + return self.sizer_item + + + def SetLabel(self, s): + """ + Sets the toolbar item label. + + :param `s`: a string specifying the toolbar item label. + """ + + self.label = s + + + def GetLabel(self): + """ Returns the toolbar item label. """ + + return self.label + + + def SetBitmap(self, bmp): + """ + Sets the toolbar item bitmap. + + :param `bmp`: an instance of `wx.Bitmap`. + """ + + self.bitmap = bmp + + + def GetBitmap(self): + """ Returns the toolbar item bitmap. """ + + return self.GetRotatedBitmap(False) + + + def SetDisabledBitmap(self, bmp): + """ + Sets the toolbar item disabled bitmap. + + :param `bmp`: an instance of `wx.Bitmap`. + """ + + self.disabled_bitmap = bmp + + + def GetDisabledBitmap(self): + """ Returns the toolbar item disabled bitmap. """ + + return self.GetRotatedBitmap(True) + + + def SetHoverBitmap(self, bmp): + """ + Sets the toolbar item hover bitmap. + + :param `bmp`: an instance of `wx.Bitmap`. + """ + + self.hover_bitmap = bmp + + + def SetOrientation(self, a): + """ + Sets the toolbar tool orientation. + + :param `a`: one of ``AUI_TBTOOL_HORIZONTAL``, ``AUI_TBTOOL_VERT_CLOCKWISE`` or + ``AUI_TBTOOL_VERT_COUNTERCLOCKWISE``. + """ + + self.orientation = a + + + def GetOrientation(self): + """ Returns the toolbar tool orientation. """ + + return self.orientation + + + def GetHoverBitmap(self): + """ Returns the toolbar item hover bitmap. """ + + return self.hover_bitmap + + + def GetRotatedBitmap(self, disabled): + """ + Returns the correct bitmap depending on the tool orientation. + + :param `disabled`: whether to return the disabled bitmap or not. + """ + + bitmap_to_rotate = (disabled and [self.disabled_bitmap] or [self.bitmap])[0] + if not bitmap_to_rotate.IsOk() or self.orientation == AUI_TBTOOL_HORIZONTAL: + return bitmap_to_rotate + + rotated_bitmap = wx.NullBitmap + clockwise = True + if self.orientation == AUI_TBTOOL_VERT_CLOCKWISE: + rotated_bitmap = (disabled and [self.clockwisedisbmp] or [self.clockwisebmp])[0] + + elif self.orientation == AUI_TBTOOL_VERT_COUNTERCLOCKWISE: + rotated_bitmap = (disabled and [self.counterclockwisedisbmp] or [self.counterclockwisebmp])[0] + clockwise = False + + if not rotated_bitmap.IsOk(): + rotated_bitmap = wx.BitmapFromImage(bitmap_to_rotate.ConvertToImage().Rotate90(clockwise)) + + return rotated_bitmap + + + def SetShortHelp(self, s): + """ + Sets the short help string for the L{AuiToolBarItem}, to be displayed in a + `wx.ToolTip` when the mouse hover over the toolbar item. + + :param `s`: the tool short help string. + """ + + self.short_help = s + + + def GetShortHelp(self): + """ Returns the short help string for the L{AuiToolBarItem}. """ + + return self.short_help + + + def SetLongHelp(self, s): + """ + Sets the long help string for the toolbar item. This string is shown in the + statusbar (if any) of the parent frame when the mouse pointer is inside the + tool. + + :param `s`: the tool long help string. + """ + + self.long_help = s + + + def GetLongHelp(self): + """ Returns the long help string for the L{AuiToolBarItem}. """ + + return self.long_help + + + def SetMinSize(self, s): + """ + Sets the toolbar item minimum size. + + :param `s`: an instance of `wx.Size`. + """ + + self.min_size = wx.Size(*s) + + + def GetMinSize(self): + """ Returns the toolbar item minimum size. """ + + return self.min_size + + + def SetSpacerPixels(self, s): + """ + Sets the number of pixels for a toolbar item with kind = ``ITEM_SEPARATOR``. + + :param `s`: number of pixels. + """ + + self.spacer_pixels = s + + + def GetSpacerPixels(self): + """ Returns the number of pixels for a toolbar item with kind = ``ITEM_SEPARATOR``. """ + + return self.spacer_pixels + + + def SetProportion(self, p): + """ + Sets the L{AuiToolBarItem} proportion in the toolbar. + + :param `p`: the item proportion. + """ + + self.proportion = p + + + def GetProportion(self): + """ Returns the L{AuiToolBarItem} proportion in the toolbar. """ + + return self.proportion + + + def SetActive(self, b): + """ + Activates/deactivates the toolbar item. + + :param `b`: ``True`` to activate the item, ``False`` to deactivate it. + """ + + self.active = b + + + def IsActive(self): + """ Returns whether the toolbar item is active or not. """ + + return self.active + + + def SetHasDropDown(self, b): + """ + Sets whether the toolbar item has an associated dropdown menu. + + :param `b`: ``True`` to set a dropdown menu, ``False`` otherwise. + """ + + self.dropdown = b + + + def HasDropDown(self): + """ Returns whether the toolbar item has an associated dropdown menu or not. """ + + return self.dropdown + + + def SetSticky(self, b): + """ + Sets whether the toolbar item is sticky (permanent highlight after mouse enter) + or not. + + :param `b`: ``True`` to set the item as sticky, ``False`` otherwise. + """ + + self.sticky = b + + + def IsSticky(self): + """ Returns whether the toolbar item has a sticky behaviour or not. """ + + return self.sticky + + + def SetUserData(self, l): + """ + Associates some kind of user data to the toolbar item. + + :param `l`: a Python object. + + :note: The user data can be any Python object. + """ + + self.user_data = l + + + def GetUserData(self): + """ Returns the associated user data. """ + + return self.user_data + + + def SetAlignment(self, l): + """ + Sets the toolbar item alignment. + + :param `l`: the item alignment, which can be one of the available `wx.Sizer` + alignments. + """ + + self.alignment = l + + + def GetAlignment(self): + """ Returns the toolbar item alignment. """ + + return self.alignment + + +# ---------------------------------------------------------------------- + +class AuiDefaultToolBarArt(object): + """ + Toolbar art provider code - a tab provider provides all drawing functionality to + the L{AuiToolBar}. This allows the L{AuiToolBar} to have a plugable look-and-feel. + + By default, a L{AuiToolBar} uses an instance of this class called L{AuiDefaultToolBarArt} + which provides bitmap art and a colour scheme that is adapted to the major platforms' + look. You can either derive from that class to alter its behaviour or write a + completely new tab art class. Call L{AuiToolBar.SetArtProvider} to make use this + new tab art. + """ + + def __init__(self): + """ Default class constructor. """ + + self._base_colour = GetBaseColour() + + self._agwFlags = 0 + self._text_orientation = AUI_TBTOOL_TEXT_BOTTOM + self._highlight_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) + + self._separator_size = 7 + self._orientation = AUI_TBTOOL_HORIZONTAL + self._gripper_size = 7 + self._overflow_size = 16 + + darker1_colour = StepColour(self._base_colour, 85) + darker2_colour = StepColour(self._base_colour, 75) + darker3_colour = StepColour(self._base_colour, 60) + darker4_colour = StepColour(self._base_colour, 50) + darker5_colour = StepColour(self._base_colour, 40) + + self._gripper_pen1 = wx.Pen(darker5_colour) + self._gripper_pen2 = wx.Pen(darker3_colour) + self._gripper_pen3 = wx.WHITE_PEN + + button_dropdown_bits = "\xe0\xf1\xfb" + overflow_bits = "\x80\xff\x80\xc1\xe3\xf7" + + self._button_dropdown_bmp = BitmapFromBits(button_dropdown_bits, 5, 3, wx.BLACK) + self._disabled_button_dropdown_bmp = BitmapFromBits(button_dropdown_bits, 5, 3, + wx.Colour(128, 128, 128)) + self._overflow_bmp = BitmapFromBits(overflow_bits, 7, 6, wx.BLACK) + self._disabled_overflow_bmp = BitmapFromBits(overflow_bits, 7, 6, wx.Colour(128, 128, 128)) + + self._font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + + + def Clone(self): + """ Clones the L{AuiToolBar} art. """ + + return AuiDefaultToolBarArt() + + + def SetAGWFlags(self, agwFlags): + """ + Sets the toolbar art flags. + + :param `agwFlags`: a combination of the following values: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_TB_TEXT`` Shows the text in the toolbar buttons; by default only icons are shown + ``AUI_TB_NO_TOOLTIPS`` Don't show tooltips on `AuiToolBar` items + ``AUI_TB_NO_AUTORESIZE`` Do not auto-resize the `AuiToolBar` + ``AUI_TB_GRIPPER`` Shows a gripper on the `AuiToolBar` + ``AUI_TB_OVERFLOW`` The `AuiToolBar` can contain overflow items + ``AUI_TB_VERTICAL`` The `AuiToolBar` is vertical + ``AUI_TB_HORZ_LAYOUT`` Shows the text and the icons alongside, not vertically stacked. This style must be used with ``AUI_TB_TEXT`` + ``AUI_TB_PLAIN_BACKGROUND`` Don't draw a gradient background on the toolbar + ``AUI_TB_HORZ_TEXT`` Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT`` + ==================================== ================================== + + """ + + self._agwFlags = agwFlags + + + def GetAGWFlags(self): + """ + Returns the L{AuiDefaultToolBarArt} flags. See L{SetAGWFlags} for more + details. + + :see: L{SetAGWFlags} + """ + + return self._agwFlags + + + def SetFont(self, font): + """ + Sets the L{AuiDefaultToolBarArt} font. + + :param `font`: a `wx.Font` object. + """ + + self._font = font + + + def SetTextOrientation(self, orientation): + """ + Sets the text orientation. + + :param `orientation`: can be one of the following constants: + + ==================================== ================================== + Orientation Switches Description + ==================================== ================================== + ``AUI_TBTOOL_TEXT_LEFT`` Text in `AuiToolBar` items is aligned left + ``AUI_TBTOOL_TEXT_RIGHT`` Text in `AuiToolBar` items is aligned right + ``AUI_TBTOOL_TEXT_TOP`` Text in `AuiToolBar` items is aligned top + ``AUI_TBTOOL_TEXT_BOTTOM`` Text in `AuiToolBar` items is aligned bottom + ==================================== ================================== + + """ + + self._text_orientation = orientation + + + def GetFont(self): + """ Returns the L{AuiDefaultToolBarArt} font. """ + + return self._font + + + def GetTextOrientation(self): + """ + Returns the L{AuiDefaultToolBarArt} text orientation. See + L{SetTextOrientation} for more details. + + :see: L{SetTextOrientation} + """ + + return self._text_orientation + + + def SetOrientation(self, orientation): + """ + Sets the toolbar tool orientation. + + :param `orientation`: one of ``AUI_TBTOOL_HORIZONTAL``, ``AUI_TBTOOL_VERT_CLOCKWISE`` or + ``AUI_TBTOOL_VERT_COUNTERCLOCKWISE``. + """ + + self._orientation = orientation + + + def GetOrientation(self): + """ Returns the toolbar orientation. """ + + return self._orientation + + + def DrawBackground(self, dc, wnd, _rect, horizontal=True): + """ + Draws a toolbar background with a gradient shading. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `_rect`: the L{AuiToolBar} rectangle; + :param `horizontal`: ``True`` if the toolbar is horizontal, ``False`` if it is vertical. + """ + + rect = wx.Rect(*_rect) + + start_colour = StepColour(self._base_colour, 180) + end_colour = StepColour(self._base_colour, 85) + reflex_colour = StepColour(self._base_colour, 95) + + dc.GradientFillLinear(rect, start_colour, end_colour, + (horizontal and [wx.SOUTH] or [wx.EAST])[0]) + + left = rect.GetLeft() + right = rect.GetRight() + top = rect.GetTop() + bottom = rect.GetBottom() + + dc.SetPen(wx.Pen(reflex_colour)) + if horizontal: + dc.DrawLine(left, bottom, right+1, bottom) + else: + dc.DrawLine(right, top, right, bottom+1) + + + def DrawPlainBackground(self, dc, wnd, _rect): + """ + Draws a toolbar background with a plain colour. + + This method contrasts with the default behaviour of the L{AuiToolBar} that + draws a background gradient and this break the window design when putting + it within a control that has margin between the borders and the toolbar + (example: put L{AuiToolBar} within a `wx.StaticBoxSizer` that has a plain background). + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `_rect`: the L{AuiToolBar} rectangle. + """ + + rect = wx.Rect(*_rect) + rect.height += 1 + + dc.SetBrush(wx.Brush(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE))) + dc.DrawRectangle(rect.x - 1, rect.y - 1, rect.width + 2, rect.height + 1) + + + def DrawLabel(self, dc, wnd, item, rect): + """ + Draws a toolbar item label. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `item`: an instance of L{AuiToolBarItem}; + :param `rect`: the L{AuiToolBarItem} rectangle. + """ + + dc.SetFont(self._font) + dc.SetTextForeground(wx.BLACK) + orient = item.GetOrientation() + + horizontal = orient == AUI_TBTOOL_HORIZONTAL + # we only care about the text height here since the text + # will get cropped based on the width of the item + label_size = GetLabelSize(dc, item.GetLabel(), not horizontal) + text_width = label_size.GetWidth() + text_height = label_size.GetHeight() + + if orient == AUI_TBTOOL_HORIZONTAL: + text_x = rect.x + text_y = rect.y + (rect.height-text_height)/2 + dc.DrawText(item.GetLabel(), text_x, text_y) + + elif orient == AUI_TBTOOL_VERT_CLOCKWISE: + text_x = rect.x + (rect.width+text_width)/2 + text_y = rect.y + dc.DrawRotatedText(item.GetLabel(), text_x, text_y, 270) + + elif AUI_TBTOOL_VERT_COUNTERCLOCKWISE: + text_x = rect.x + (rect.width-text_width)/2 + text_y = rect.y + text_height + dc.DrawRotatedText(item.GetLabel(), text_x, text_y, 90) + + + def DrawButton(self, dc, wnd, item, rect): + """ + Draws a toolbar item button. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `item`: an instance of L{AuiToolBarItem}; + :param `rect`: the L{AuiToolBarItem} rectangle. + """ + + bmp_rect, text_rect = self.GetToolsPosition(dc, item, rect) + + if not item.GetState() & AUI_BUTTON_STATE_DISABLED: + + if item.GetState() & AUI_BUTTON_STATE_PRESSED: + + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 150))) + dc.DrawRectangleRect(rect) + + elif item.GetState() & AUI_BUTTON_STATE_HOVER or item.IsSticky(): + + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) + + # draw an even lighter background for checked item hovers (since + # the hover background is the same colour as the check background) + if item.GetState() & AUI_BUTTON_STATE_CHECKED: + dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 180))) + + dc.DrawRectangleRect(rect) + + elif item.GetState() & AUI_BUTTON_STATE_CHECKED: + + # it's important to put this code in an else statment after the + # hover, otherwise hovers won't draw properly for checked items + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) + dc.DrawRectangleRect(rect) + + if item.GetState() & AUI_BUTTON_STATE_DISABLED: + bmp = item.GetDisabledBitmap() + else: + bmp = item.GetBitmap() + + if bmp.IsOk(): + dc.DrawBitmap(bmp, bmp_rect.x, bmp_rect.y, True) + + # set the item's text colour based on if it is disabled + dc.SetTextForeground(wx.BLACK) + if item.GetState() & AUI_BUTTON_STATE_DISABLED: + dc.SetTextForeground(DISABLED_TEXT_COLOUR) + + if self._agwFlags & AUI_TB_TEXT and item.GetLabel() != "": + self.DrawLabel(dc, wnd, item, text_rect) + + + def DrawDropDownButton(self, dc, wnd, item, rect): + """ + Draws a toolbar dropdown button. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `item`: an instance of L{AuiToolBarItem}; + :param `rect`: the L{AuiToolBarItem} rectangle. + """ + + dropbmp_x = dropbmp_y = 0 + + button_rect = wx.Rect(rect.x, rect.y, rect.width-BUTTON_DROPDOWN_WIDTH, rect.height) + dropdown_rect = wx.Rect(rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1, rect.y, BUTTON_DROPDOWN_WIDTH+1, rect.height) + + horizontal = item.GetOrientation() == AUI_TBTOOL_HORIZONTAL + + if horizontal: + button_rect = wx.Rect(rect.x, rect.y, rect.width-BUTTON_DROPDOWN_WIDTH, rect.height) + dropdown_rect = wx.Rect(rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1, rect.y, BUTTON_DROPDOWN_WIDTH+1, rect.height) + else: + button_rect = wx.Rect(rect.x, rect.y, rect.width, rect.height-BUTTON_DROPDOWN_WIDTH) + dropdown_rect = wx.Rect(rect.x, rect.y+rect.height-BUTTON_DROPDOWN_WIDTH-1, rect.width, BUTTON_DROPDOWN_WIDTH+1) + + dropbmp_width = self._button_dropdown_bmp.GetWidth() + dropbmp_height = self._button_dropdown_bmp.GetHeight() + if not horizontal: + tmp = dropbmp_width + dropbmp_width = dropbmp_height + dropbmp_height = tmp + + dropbmp_x = dropdown_rect.x + (dropdown_rect.width/2) - dropbmp_width/2 + dropbmp_y = dropdown_rect.y + (dropdown_rect.height/2) - dropbmp_height/2 + + bmp_rect, text_rect = self.GetToolsPosition(dc, item, button_rect) + + if item.GetState() & AUI_BUTTON_STATE_PRESSED: + + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 140))) + dc.DrawRectangleRect(button_rect) + dc.DrawRectangleRect(dropdown_rect) + + elif item.GetState() & AUI_BUTTON_STATE_HOVER or item.IsSticky(): + + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) + dc.DrawRectangleRect(button_rect) + dc.DrawRectangleRect(dropdown_rect) + + elif item.GetState() & AUI_BUTTON_STATE_CHECKED: + # it's important to put this code in an else statment after the + # hover, otherwise hovers won't draw properly for checked items + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.SetBrush(wx.Brush(StepColour(self._highlight_colour, 170))) + dc.DrawRectangle(button_rect) + dc.DrawRectangle(dropdown_rect) + + if item.GetState() & AUI_BUTTON_STATE_DISABLED: + + bmp = item.GetDisabledBitmap() + dropbmp = self._disabled_button_dropdown_bmp + + else: + + bmp = item.GetBitmap() + dropbmp = self._button_dropdown_bmp + + if not bmp.IsOk(): + return + + dc.DrawBitmap(bmp, bmp_rect.x, bmp_rect.y, True) + if horizontal: + dc.DrawBitmap(dropbmp, dropbmp_x, dropbmp_y, True) + else: + dc.DrawBitmap(wx.BitmapFromImage(dropbmp.ConvertToImage().Rotate90(item.GetOrientation() == AUI_TBTOOL_VERT_CLOCKWISE)), + dropbmp_x, dropbmp_y, True) + + # set the item's text colour based on if it is disabled + dc.SetTextForeground(wx.BLACK) + if item.GetState() & AUI_BUTTON_STATE_DISABLED: + dc.SetTextForeground(DISABLED_TEXT_COLOUR) + + if self._agwFlags & AUI_TB_TEXT and item.GetLabel() != "": + self.DrawLabel(dc, wnd, item, text_rect) + + + def DrawControlLabel(self, dc, wnd, item, rect): + """ + Draws a label for a toolbar control. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `item`: an instance of L{AuiToolBarItem}; + :param `rect`: the L{AuiToolBarItem} rectangle. + """ + + label_size = GetLabelSize(dc, item.GetLabel(), item.GetOrientation() != AUI_TBTOOL_HORIZONTAL) + text_height = label_size.GetHeight() + text_width = label_size.GetWidth() + + dc.SetFont(self._font) + + if self._agwFlags & AUI_TB_TEXT: + + tx, text_height = dc.GetTextExtent("ABCDHgj") + + text_width, ty = dc.GetTextExtent(item.GetLabel()) + + # don't draw the label if it is wider than the item width + if text_width > rect.width: + return + + # set the label's text colour + dc.SetTextForeground(wx.BLACK) + + text_x = rect.x + (rect.width/2) - (text_width/2) + 1 + text_y = rect.y + rect.height - text_height - 1 + + if self._agwFlags & AUI_TB_TEXT and item.GetLabel() != "": + dc.DrawText(item.GetLabel(), text_x, text_y) + + + def GetLabelSize(self, dc, wnd, item): + """ + Returns the label size for a toolbar item. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `item`: an instance of L{AuiToolBarItem}. + """ + + dc.SetFont(self._font) + label_size = GetLabelSize(dc, item.GetLabel(), self._orientation != AUI_TBTOOL_HORIZONTAL) + + return wx.Size(item.GetMinSize().GetWidth(), label_size.GetHeight()) + + + def GetToolSize(self, dc, wnd, item): + """ + Returns the toolbar item size. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `item`: an instance of L{AuiToolBarItem}. + """ + + if not item.GetBitmap().IsOk() and not self._agwFlags & AUI_TB_TEXT: + return wx.Size(16, 16) + + width = item.GetBitmap().GetWidth() + height = item.GetBitmap().GetHeight() + + if self._agwFlags & AUI_TB_TEXT: + + dc.SetFont(self._font) + label_size = GetLabelSize(dc, item.GetLabel(), self.GetOrientation() != AUI_TBTOOL_HORIZONTAL) + padding = 6 + + if self._text_orientation == AUI_TBTOOL_TEXT_BOTTOM: + + if self.GetOrientation() != AUI_TBTOOL_HORIZONTAL: + height += 3 # space between top border and bitmap + height += 3 # space between bitmap and text + padding = 0 + + height += label_size.GetHeight() + + if item.GetLabel() != "": + width = max(width, label_size.GetWidth()+padding) + + elif self._text_orientation == AUI_TBTOOL_TEXT_RIGHT and item.GetLabel() != "": + + if self.GetOrientation() == AUI_TBTOOL_HORIZONTAL: + + width += 3 # space between left border and bitmap + width += 3 # space between bitmap and text + padding = 0 + + width += label_size.GetWidth() + height = max(height, label_size.GetHeight()+padding) + + # if the tool has a dropdown button, add it to the width + if item.HasDropDown(): + if item.GetOrientation() == AUI_TBTOOL_HORIZONTAL: + width += BUTTON_DROPDOWN_WIDTH+4 + else: + height += BUTTON_DROPDOWN_WIDTH+4 + + return wx.Size(width, height) + + + def DrawSeparator(self, dc, wnd, _rect): + """ + Draws a toolbar separator. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `_rect`: the L{AuiToolBarItem} rectangle. + """ + + horizontal = True + if self._agwFlags & AUI_TB_VERTICAL: + horizontal = False + + rect = wx.Rect(*_rect) + + if horizontal: + + rect.x += (rect.width/2) + rect.width = 1 + new_height = (rect.height*3)/4 + rect.y += (rect.height/2) - (new_height/2) + rect.height = new_height + + else: + + rect.y += (rect.height/2) + rect.height = 1 + new_width = (rect.width*3)/4 + rect.x += (rect.width/2) - (new_width/2) + rect.width = new_width + + start_colour = StepColour(self._base_colour, 80) + end_colour = StepColour(self._base_colour, 80) + dc.GradientFillLinear(rect, start_colour, end_colour, (horizontal and [wx.SOUTH] or [wx.EAST])[0]) + + + def DrawGripper(self, dc, wnd, rect): + """ + Draws the toolbar gripper. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `rect`: the L{AuiToolBar} rectangle. + """ + + i = 0 + while 1: + + if self._agwFlags & AUI_TB_VERTICAL: + + x = rect.x + (i*4) + 4 + y = rect.y + 3 + if x > rect.GetWidth() - 4: + break + + else: + + x = rect.x + 3 + y = rect.y + (i*4) + 4 + if y > rect.GetHeight() - 4: + break + + dc.SetPen(self._gripper_pen1) + dc.DrawPoint(x, y) + dc.SetPen(self._gripper_pen2) + dc.DrawPoint(x, y+1) + dc.DrawPoint(x+1, y) + dc.SetPen(self._gripper_pen3) + dc.DrawPoint(x+2, y+1) + dc.DrawPoint(x+2, y+2) + dc.DrawPoint(x+1, y+2) + + i += 1 + + + def DrawOverflowButton(self, dc, wnd, rect, state): + """ + Draws the overflow button for the L{AuiToolBar}. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` derived window; + :param `rect`: the L{AuiToolBar} rectangle; + :param `state`: the overflow button state. + """ + + if state & AUI_BUTTON_STATE_HOVER or state & AUI_BUTTON_STATE_PRESSED: + + cli_rect = wnd.GetClientRect() + light_gray_bg = StepColour(self._highlight_colour, 170) + + if self._agwFlags & AUI_TB_VERTICAL: + + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.DrawLine(rect.x, rect.y, rect.x+rect.width, rect.y) + dc.SetPen(wx.Pen(light_gray_bg)) + dc.SetBrush(wx.Brush(light_gray_bg)) + dc.DrawRectangle(rect.x, rect.y+1, rect.width, rect.height) + + else: + + dc.SetPen(wx.Pen(self._highlight_colour)) + dc.DrawLine(rect.x, rect.y, rect.x, rect.y+rect.height) + dc.SetPen(wx.Pen(light_gray_bg)) + dc.SetBrush(wx.Brush(light_gray_bg)) + dc.DrawRectangle(rect.x+1, rect.y, rect.width, rect.height) + + x = rect.x + 1 + (rect.width-self._overflow_bmp.GetWidth())/2 + y = rect.y + 1 + (rect.height-self._overflow_bmp.GetHeight())/2 + dc.DrawBitmap(self._overflow_bmp, x, y, True) + + + def GetElementSize(self, element_id): + """ + Returns the size of a UI element in the L{AuiToolBar}. + + :param `element_id`: can be one of the following: + + ==================================== ================================== + Element Identifier Description + ==================================== ================================== + ``AUI_TBART_SEPARATOR_SIZE`` Separator size in `AuiToolBar` + ``AUI_TBART_GRIPPER_SIZE`` Gripper size in `AuiToolBar` + ``AUI_TBART_OVERFLOW_SIZE`` Overflow button size in `AuiToolBar` + ==================================== ================================== + """ + + if element_id == AUI_TBART_SEPARATOR_SIZE: + return self._separator_size + elif element_id == AUI_TBART_GRIPPER_SIZE: + return self._gripper_size + elif element_id == AUI_TBART_OVERFLOW_SIZE: + return self._overflow_size + + return 0 + + + def SetElementSize(self, element_id, size): + """ + Sets the size of a UI element in the L{AuiToolBar}. + + :param `element_id`: can be one of the following: + + ==================================== ================================== + Element Identifier Description + ==================================== ================================== + ``AUI_TBART_SEPARATOR_SIZE`` Separator size in `AuiToolBar` + ``AUI_TBART_GRIPPER_SIZE`` Gripper size in `AuiToolBar` + ``AUI_TBART_OVERFLOW_SIZE`` Overflow button size in `AuiToolBar` + ==================================== ================================== + + :param `size`: the new size of the UI element. + """ + + if element_id == AUI_TBART_SEPARATOR_SIZE: + self._separator_size = size + elif element_id == AUI_TBART_GRIPPER_SIZE: + self._gripper_size = size + elif element_id == AUI_TBART_OVERFLOW_SIZE: + self._overflow_size = size + + + def ShowDropDown(self, wnd, items): + """ + Shows the drop down window menu for overflow items. + + :param `wnd`: an instance of `wx.Window`; + :param `items`: the overflow toolbar items (a Python list). + """ + + menuPopup = wx.Menu() + items_added = 0 + + for item in items: + + if item.GetKind() not in [ITEM_SEPARATOR, ITEM_SPACER, ITEM_CONTROL]: + + text = item.GetShortHelp() + if text == "": + text = item.GetLabel() + if text == "": + text = " " + + kind = item.GetKind() + m = wx.MenuItem(menuPopup, item.GetId(), text, item.GetShortHelp(), kind) + orientation = item.GetOrientation() + item.SetOrientation(AUI_TBTOOL_HORIZONTAL) + + if kind not in [ITEM_CHECK, ITEM_RADIO]: + m.SetBitmap(item.GetBitmap()) + + item.SetOrientation(orientation) + + menuPopup.AppendItem(m) + if kind in [ITEM_CHECK, ITEM_RADIO]: + state = (item.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] + m.Check(state) + + items_added += 1 + + else: + + if items_added > 0 and item.GetKind() == ITEM_SEPARATOR: + menuPopup.AppendSeparator() + + # find out where to put the popup menu of window items + pt = wx.GetMousePosition() + pt = wnd.ScreenToClient(pt) + + # find out the screen coordinate at the bottom of the tab ctrl + cli_rect = wnd.GetClientRect() + pt.y = cli_rect.y + cli_rect.height + + cc = ToolbarCommandCapture() + wnd.PushEventHandler(cc) + + # Adjustments to get slightly better menu placement + if wx.Platform == "__WXMAC__": + pt.y += 5 + pt.x -= 5 + + wnd.PopupMenu(menuPopup, pt) + command = cc.GetCommandId() + wnd.PopEventHandler(True) + + return command + + + def GetToolsPosition(self, dc, item, rect): + """ + Returns the bitmap and text rectangles for a toolbar item. + + :param `dc`: a `wx.DC` device context; + :param `item`: an instance of L{AuiToolBarItem}; + :param `rect`: the tool rect. + """ + + text_width = text_height = 0 + horizontal = self._orientation == AUI_TBTOOL_HORIZONTAL + text_bottom = self._text_orientation == AUI_TBTOOL_TEXT_BOTTOM + text_right = self._text_orientation == AUI_TBTOOL_TEXT_RIGHT + bmp_width = item.GetBitmap().GetWidth() + bmp_height = item.GetBitmap().GetHeight() + + if self._agwFlags & AUI_TB_TEXT: + dc.SetFont(self._font) + label_size = GetLabelSize(dc, item.GetLabel(), not horizontal) + text_height = label_size.GetHeight() + text_width = label_size.GetWidth() + + bmp_x = bmp_y = text_x = text_y = 0 + + if horizontal and text_bottom: + bmp_x = rect.x + (rect.width/2) - (bmp_width/2) + bmp_y = rect.y + 3 + text_x = rect.x + (rect.width/2) - (text_width/2) + text_y = rect.y + ((bmp_y - rect.y) * 2) + bmp_height + + elif horizontal and text_right: + bmp_x = rect.x + 3 + bmp_y = rect.y + (rect.height/2) - (bmp_height / 2) + text_x = rect.x + ((bmp_x - rect.x) * 2) + bmp_width + text_y = rect.y + (rect.height/2) - (text_height/2) + + elif not horizontal and text_bottom: + bmp_x = rect.x + (rect.width / 2) - (bmp_width / 2) + bmp_y = rect.y + 3 + text_x = rect.x + (rect.width / 2) - (text_width / 2) + text_y = rect.y + ((bmp_y - rect.y) * 2) + bmp_height + + bmp_rect = wx.Rect(bmp_x, bmp_y, bmp_width, bmp_height) + text_rect = wx.Rect(text_x, text_y, text_width, text_height) + + return bmp_rect, text_rect + + +class AuiToolBar(wx.PyControl): + """ + AuiToolBar is a completely owner-drawn toolbar perfectly integrated with the + AUI layout system. This allows drag and drop of toolbars, docking/floating + behaviour and the possibility to define "overflow" items in the toolbar itself. + + The default theme that is used is L{AuiDefaultToolBarArt}, which provides a modern, + glossy look and feel. The theme can be changed by calling L{AuiToolBar.SetArtProvider}. + """ + + def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, + size=wx.DefaultSize, style=0, agwStyle=AUI_TB_DEFAULT_STYLE): + """ + Default class constructor. + + :param `parent`: the L{AuiToolBar} parent; + :param `id`: an identifier for the control: a value of -1 is taken to mean a default; + :param `pos`: the control position. A value of (-1, -1) indicates a default position, + chosen by either the windowing system or wxPython, depending on platform; + :param `size`: the control size. A value of (-1, -1) indicates a default size, + chosen by either the windowing system or wxPython, depending on platform; + :param `style`: the control window style; + :param `agwStyle`: the AGW-specific window style. This can be a combination of the + following bits: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_TB_TEXT`` Shows the text in the toolbar buttons; by default only icons are shown + ``AUI_TB_NO_TOOLTIPS`` Don't show tooltips on `AuiToolBar` items + ``AUI_TB_NO_AUTORESIZE`` Do not auto-resize the `AuiToolBar` + ``AUI_TB_GRIPPER`` Shows a gripper on the `AuiToolBar` + ``AUI_TB_OVERFLOW`` The `AuiToolBar` can contain overflow items + ``AUI_TB_VERTICAL`` The `AuiToolBar` is vertical + ``AUI_TB_HORZ_LAYOUT`` Shows the text and the icons alongside, not vertically stacked. This style must be used with ``AUI_TB_TEXT`` + ``AUI_TB_PLAIN_BACKGROUND`` Don't draw a gradient background on the toolbar + ``AUI_TB_HORZ_TEXT`` Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT`` + ==================================== ================================== + + The default value for `agwStyle` is: ``AUI_TB_DEFAULT_STYLE`` = 0 + + """ + + wx.PyControl.__init__(self, parent, id, pos, size, style|wx.BORDER_NONE) + + self._sizer = wx.BoxSizer(wx.HORIZONTAL) + self.SetSizer(self._sizer) + self._button_width = -1 + self._button_height = -1 + self._sizer_element_count = 0 + self._action_pos = wx.Point(-1, -1) + self._action_item = None + self._tip_item = None + self._art = AuiDefaultToolBarArt() + self._tool_packing = 2 + self._tool_border_padding = 3 + self._tool_text_orientation = AUI_TBTOOL_TEXT_BOTTOM + self._tool_orientation = AUI_TBTOOL_HORIZONTAL + self._tool_alignment = wx.EXPAND + self._gripper_sizer_item = None + self._overflow_sizer_item = None + self._dragging = False + + self._agwStyle = self._originalStyle = agwStyle + + self._gripper_visible = (self._agwStyle & AUI_TB_GRIPPER and [True] or [False])[0] + self._overflow_visible = (self._agwStyle & AUI_TB_OVERFLOW and [True] or [False])[0] + self._overflow_state = 0 + self._custom_overflow_prepend = [] + self._custom_overflow_append = [] + + self._items = [] + + self.SetMargins(5, 5, 2, 2) + self.SetFont(wx.NORMAL_FONT) + self._art.SetAGWFlags(self._agwStyle) + self.SetExtraStyle(wx.WS_EX_PROCESS_IDLE) + + if agwStyle & AUI_TB_HORZ_LAYOUT: + self.SetToolTextOrientation(AUI_TBTOOL_TEXT_RIGHT) + elif agwStyle & AUI_TB_VERTICAL: + if agwStyle & AUI_TB_CLOCKWISE: + self.SetToolOrientation(AUI_TBTOOL_VERT_CLOCKWISE) + elif agwStyle & AUI_TB_COUNTERCLOCKWISE: + self.SetToolOrientation(AUI_TBTOOL_VERT_COUNTERCLOCKWISE) + + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_IDLE, self.OnIdle) + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) + self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown) + self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) + self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) + self.Bind(wx.EVT_RIGHT_DCLICK, self.OnRightDown) + self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) + self.Bind(wx.EVT_MIDDLE_DOWN, self.OnMiddleDown) + self.Bind(wx.EVT_MIDDLE_DCLICK, self.OnMiddleDown) + self.Bind(wx.EVT_MIDDLE_UP, self.OnMiddleUp) + self.Bind(wx.EVT_MOTION, self.OnMotion) + self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) + self.Bind(wx.EVT_SET_CURSOR, self.OnSetCursor) + + + def SetWindowStyleFlag(self, style): + """ + Sets the style of the window. + + :param `style`: the new window style. + + :note: Please note that some styles cannot be changed after the window + creation and that `Refresh` might need to be be called after changing the + others for the change to take place immediately. + + :note: Overridden from `wx.PyControl`. + """ + + wx.PyControl.SetWindowStyleFlag(self, style|wx.BORDER_NONE) + + + def SetAGWWindowStyleFlag(self, agwStyle): + """ + Sets the AGW-specific style of the window. + + :param `agwStyle`: the new window style. This can be a combination of the + following bits: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_TB_TEXT`` Shows the text in the toolbar buttons; by default only icons are shown + ``AUI_TB_NO_TOOLTIPS`` Don't show tooltips on `AuiToolBar` items + ``AUI_TB_NO_AUTORESIZE`` Do not auto-resize the `AuiToolBar` + ``AUI_TB_GRIPPER`` Shows a gripper on the `AuiToolBar` + ``AUI_TB_OVERFLOW`` The `AuiToolBar` can contain overflow items + ``AUI_TB_VERTICAL`` The `AuiToolBar` is vertical + ``AUI_TB_HORZ_LAYOUT`` Shows the text and the icons alongside, not vertically stacked. This style must be used with ``AUI_TB_TEXT`` + ``AUI_TB_PLAIN_BACKGROUND`` Don't draw a gradient background on the toolbar + ``AUI_TB_HORZ_TEXT`` Combination of ``AUI_TB_HORZ_LAYOUT`` and ``AUI_TB_TEXT`` + ==================================== ================================== + + :note: Please note that some styles cannot be changed after the window + creation and that `Refresh` might need to be be called after changing the + others for the change to take place immediately. + """ + + self._agwStyle = self._originalStyle = agwStyle + + if self._art: + self._art.SetAGWFlags(self._agwStyle) + + if agwStyle & AUI_TB_GRIPPER: + self._gripper_visible = True + else: + self._gripper_visible = False + + if agwStyle & AUI_TB_OVERFLOW: + self._overflow_visible = True + else: + self._overflow_visible = False + + if agwStyle & AUI_TB_HORZ_LAYOUT: + self.SetToolTextOrientation(AUI_TBTOOL_TEXT_RIGHT) + else: + self.SetToolTextOrientation(AUI_TBTOOL_TEXT_BOTTOM) + + if agwStyle & AUI_TB_VERTICAL: + if agwStyle & AUI_TB_CLOCKWISE: + self.SetToolOrientation(AUI_TBTOOL_VERT_CLOCKWISE) + elif agwStyle & AUI_TB_COUNTERCLOCKWISE: + self.SetToolOrientation(AUI_TBTOOL_VERT_COUNTERCLOCKWISE) + + + def GetAGWWindowStyleFlag(self): + """ + Returns the AGW-specific window style flag. + + :see: L{SetAGWWindowStyleFlag} for an explanation of various AGW-specific style. + """ + + return self._agwStyle + + + def SetArtProvider(self, art): + """ + Instructs L{AuiToolBar} to use art provider specified by parameter `art` + for all drawing calls. This allows plugable look-and-feel features. + + :param `art`: an art provider. + + :note: The previous art provider object, if any, will be deleted by L{AuiToolBar}. + """ + + del self._art + self._art = art + + if self._art: + self._art.SetAGWFlags(self._agwStyle) + self._art.SetTextOrientation(self._tool_text_orientation) + self._art.SetOrientation(self._tool_orientation) + + + def GetArtProvider(self): + """ Returns the current art provider being used. """ + + return self._art + + + def AddSimpleTool(self, tool_id, label, bitmap, short_help_string="", kind=ITEM_NORMAL): + """ + Adds a tool to the toolbar. This is the simplest method you can use to + ass an item to the L{AuiToolBar}. + + :param `tool_id`: an integer by which the tool may be identified in subsequent operations; + :param `label`: the toolbar tool label; + :param `bitmap`: the primary tool bitmap; + :param `short_help_string`: this string is used for the tools tooltip; + :param `kind`: the item kind. Can be one of the following: + + ======================== ============================= + Item Kind Description + ======================== ============================= + ``ITEM_CONTROL`` The item in the `AuiToolBar` is a control + ``ITEM_LABEL`` The item in the `AuiToolBar` is a text label + ``ITEM_SPACER`` The item in the `AuiToolBar` is a spacer + ``ITEM_SEPARATOR`` The item in the `AuiToolBar` is a separator + ``ITEM_CHECK`` The item in the `AuiToolBar` is a toolbar check item + ``ITEM_NORMAL`` The item in the `AuiToolBar` is a standard toolbar item + ``ITEM_RADIO`` The item in the `AuiToolBar` is a toolbar radio item + ======================== ============================= + """ + + return self.AddTool(tool_id, label, bitmap, wx.NullBitmap, kind, short_help_string, "", None) + + + def AddToggleTool(self, tool_id, bitmap, disabled_bitmap, toggle=False, client_data=None, short_help_string="", long_help_string=""): + """ + Adds a toggle tool to the toolbar. + + :param `tool_id`: an integer by which the tool may be identified in subsequent operations; + :param `bitmap`: the primary tool bitmap; + :param `disabled_bitmap`: the bitmap to use when the tool is disabled. If it is equal to + `wx.NullBitmap`, the disabled bitmap is automatically generated by greing the normal one; + :param `client_data`: whatever Python object to associate with the toolbar item; + :param `short_help_string`: this string is used for the tools tooltip; + :param `long_help_string`: this string is shown in the statusbar (if any) of the parent + frame when the mouse pointer is inside the tool. + """ + + kind = (toggle and [ITEM_CHECK] or [ITEM_NORMAL])[0] + return self.AddTool(tool_id, "", bitmap, disabled_bitmap, kind, short_help_string, long_help_string, client_data) + + + def AddTool(self, tool_id, label, bitmap, disabled_bitmap, kind, short_help_string, long_help_string, client_data): + """ + Adds a tool to the toolbar. This is the full feature version of L{AddTool}. + + :param `tool_id`: an integer by which the tool may be identified in subsequent operations; + :param `label`: the toolbar tool label; + :param `bitmap`: the primary tool bitmap; + :param `disabled_bitmap`: the bitmap to use when the tool is disabled. If it is equal to + `wx.NullBitmap`, the disabled bitmap is automatically generated by greing the normal one; + :param `kind`: the item kind. Can be one of the following: + + ======================== ============================= + Item Kind Description + ======================== ============================= + ``ITEM_CONTROL`` The item in the `AuiToolBar` is a control + ``ITEM_LABEL`` The item in the `AuiToolBar` is a text label + ``ITEM_SPACER`` The item in the `AuiToolBar` is a spacer + ``ITEM_SEPARATOR`` The item in the `AuiToolBar` is a separator + ``ITEM_CHECK`` The item in the `AuiToolBar` is a toolbar check item + ``ITEM_NORMAL`` The item in the `AuiToolBar` is a standard toolbar item + ``ITEM_RADIO`` The item in the `AuiToolBar` is a toolbar radio item + ======================== ============================= + + :param `short_help_string`: this string is used for the tools tooltip; + :param `long_help_string`: this string is shown in the statusbar (if any) of the parent + frame when the mouse pointer is inside the tool. + :param `client_data`: whatever Python object to associate with the toolbar item. + """ + + item = AuiToolBarItem() + item.window = None + item.label = label + item.bitmap = bitmap + item.disabled_bitmap = disabled_bitmap + item.short_help = short_help_string + item.long_help = long_help_string + item.active = True + item.dropdown = False + item.spacer_pixels = 0 + + if tool_id == wx.ID_ANY: + tool_id = wx.NewId() + + item.id = tool_id + item.state = 0 + item.proportion = 0 + item.kind = kind + item.sizer_item = None + item.min_size = wx.Size(-1, -1) + item.user_data = 0 + item.sticky = False + item.orientation = self._tool_orientation + + if not item.disabled_bitmap.IsOk(): + # no disabled bitmap specified, we need to make one + if item.bitmap.IsOk(): + item.disabled_bitmap = MakeDisabledBitmap(item.bitmap) + + self._items.append(item) + return self._items[-1] + + + def AddCheckTool(self, tool_id, label, bitmap, disabled_bitmap, short_help_string="", long_help_string="", client_data=None): + """ + Adds a new check (or toggle) tool to the L{AuiToolBar}. + + :see: L{AddTool}. + """ + + return self.AddTool(tool_id, label, bitmap, disabled_bitmap, ITEM_CHECK, short_help_string, long_help_string, client_data) + + + def AddRadioTool(self, tool_id, label, bitmap, disabled_bitmap, short_help_string="", long_help_string="", client_data=None): + """ + Adds a new radio tool to the toolbar. + + Consecutive radio tools form a radio group such that exactly one button + in the group is pressed at any moment, in other words whenever a button + in the group is pressed the previously pressed button is automatically + released. You should avoid having the radio groups of only one element + as it would be impossible for the user to use such button. + + :note: By default, the first button in the radio group is initially pressed, + the others are not. + + :see: L{AddTool}. + """ + + return self.AddTool(tool_id, label, bitmap, disabled_bitmap, ITEM_RADIO, short_help_string, long_help_string, client_data) + + + def AddControl(self, control, label=""): + """ + Adds any control to the toolbar, typically e.g. a combobox. + + :param `control`: the control to be added; + :param `label`: the label which appears if the control goes into the + overflow items in the toolbar. + """ + + item = AuiToolBarItem() + item.window = control + item.label = label + item.bitmap = wx.NullBitmap + item.disabled_bitmap = wx.NullBitmap + item.active = True + item.dropdown = False + item.spacer_pixels = 0 + item.id = control.GetId() + item.state = 0 + item.proportion = 0 + item.kind = ITEM_CONTROL + item.sizer_item = None + item.min_size = control.GetEffectiveMinSize() + item.user_data = 0 + item.sticky = False + item.orientation = self._tool_orientation + + self._items.append(item) + return self._items[-1] + + + def AddLabel(self, tool_id, label="", width=0): + """ + Adds a label tool to the L{AuiToolBar}. + + :param `tool_id`: an integer by which the tool may be identified in subsequent operations; + :param `label`: the toolbar tool label; + :param `width`: the tool width. + """ + + min_size = wx.Size(-1, -1) + + if width != -1: + min_size.x = width + + item = AuiToolBarItem() + item.window = None + item.label = label + item.bitmap = wx.NullBitmap + item.disabled_bitmap = wx.NullBitmap + item.active = True + item.dropdown = False + item.spacer_pixels = 0 + + if tool_id == wx.ID_ANY: + tool_id = wx.NewId() + + item.id = tool_id + item.state = 0 + item.proportion = 0 + item.kind = ITEM_LABEL + item.sizer_item = None + item.min_size = min_size + item.user_data = 0 + item.sticky = False + item.orientation = self._tool_orientation + + self._items.append(item) + return self._items[-1] + + + def AddSeparator(self): + """ Adds a separator for spacing groups of tools. """ + + item = AuiToolBarItem() + item.window = None + item.label = "" + item.bitmap = wx.NullBitmap + item.disabled_bitmap = wx.NullBitmap + item.active = True + item.dropdown = False + item.id = -1 + item.state = 0 + item.proportion = 0 + item.kind = ITEM_SEPARATOR + item.sizer_item = None + item.min_size = wx.Size(-1, -1) + item.user_data = 0 + item.sticky = False + item.orientation = self._tool_orientation + + self._items.append(item) + return self._items[-1] + + + def AddSpacer(self, pixels): + """ + Adds a spacer for spacing groups of tools. + + :param `pixels`: the width of the spacer. + """ + + item = AuiToolBarItem() + item.window = None + item.label = "" + item.bitmap = wx.NullBitmap + item.disabled_bitmap = wx.NullBitmap + item.active = True + item.dropdown = False + item.spacer_pixels = pixels + item.id = -1 + item.state = 0 + item.proportion = 0 + item.kind = ITEM_SPACER + item.sizer_item = None + item.min_size = wx.Size(-1, -1) + item.user_data = 0 + item.sticky = False + item.orientation = self._tool_orientation + + self._items.append(item) + return self._items[-1] + + + def AddStretchSpacer(self, proportion=1): + """ + Adds a stretchable spacer for spacing groups of tools. + + :param `proportion`: the stretchable spacer proportion. + """ + + item = AuiToolBarItem() + item.window = None + item.label = "" + item.bitmap = wx.NullBitmap + item.disabled_bitmap = wx.NullBitmap + item.active = True + item.dropdown = False + item.spacer_pixels = 0 + item.id = -1 + item.state = 0 + item.proportion = proportion + item.kind = ITEM_SPACER + item.sizer_item = None + item.min_size = wx.Size(-1, -1) + item.user_data = 0 + item.sticky = False + item.orientation = self._tool_orientation + + self._items.append(item) + return self._items[-1] + + + def Clear(self): + """ Deletes all the tools in the L{AuiToolBar}. """ + + self._items = [] + self._sizer_element_count = 0 + + + def ClearTools(self): + """ Deletes all the tools in the L{AuiToolBar}. """ + + self.Clear() + + + def DeleteTool(self, tool_id): + """ + Removes the specified tool from the toolbar and deletes it. + + :param `tool_id`: the L{AuiToolBarItem} identifier. + + :returns: ``True`` if the tool was deleted, ``False`` otherwise. + + :note: Note that it is unnecessary to call L{Realize} for the change to + take place, it will happen immediately. + """ + + idx = self.GetToolIndex(tool_id) + + if idx >= 0 and idx < len(self._items): + self._items.pop(idx) + self.Realize() + return True + + return False + + + def DeleteToolByPos(self, pos): + """ + This function behaves like L{DeleteTool} but it deletes the tool at the + specified position and not the one with the given id. + + :param `pos`: the tool position. + + :see: L{DeleteTool} + """ + + if pos >= 0 and pos < len(self._items): + + self._items.pop(pos) + self.Realize() + return True + + return False + + + def FindControl(self, id): + """ + Returns a pointer to the control identified by `id` or ``None`` if no corresponding + control is found. + + :param `id`: the control identifier. + """ + + wnd = self.FindWindow(id) + return wnd + + + def FindTool(self, tool_id): + """ + Finds a tool for the given tool id. + + :param `tool_id`: the L{AuiToolBarItem} identifier. + """ + + for item in self._items: + if item.id == tool_id: + return item + + return None + + + def FindToolForPosition(self, x, y): + """ + Finds a tool for the given mouse position. + + :param `x`: mouse `x` position; + :param `y`: mouse `y` position. + + :returns: a pointer to a L{AuiToolBarItem} if a tool is found, or ``None`` otherwise. + """ + + for i, item in enumerate(self._items): + if not item.sizer_item: + continue + + rect = item.sizer_item.GetRect() + if rect.Contains((x,y)): + + # if the item doesn't fit on the toolbar, return None + if not self.GetToolFitsByIndex(i): + return None + + return item + + return None + + + def FindToolForPositionWithPacking(self, x, y): + """ + Finds a tool for the given mouse position, taking into account also the + tool packing. + + :param `x`: mouse `x` position; + :param `y`: mouse `y` position. + + :returns: a pointer to a L{AuiToolBarItem} if a tool is found, or ``None`` otherwise. + """ + + count = len(self._items) + + for i, item in enumerate(self._items): + if not item.sizer_item: + continue + + rect = item.sizer_item.GetRect() + + # apply tool packing + if i+1 < count: + rect.width += self._tool_packing + + if rect.Contains((x,y)): + + # if the item doesn't fit on the toolbar, return None + if not self.GetToolFitsByIndex(i): + return None + + return item + + return None + + + def FindToolByIndex(self, pos): + """ + Finds a tool for the given tool position in the L{AuiToolBar}. + + :param `pos`: the tool position in the toolbar. + + :returns: a pointer to a L{AuiToolBarItem} if a tool is found, or ``None`` otherwise. + """ + + if pos < 0 or pos >= len(self._items): + return None + + return self._items[pos] + + + def SetToolBitmapSize(self, size): + """ + Sets the default size of each tool bitmap. The default bitmap size is + 16 by 15 pixels. + + :param `size`: the size of the bitmaps in the toolbar. + + :note: This should be called to tell the toolbar what the tool bitmap + size is. Call it before you add tools. + + :note: Note that this is the size of the bitmap you pass to L{AddTool}, + and not the eventual size of the tool button. + + :todo: Add `wx.ToolBar` compatibility, actually implementing this method. + """ + + # TODO: wx.ToolBar compatibility + pass + + + def GetToolBitmapSize(self): + """ + Returns the size of bitmap that the toolbar expects to have. The default + bitmap size is 16 by 15 pixels. + + :note: Note that this is the size of the bitmap you pass to L{AddTool}, + and not the eventual size of the tool button. + + :todo: Add `wx.ToolBar` compatibility, actually implementing this method. + """ + + # TODO: wx.ToolBar compatibility + return wx.Size(16, 15) + + + def SetToolProportion(self, tool_id, proportion): + """ + Sets the tool proportion in the toolbar. + + :param `tool_id`: the L{AuiToolBarItem} identifier; + :param `proportion`: the tool proportion in the toolbar. + """ + + item = self.FindTool(tool_id) + if not item: + return + + item.proportion = proportion + + + def GetToolProportion(self, tool_id): + """ + Returns the tool proportion in the toolbar. + + :param `tool_id`: the L{AuiToolBarItem} identifier. + """ + + item = self.FindTool(tool_id) + if not item: + return + + return item.proportion + + + def SetToolSeparation(self, separation): + """ + Sets the separator size for the toolbar. + + :param `separation`: the separator size in pixels. + """ + + if self._art: + self._art.SetElementSize(AUI_TBART_SEPARATOR_SIZE, separation) + + + def GetToolSeparation(self): + """ Returns the separator size for the toolbar, in pixels. """ + + if self._art: + return self._art.GetElementSize(AUI_TBART_SEPARATOR_SIZE) + + return 5 + + + def SetToolDropDown(self, tool_id, dropdown): + """ + Assigns a drop down window menu to the toolbar item. + + :param `tool_id`: the L{AuiToolBarItem} identifier; + :param `dropdown`: whether to assign a drop down menu or not. + """ + + item = self.FindTool(tool_id) + if not item: + return + + item.dropdown = dropdown + + + def GetToolDropDown(self, tool_id): + """ + Returns whether the toolbar item identified by `tool_id` has an associated + drop down window menu or not. + + :param `tool_id`: the L{AuiToolBarItem} identifier. + """ + + item = self.FindTool(tool_id) + if not item: + return + + return item.dropdown + + + def SetToolSticky(self, tool_id, sticky): + """ + Sets the toolbar item as sticky or non-sticky. + + :param `tool_id`: the L{AuiToolBarItem} identifier; + :param `sticky`: whether the tool should be sticky or not. + """ + + # ignore separators + if tool_id == -1: + return + + item = self.FindTool(tool_id) + if not item: + return + + if item.sticky == sticky: + return + + item.sticky = sticky + + self.Refresh(False) + self.Update() + + + def GetToolSticky(self, tool_id): + """ + Returns whether the toolbar item identified by `tool_id` has a sticky + behaviour or not. + + :param `tool_id`: the L{AuiToolBarItem} identifier. + """ + + item = self.FindTool(tool_id) + if not item: + return + + return item.sticky + + + def SetToolBorderPadding(self, padding): + """ + Sets the padding between the tool border and the label. + + :param `padding`: the padding in pixels. + """ + + self._tool_border_padding = padding + + + def GetToolBorderPadding(self): + """ Returns the padding between the tool border and the label, in pixels. """ + + return self._tool_border_padding + + + def SetToolTextOrientation(self, orientation): + """ + Sets the label orientation for the toolbar items. + + :param `orientation`: the L{AuiToolBarItem} label orientation. + """ + + self._tool_text_orientation = orientation + + if self._art: + self._art.SetTextOrientation(orientation) + + + def GetToolTextOrientation(self): + """ Returns the label orientation for the toolbar items. """ + + return self._tool_text_orientation + + + def SetToolOrientation(self, orientation): + """ + Sets the tool orientation for the toolbar items. + + :param `orientation`: the L{AuiToolBarItem} orientation. + """ + + self._tool_orientation = orientation + if self._art: + self._art.SetOrientation(orientation) + + + def GetToolOrientation(self): + """ Returns the orientation for the toolbar items. """ + + return self._tool_orientation + + + def SetToolPacking(self, packing): + """ + Sets the value used for spacing tools. The default value is 1 pixel. + + :param `packing`: the value for packing. + """ + + self._tool_packing = packing + + + def GetToolPacking(self): + """ Returns the value used for spacing tools. The default value is 1 pixel. """ + + return self._tool_packing + + + def SetOrientation(self, orientation): + """ + Sets the toolbar orientation. + + :param `orientation`: either ``wx.VERTICAL`` or ``wx.HORIZONTAL``. + + :note: This can be temporarily overridden by L{AuiManager} when floating and + docking a L{AuiToolBar}. + """ + + pass + + + def SetMargins(self, left=-1, right=-1, top=-1, bottom=-1): + """ + Set the values to be used as margins for the toolbar. + + :param `left`: the left toolbar margin; + :param `right`: the right toolbar margin; + :param `top`: the top toolbar margin; + :param `bottom`: the bottom toolbar margin. + """ + + if left != -1: + self._left_padding = left + if right != -1: + self._right_padding = right + if top != -1: + self._top_padding = top + if bottom != -1: + self._bottom_padding = bottom + + + def SetMarginsSize(self, size): + """ + Set the values to be used as margins for the toolbar. + + :param `size`: the margin size (an instance of `wx.Size`). + """ + + self.SetMargins(size.x, size.x, size.y, size.y) + + + def SetMarginsXY(self, x, y): + """ + Set the values to be used as margins for the toolbar. + + :param `x`: left margin, right margin and inter-tool separation value; + :param `y`: top margin, bottom margin and inter-tool separation value. + """ + + self.SetMargins(x, x, y, y) + + + def GetGripperVisible(self): + """ Returns whether the toolbar gripper is visible or not. """ + + return self._gripper_visible + + + def SetGripperVisible(self, visible): + """ + Sets whether the toolbar gripper is visible or not. + + :param `visible`: ``True`` for a visible gripper, ``False`` otherwise. + """ + + self._gripper_visible = visible + if visible: + self._agwStyle |= AUI_TB_GRIPPER + else: + self._agwStyle &= ~AUI_TB_GRIPPER + + self.Realize() + self.Refresh(False) + + + def GetOverflowVisible(self): + """ Returns whether the overflow button is visible or not. """ + + return self._overflow_visible + + + def SetOverflowVisible(self, visible): + """ + Sets whether the overflow button is visible or not. + + :param `visible`: ``True`` for a visible overflow button, ``False`` otherwise. + """ + + self._overflow_visible = visible + if visible: + self._agwStyle |= AUI_TB_OVERFLOW + else: + self._agwStyle &= ~AUI_TB_OVERFLOW + + self.Refresh(False) + + + def SetFont(self, font): + """ + Sets the L{AuiToolBar} font. + + :param `font`: a `wx.Font` object. + + :note: Overridden from `wx.PyControl`. + """ + + res = wx.PyControl.SetFont(self, font) + + if self._art: + self._art.SetFont(font) + + return res + + + def SetHoverItem(self, pitem): + """ + Sets a toolbar item to be currently hovered by the mouse. + + :param `pitem`: an instance of L{AuiToolBarItem}. + """ + + former_hover = None + + for item in self._items: + + if item.state & AUI_BUTTON_STATE_HOVER: + former_hover = item + + item.state &= ~AUI_BUTTON_STATE_HOVER + + if pitem: + pitem.state |= AUI_BUTTON_STATE_HOVER + + if former_hover != pitem: + self.Refresh(False) + self.Update() + + + def SetPressedItem(self, pitem): + """ + Sets a toolbar item to be currently in a "pressed" state. + + :param `pitem`: an instance of L{AuiToolBarItem}. + """ + + former_item = None + + for item in self._items: + + if item.state & AUI_BUTTON_STATE_PRESSED: + former_item = item + + item.state &= ~AUI_BUTTON_STATE_PRESSED + + if pitem: + pitem.state &= ~AUI_BUTTON_STATE_HOVER + pitem.state |= AUI_BUTTON_STATE_PRESSED + + if former_item != pitem: + self.Refresh(False) + self.Update() + + + def RefreshOverflowState(self): + """ Refreshes the overflow button. """ + + if not self._overflow_sizer_item: + self._overflow_state = 0 + return + + overflow_state = 0 + overflow_rect = self.GetOverflowRect() + + # find out the mouse's current position + pt = wx.GetMousePosition() + pt = self.ScreenToClient(pt) + + # find out if the mouse cursor is inside the dropdown rectangle + if overflow_rect.Contains((pt.x, pt.y)): + + if _VERSION_STRING < "2.9": + leftDown = wx.GetMouseState().LeftDown() + else: + leftDown = wx.GetMouseState().LeftIsDown() + + if leftDown: + overflow_state = AUI_BUTTON_STATE_PRESSED + else: + overflow_state = AUI_BUTTON_STATE_HOVER + + if overflow_state != self._overflow_state: + self._overflow_state = overflow_state + self.Refresh(False) + self.Update() + + self._overflow_state = overflow_state + + + def ToggleTool(self, tool_id, state): + """ + Toggles a tool on or off. This does not cause any event to get emitted. + + :param `tool_id`: tool in question. + :param `state`: if ``True``, toggles the tool on, otherwise toggles it off. + + :note: This only applies to a tool that has been specified as a toggle tool. + """ + + tool = self.FindTool(tool_id) + + if tool: + if tool.kind not in [ITEM_CHECK, ITEM_RADIO]: + return + + if tool.kind == ITEM_RADIO: + idx = self.GetToolIndex(tool_id) + if idx >= 0 and idx < len(self._items): + for i in xrange(idx, len(self._items)): + tool = self.FindToolByIndex(i) + if tool.kind != ITEM_RADIO: + break + tool.state &= ~AUI_BUTTON_STATE_CHECKED + + for i in xrange(idx, -1, -1): + tool = self.FindToolByIndex(i) + if tool.kind != ITEM_RADIO: + break + tool.state &= ~AUI_BUTTON_STATE_CHECKED + + tool = self.FindTool(tool_id) + tool.state |= AUI_BUTTON_STATE_CHECKED + else: + if state == True: + tool.state |= AUI_BUTTON_STATE_CHECKED + else: + tool.state &= ~AUI_BUTTON_STATE_CHECKED + + + def GetToolToggled(self, tool_id): + """ + Returns whether a tool is toggled or not. + + :param `tool_id`: the toolbar item identifier. + + :note: This only applies to a tool that has been specified as a toggle tool. + """ + + tool = self.FindTool(tool_id) + + if tool: + if tool.kind not in [ITEM_CHECK, ITEM_RADIO]: + return False + + return (tool.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] + + return False + + + def EnableTool(self, tool_id, state): + """ + Enables or disables the tool. + + :param `tool_id`: identifier for the tool to enable or disable. + :param `state`: if ``True``, enables the tool, otherwise disables it. + """ + + tool = self.FindTool(tool_id) + + if tool: + + if state == True: + tool.state &= ~AUI_BUTTON_STATE_DISABLED + else: + tool.state |= AUI_BUTTON_STATE_DISABLED + + + def GetToolEnabled(self, tool_id): + """ + Returns whether the tool identified by `tool_id` is enabled or not. + + :param `tool_id`: the tool identifier. + """ + + tool = self.FindTool(tool_id) + + if tool: + return (tool.state & AUI_BUTTON_STATE_DISABLED and [False] or [True])[0] + + return False + + + def GetToolLabel(self, tool_id): + """ + Returns the tool label for the tool identified by `tool_id`. + + :param `tool_id`: the tool identifier. + """ + + tool = self.FindTool(tool_id) + if not tool: + return "" + + return tool.label + + + def SetToolLabel(self, tool_id, label): + """ + Sets the tool label for the tool identified by `tool_id`. + + :param `tool_id`: the tool identifier; + :param `label`: the new toolbar item label. + """ + + tool = self.FindTool(tool_id) + if tool: + tool.label = label + + + def GetToolBitmap(self, tool_id): + """ + Returns the tool bitmap for the tool identified by `tool_id`. + + :param `tool_id`: the tool identifier. + """ + + tool = self.FindTool(tool_id) + if not tool: + return wx.NullBitmap + + return tool.bitmap + + + def SetToolBitmap(self, tool_id, bitmap): + """ + Sets the tool bitmap for the tool identified by `tool_id`. + + :param `tool_id`: the tool identifier; + :param `bitmap`: the new bitmap for the toolbar item (an instance of `wx.Bitmap`). + """ + + tool = self.FindTool(tool_id) + if tool: + tool.bitmap = bitmap + + + def SetToolNormalBitmap(self, tool_id, bitmap): + """ + Sets the tool bitmap for the tool identified by `tool_id`. + + :param `tool_id`: the tool identifier; + :param `bitmap`: the new bitmap for the toolbar item (an instance of `wx.Bitmap`). + """ + + self.SetToolBitmap(tool_id, bitmap) + + + def SetToolDisabledBitmap(self, tool_id, bitmap): + """ + Sets the tool disabled bitmap for the tool identified by `tool_id`. + + :param `tool_id`: the tool identifier; + :param `bitmap`: the new disabled bitmap for the toolbar item (an instance of `wx.Bitmap`). + """ + + tool = self.FindTool(tool_id) + if tool: + tool.disabled_bitmap = bitmap + + + def GetToolShortHelp(self, tool_id): + """ + Returns the short help for the given tool. + + :param `tool_id`: the tool identifier. + """ + + tool = self.FindTool(tool_id) + if not tool: + return "" + + return tool.short_help + + + def SetToolShortHelp(self, tool_id, help_string): + """ + Sets the short help for the given tool. + + :param `tool_id`: the tool identifier; + :param `help_string`: the string for the short help. + """ + + tool = self.FindTool(tool_id) + if tool: + tool.short_help = help_string + + + def GetToolLongHelp(self, tool_id): + """ + Returns the long help for the given tool. + + :param `tool_id`: the tool identifier. + """ + + tool = self.FindTool(tool_id) + if not tool: + return "" + + return tool.long_help + + + def SetToolAlignment(self, alignment=wx.EXPAND): + """ + This sets the alignment for all of the tools within the + toolbar (only has an effect when the toolbar is expanded). + + :param `alignment`: `wx.Sizer` alignment value + (``wx.ALIGN_CENTER_HORIZONTAL`` or ``wx.ALIGN_CENTER_VERTICAL``). + """ + + self._tool_alignment = alignment + + + + def SetToolLongHelp(self, tool_id, help_string): + """ + Sets the long help for the given tool. + + :param `tool_id`: the tool identifier; + :param `help_string`: the string for the long help. + """ + + tool = self.FindTool(tool_id) + if tool: + tool.long_help = help_string + + + def SetCustomOverflowItems(self, prepend, append): + """ + Sets the two lists `prepend` and `append` as custom overflow items. + + :param `prepend`: a list of L{AuiToolBarItem} to be prepended; + :param `append`: a list of L{AuiToolBarItem} to be appended. + """ + + self._custom_overflow_prepend = prepend + self._custom_overflow_append = append + + + def GetToolCount(self): + """ Returns the number of tools in the L{AuiToolBar}. """ + + return len(self._items) + + + def GetToolIndex(self, tool_id): + """ + Returns the position of the tool in the toolbar given its identifier. + + :param `tool_id`: the toolbar item identifier. + """ + + # this will prevent us from returning the index of the + # first separator in the toolbar since its id is equal to -1 + if tool_id == -1: + return wx.NOT_FOUND + + for i, item in enumerate(self._items): + if item.id == tool_id: + return i + + return wx.NOT_FOUND + + + def GetToolPos(self, tool_id): + """ + Returns the position of the tool in the toolbar given its identifier. + + :param `tool_id`: the toolbar item identifier. + """ + + return self.GetToolIndex(tool_id) + + + def GetToolFitsByIndex(self, tool_id): + """ + Returns whether the tool identified by `tool_id` fits into the toolbar or not. + + :param `tool_id`: the toolbar item identifier. + """ + + if tool_id < 0 or tool_id >= len(self._items): + return False + + if not self._items[tool_id].sizer_item: + return False + + cli_w, cli_h = self.GetClientSize() + rect = self._items[tool_id].sizer_item.GetRect() + + if self._agwStyle & AUI_TB_VERTICAL: + # take the dropdown size into account + if self._overflow_visible: + cli_h -= self._overflow_sizer_item.GetSize().y + + if rect.y+rect.height < cli_h: + return True + + else: + + # take the dropdown size into account + if self._overflow_visible: + cli_w -= self._overflow_sizer_item.GetSize().x + + if rect.x+rect.width < cli_w: + return True + + return False + + + def GetToolFits(self, tool_id): + """ + Returns whether the tool identified by `tool_id` fits into the toolbar or not. + + :param `tool_id`: the toolbar item identifier. + """ + + return self.GetToolFitsByIndex(self.GetToolIndex(tool_id)) + + + def GetToolRect(self, tool_id): + """ + Returns the toolbar item rectangle + + :param `tool_id`: the toolbar item identifier. + """ + + tool = self.FindTool(tool_id) + if tool and tool.sizer_item: + return tool.sizer_item.GetRect() + + return wx.Rect() + + + def GetToolBarFits(self): + """ Returns whether the L{AuiToolBar} size fits in a specified size. """ + + if len(self._items) == 0: + # empty toolbar always 'fits' + return True + + # entire toolbar content fits if the last tool fits + return self.GetToolFitsByIndex(len(self._items) - 1) + + + def Realize(self): + """ Realizes the toolbar. This function should be called after you have added tools. """ + + dc = wx.ClientDC(self) + + if not dc.IsOk(): + return False + + horizontal = True + if self._agwStyle & AUI_TB_VERTICAL: + horizontal = False + + # create the new sizer to add toolbar elements to + sizer = wx.BoxSizer((horizontal and [wx.HORIZONTAL] or [wx.VERTICAL])[0]) + + # add gripper area + separator_size = self._art.GetElementSize(AUI_TBART_SEPARATOR_SIZE) + gripper_size = self._art.GetElementSize(AUI_TBART_GRIPPER_SIZE) + + if gripper_size > 0 and self._gripper_visible: + if horizontal: + self._gripper_sizer_item = sizer.Add((gripper_size, 1), 0, wx.EXPAND) + else: + self._gripper_sizer_item = sizer.Add((1, gripper_size), 0, wx.EXPAND) + else: + self._gripper_sizer_item = None + + # add "left" padding + if self._left_padding > 0: + if horizontal: + sizer.Add((self._left_padding, 1)) + else: + sizer.Add((1, self._left_padding)) + + count = len(self._items) + for i, item in enumerate(self._items): + + sizer_item = None + kind = item.kind + + if kind == ITEM_LABEL: + + size = self._art.GetLabelSize(dc, self, item) + sizer_item = sizer.Add((size.x + (self._tool_border_padding*2), + size.y + (self._tool_border_padding*2)), + item.proportion, + item.alignment) + if i+1 < count: + sizer.AddSpacer(self._tool_packing) + + + elif kind in [ITEM_CHECK, ITEM_NORMAL, ITEM_RADIO]: + + size = self._art.GetToolSize(dc, self, item) + sizer_item = sizer.Add((size.x + (self._tool_border_padding*2), + size.y + (self._tool_border_padding*2)), + 0, + item.alignment) + # add tool packing + if i+1 < count: + sizer.AddSpacer(self._tool_packing) + + elif kind == ITEM_SEPARATOR: + + if horizontal: + sizer_item = sizer.Add((separator_size, 1), 0, wx.EXPAND) + else: + sizer_item = sizer.Add((1, separator_size), 0, wx.EXPAND) + + # add tool packing + if i+1 < count: + sizer.AddSpacer(self._tool_packing) + + elif kind == ITEM_SPACER: + + if item.proportion > 0: + sizer_item = sizer.AddStretchSpacer(item.proportion) + else: + sizer_item = sizer.Add((item.spacer_pixels, 1)) + + elif kind == ITEM_CONTROL: + + vert_sizer = wx.BoxSizer(wx.VERTICAL) + vert_sizer.AddStretchSpacer(1) + ctrl_sizer_item = vert_sizer.Add(item.window, 0, wx.EXPAND) + vert_sizer.AddStretchSpacer(1) + + if self._agwStyle & AUI_TB_TEXT and \ + self._tool_text_orientation == AUI_TBTOOL_TEXT_BOTTOM and \ + item.GetLabel() != "": + + s = self.GetLabelSize(item.GetLabel()) + vert_sizer.Add((1, s.y)) + + sizer_item = sizer.Add(vert_sizer, item.proportion, wx.EXPAND) + min_size = item.min_size + + # proportional items will disappear from the toolbar if + # their min width is not set to something really small + if item.proportion != 0: + min_size.x = 1 + + if min_size.IsFullySpecified(): + sizer.SetItemMinSize(vert_sizer, min_size) + vert_sizer.SetItemMinSize(item.window, min_size) + + # add tool packing + if i+1 < count: + sizer.AddSpacer(self._tool_packing) + + item.sizer_item = sizer_item + + + # add "right" padding + if self._right_padding > 0: + if horizontal: + sizer.Add((self._right_padding, 1)) + else: + sizer.Add((1, self._right_padding)) + + # add drop down area + self._overflow_sizer_item = None + + if self._agwStyle & AUI_TB_OVERFLOW: + + overflow_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) + if overflow_size > 0 and self._overflow_visible: + + if horizontal: + self._overflow_sizer_item = sizer.Add((overflow_size, 1), 0, wx.EXPAND) + else: + self._overflow_sizer_item = sizer.Add((1, overflow_size), 0, wx.EXPAND) + + else: + + self._overflow_sizer_item = None + + # the outside sizer helps us apply the "top" and "bottom" padding + outside_sizer = wx.BoxSizer((horizontal and [wx.VERTICAL] or [wx.HORIZONTAL])[0]) + + # add "top" padding + if self._top_padding > 0: + + if horizontal: + outside_sizer.Add((1, self._top_padding)) + else: + outside_sizer.Add((self._top_padding, 1)) + + # add the sizer that contains all of the toolbar elements + outside_sizer.Add(sizer, 1, self._tool_alignment) + + # add "bottom" padding + if self._bottom_padding > 0: + + if horizontal: + outside_sizer.Add((1, self._bottom_padding)) + else: + outside_sizer.Add((self._bottom_padding, 1)) + + del self._sizer # remove old sizer + self._sizer = outside_sizer + self.SetSizer(outside_sizer) + + # calculate the rock-bottom minimum size + for item in self._items: + + if item.sizer_item and item.proportion > 0 and item.min_size.IsFullySpecified(): + item.sizer_item.SetMinSize((0, 0)) + + self._absolute_min_size = self._sizer.GetMinSize() + + # reset the min sizes to what they were + for item in self._items: + + if item.sizer_item and item.proportion > 0 and item.min_size.IsFullySpecified(): + item.sizer_item.SetMinSize(item.min_size) + + # set control size + size = self._sizer.GetMinSize() + self.SetMinSize(size) + self._minWidth = size.x + self._minHeight = size.y + + if self._agwStyle & AUI_TB_NO_AUTORESIZE == 0: + + cur_size = self.GetClientSize() + new_size = self.GetMinSize() + + if new_size != cur_size: + + self.SetClientSize(new_size) + + else: + + self._sizer.SetDimension(0, 0, cur_size.x, cur_size.y) + + else: + + cur_size = self.GetClientSize() + self._sizer.SetDimension(0, 0, cur_size.x, cur_size.y) + + self.Refresh(False) + return True + + + def GetOverflowState(self): + """ Returns the state of the overflow button. """ + + return self._overflow_state + + + def GetOverflowRect(self): + """ Returns the rectangle of the overflow button. """ + + cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) + overflow_rect = wx.Rect(*self._overflow_sizer_item.GetRect()) + overflow_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) + + if self._agwStyle & AUI_TB_VERTICAL: + + overflow_rect.y = cli_rect.height - overflow_size + overflow_rect.x = 0 + overflow_rect.width = cli_rect.width + overflow_rect.height = overflow_size + + else: + + overflow_rect.x = cli_rect.width - overflow_size + overflow_rect.y = 0 + overflow_rect.width = overflow_size + overflow_rect.height = cli_rect.height + + return overflow_rect + + + def GetLabelSize(self, label): + """ + Returns the standard size of a toolbar item. + + :param `label`: a test label. + """ + + dc = wx.ClientDC(self) + dc.SetFont(self._font) + + return GetLabelSize(dc, label, self._tool_orientation != AUI_TBTOOL_HORIZONTAL) + + + def GetAuiManager(self): + """ Returns the L{AuiManager} which manages the toolbar. """ + + try: + return self._auiManager + except AttributeError: + return False + + + def SetAuiManager(self, auiManager): + """ Sets the L{AuiManager} which manages the toolbar. """ + + self._auiManager = auiManager + + + def DoIdleUpdate(self): + """ Updates the toolbar during idle times. """ + + handler = self.GetEventHandler() + if not handler: + return + + need_refresh = False + + for item in self._items: + + if item.id == -1: + continue + + evt = wx.UpdateUIEvent(item.id) + evt.SetEventObject(self) + + if handler.ProcessEvent(evt): + + if evt.GetSetEnabled(): + + if item.window: + is_enabled = item.window.IsEnabled() + else: + is_enabled = (item.state & AUI_BUTTON_STATE_DISABLED and [False] or [True])[0] + + new_enabled = evt.GetEnabled() + if new_enabled != is_enabled: + + if item.window: + item.window.Enable(new_enabled) + else: + if new_enabled: + item.state &= ~AUI_BUTTON_STATE_DISABLED + else: + item.state |= AUI_BUTTON_STATE_DISABLED + + need_refresh = True + + if evt.GetSetChecked(): + + # make sure we aren't checking an item that can't be + if item.kind != ITEM_CHECK and item.kind != ITEM_RADIO: + continue + + is_checked = (item.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] + new_checked = evt.GetChecked() + + if new_checked != is_checked: + + if new_checked: + item.state |= AUI_BUTTON_STATE_CHECKED + else: + item.state &= ~AUI_BUTTON_STATE_CHECKED + + need_refresh = True + + if need_refresh: + self.Refresh(False) + + + def OnSize(self, event): + """ + Handles the ``wx.EVT_SIZE`` event for L{AuiToolBar}. + + :param `event`: a `wx.SizeEvent` event to be processed. + """ + + x, y = self.GetClientSize() + realize = False + + if x > y: + self.SetOrientation(wx.HORIZONTAL) + else: + self.SetOrientation(wx.VERTICAL) + + if (x >= y and self._absolute_min_size.x > x) or (y > x and self._absolute_min_size.y > y): + + # hide all flexible items + for item in self._items: + if item.sizer_item and item.proportion > 0 and item.sizer_item.IsShown(): + item.sizer_item.Show(False) + item.sizer_item.SetProportion(0) + + if self._originalStyle & AUI_TB_OVERFLOW: + if not self.GetOverflowVisible(): + self.SetOverflowVisible(True) + realize = True + + else: + + if self._originalStyle & AUI_TB_OVERFLOW and not self._custom_overflow_append and \ + not self._custom_overflow_prepend: + if self.GetOverflowVisible(): + self.SetOverflowVisible(False) + realize = True + + # show all flexible items + for item in self._items: + if item.sizer_item and item.proportion > 0 and not item.sizer_item.IsShown(): + item.sizer_item.Show(True) + item.sizer_item.SetProportion(item.proportion) + + self._sizer.SetDimension(0, 0, x, y) + + if realize: + self.Realize() + else: + self.Refresh(False) + + self.Update() + + + def DoSetSize(self, x, y, width, height, sizeFlags=wx.SIZE_AUTO): + """ + Sets the position and size of the window in pixels. The `sizeFlags` + parameter indicates the interpretation of the other params if they are + equal to -1. + + :param `x`: the window `x` position; + :param `y`: the window `y` position; + :param `width`: the window width; + :param `height`: the window height; + :param `sizeFlags`: may have one of this bit set: + + =================================== ====================================== + Size Flags Description + =================================== ====================================== + ``wx.SIZE_AUTO`` A -1 indicates that a class-specific default should be used. + ``wx.SIZE_AUTO_WIDTH`` A -1 indicates that a class-specific default should be used for the width. + ``wx.SIZE_AUTO_HEIGHT`` A -1 indicates that a class-specific default should be used for the height. + ``wx.SIZE_USE_EXISTING`` Existing dimensions should be used if -1 values are supplied. + ``wx.SIZE_ALLOW_MINUS_ONE`` Allow dimensions of -1 and less to be interpreted as real dimensions, not default values. + ``wx.SIZE_FORCE`` Normally, if the position and the size of the window are already the same as the parameters of this function, nothing is done. but with this flag a window resize may be forced even in this case (supported in wx 2.6.2 and later and only implemented for MSW and ignored elsewhere currently) + =================================== ====================================== + + :note: Overridden from `wx.PyControl`. + """ + + parent_size = self.GetParent().GetClientSize() + if x + width > parent_size.x: + width = max(0, parent_size.x - x) + if y + height > parent_size.y: + height = max(0, parent_size.y - y) + + wx.PyControl.DoSetSize(self, x, y, width, height, sizeFlags) + + + def OnIdle(self, event): + """ + Handles the ``wx.EVT_IDLE`` event for L{AuiToolBar}. + + :param `event`: a `wx.IdleEvent` event to be processed. + """ + + self.DoIdleUpdate() + event.Skip() + + + def DoGetBestSize(self): + """ + Gets the size which best suits the window: for a control, it would be the + minimal size which doesn't truncate the control, for a panel - the same + size as it would have after a call to `Fit()`. + + :note: Overridden from `wx.PyControl`. + """ + + return self._absolute_min_size + + + def OnPaint(self, event): + """ + Handles the ``wx.EVT_PAINT`` event for L{AuiToolBar}. + + :param `event`: a `wx.PaintEvent` event to be processed. + """ + + dc = wx.AutoBufferedPaintDC(self) + cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) + + horizontal = True + if self._agwStyle & AUI_TB_VERTICAL: + horizontal = False + + if self._agwStyle & AUI_TB_PLAIN_BACKGROUND: + self._art.DrawPlainBackground(dc, self, cli_rect) + else: + self._art.DrawBackground(dc, self, cli_rect, horizontal) + + gripper_size = self._art.GetElementSize(AUI_TBART_GRIPPER_SIZE) + dropdown_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) + + # paint the gripper + if gripper_size > 0 and self._gripper_sizer_item: + gripper_rect = wx.Rect(*self._gripper_sizer_item.GetRect()) + if horizontal: + gripper_rect.width = gripper_size + else: + gripper_rect.height = gripper_size + + self._art.DrawGripper(dc, self, gripper_rect) + + # calculated how far we can draw items + if horizontal: + last_extent = cli_rect.width + else: + last_extent = cli_rect.height + + if self._overflow_visible: + last_extent -= dropdown_size + + # paint each individual tool + for item in self._items: + + if not item.sizer_item: + continue + + item_rect = wx.Rect(*item.sizer_item.GetRect()) + + if (horizontal and item_rect.x + item_rect.width >= last_extent) or \ + (not horizontal and item_rect.y + item_rect.height >= last_extent): + + break + + if item.kind == ITEM_SEPARATOR: + # draw a separator + self._art.DrawSeparator(dc, self, item_rect) + + elif item.kind == ITEM_LABEL: + # draw a text label only + self._art.DrawLabel(dc, self, item, item_rect) + + elif item.kind == ITEM_NORMAL: + # draw a regular button or dropdown button + if not item.dropdown: + self._art.DrawButton(dc, self, item, item_rect) + else: + self._art.DrawDropDownButton(dc, self, item, item_rect) + + elif item.kind == ITEM_CHECK: + # draw a regular toggle button or a dropdown one + if not item.dropdown: + self._art.DrawButton(dc, self, item, item_rect) + else: + self._art.DrawDropDownButton(dc, self, item, item_rect) + + elif item.kind == ITEM_RADIO: + # draw a toggle button + self._art.DrawButton(dc, self, item, item_rect) + + elif item.kind == ITEM_CONTROL: + # draw the control's label + self._art.DrawControlLabel(dc, self, item, item_rect) + + # fire a signal to see if the item wants to be custom-rendered + self.OnCustomRender(dc, item, item_rect) + + # paint the overflow button + if dropdown_size > 0 and self._overflow_sizer_item: + dropdown_rect = self.GetOverflowRect() + self._art.DrawOverflowButton(dc, self, dropdown_rect, self._overflow_state) + + + def OnEraseBackground(self, event): + """ + Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiToolBar}. + + :param `event`: a `wx.EraseEvent` event to be processed. + + :note: This is intentionally empty, to reduce flicker. + """ + + pass + + + def OnLeftDown(self, event): + """ + Handles the ``wx.EVT_LEFT_DOWN`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) + self.StopPreviewTimer() + + if self._gripper_sizer_item: + + gripper_rect = wx.Rect(*self._gripper_sizer_item.GetRect()) + if gripper_rect.Contains(event.GetPosition()): + + # find aui manager + manager = self.GetAuiManager() + if not manager: + return + + x_drag_offset = event.GetX() - gripper_rect.GetX() + y_drag_offset = event.GetY() - gripper_rect.GetY() + + clientPt = wx.Point(*event.GetPosition()) + screenPt = self.ClientToScreen(clientPt) + managedWindow = manager.GetManagedWindow() + managerClientPt = managedWindow.ScreenToClient(screenPt) + + # gripper was clicked + manager.OnGripperClicked(self, managerClientPt, wx.Point(x_drag_offset, y_drag_offset)) + return + + if self._overflow_sizer_item: + overflow_rect = self.GetOverflowRect() + + if self._art and self._overflow_visible and overflow_rect.Contains(event.GetPosition()): + + e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, -1) + e.SetEventObject(self) + e.SetToolId(-1) + e.SetClickPoint(event.GetPosition()) + processed = self.ProcessEvent(e) + + if processed: + self.DoIdleUpdate() + else: + overflow_items = [] + + # add custom overflow prepend items, if any + count = len(self._custom_overflow_prepend) + for i in xrange(count): + overflow_items.append(self._custom_overflow_prepend[i]) + + # only show items that don't fit in the dropdown + count = len(self._items) + for i in xrange(count): + + if not self.GetToolFitsByIndex(i): + overflow_items.append(self._items[i]) + + # add custom overflow append items, if any + count = len(self._custom_overflow_append) + for i in xrange(count): + overflow_items.append(self._custom_overflow_append[i]) + + res = self._art.ShowDropDown(self, overflow_items) + self._overflow_state = 0 + self.Refresh(False) + if res != -1: + e = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, res) + e.SetEventObject(self) + if not self.GetParent().ProcessEvent(e): + tool = self.FindTool(res) + if tool: + state = (tool.state & AUI_BUTTON_STATE_CHECKED and [True] or [False])[0] + self.ToggleTool(res, not state) + + return + + self._dragging = False + self._action_pos = wx.Point(*event.GetPosition()) + self._action_item = self.FindToolForPosition(*event.GetPosition()) + + if self._action_item: + + if self._action_item.state & AUI_BUTTON_STATE_DISABLED: + + self._action_pos = wx.Point(-1, -1) + self._action_item = None + return + + self.SetPressedItem(self._action_item) + + # fire the tool dropdown event + e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, self._action_item.id) + e.SetEventObject(self) + e.SetToolId(self._action_item.id) + e.SetDropDownClicked(False) + + mouse_x, mouse_y = event.GetX(), event.GetY() + rect = wx.Rect(*self._action_item.sizer_item.GetRect()) + + if self._action_item.dropdown: + if (self._action_item.orientation == AUI_TBTOOL_HORIZONTAL and \ + mouse_x >= (rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1) and \ + mouse_x < (rect.x+rect.width)) or \ + (self._action_item.orientation != AUI_TBTOOL_HORIZONTAL and \ + mouse_y >= (rect.y+rect.height-BUTTON_DROPDOWN_WIDTH-1) and \ + mouse_y < (rect.y+rect.height)): + + e.SetDropDownClicked(True) + + e.SetClickPoint(event.GetPosition()) + e.SetItemRect(rect) + self.ProcessEvent(e) + self.DoIdleUpdate() + + + def OnLeftUp(self, event): + """ + Handles the ``wx.EVT_LEFT_UP`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + self.SetPressedItem(None) + + hit_item = self.FindToolForPosition(*event.GetPosition()) + + if hit_item and not hit_item.state & AUI_BUTTON_STATE_DISABLED: + self.SetHoverItem(hit_item) + + if self._dragging: + # reset drag and drop member variables + self._dragging = False + self._action_pos = wx.Point(-1, -1) + self._action_item = None + + else: + + if self._action_item and hit_item == self._action_item: + self.SetToolTipString("") + + if hit_item.kind in [ITEM_CHECK, ITEM_RADIO]: + toggle = not (self._action_item.state & AUI_BUTTON_STATE_CHECKED) + self.ToggleTool(self._action_item.id, toggle) + + # repaint immediately + self.Refresh(False) + self.Update() + + e = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, self._action_item.id) + e.SetEventObject(self) + e.SetInt(toggle) + self._action_pos = wx.Point(-1, -1) + self._action_item = None + + self.ProcessEvent(e) + self.DoIdleUpdate() + + else: + + if self._action_item.id == ID_RESTORE_FRAME: + # find aui manager + manager = self.GetAuiManager() + + if not manager: + return + + pane = manager.GetPane(self) + e = framemanager.AuiManagerEvent(framemanager.wxEVT_AUI_PANE_MIN_RESTORE) + + e.SetManager(manager) + e.SetPane(pane) + + manager.ProcessEvent(e) + self.DoIdleUpdate() + + else: + + e = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, self._action_item.id) + e.SetEventObject(self) + self.ProcessEvent(e) + self.DoIdleUpdate() + + # reset drag and drop member variables + self._dragging = False + self._action_pos = wx.Point(-1, -1) + self._action_item = None + + + def OnRightDown(self, event): + """ + Handles the ``wx.EVT_RIGHT_DOWN`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) + + if self._gripper_sizer_item: + gripper_rect = self._gripper_sizer_item.GetRect() + if gripper_rect.Contains(event.GetPosition()): + return + + if self._overflow_sizer_item: + + dropdown_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) + if dropdown_size > 0 and event.GetX() > cli_rect.width - dropdown_size and \ + event.GetY() >= 0 and event.GetY() < cli_rect.height and self._art: + return + + self._action_pos = wx.Point(*event.GetPosition()) + self._action_item = self.FindToolForPosition(*event.GetPosition()) + + if self._action_item: + if self._action_item.state & AUI_BUTTON_STATE_DISABLED: + + self._action_pos = wx.Point(-1, -1) + self._action_item = None + return + + + def OnRightUp(self, event): + """ + Handles the ``wx.EVT_RIGHT_UP`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + hit_item = self.FindToolForPosition(*event.GetPosition()) + + if self._action_item and hit_item == self._action_item: + + e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, self._action_item.id) + e.SetEventObject(self) + e.SetToolId(self._action_item.id) + e.SetClickPoint(self._action_pos) + self.ProcessEvent(e) + self.DoIdleUpdate() + + else: + + # right-clicked on the invalid area of the toolbar + e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, -1) + e.SetEventObject(self) + e.SetToolId(-1) + e.SetClickPoint(self._action_pos) + self.ProcessEvent(e) + self.DoIdleUpdate() + + # reset member variables + self._action_pos = wx.Point(-1, -1) + self._action_item = None + + + def OnMiddleDown(self, event): + """ + Handles the ``wx.EVT_MIDDLE_DOWN`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + cli_rect = wx.RectPS(wx.Point(0, 0), self.GetClientSize()) + + if self._gripper_sizer_item: + + gripper_rect = self._gripper_sizer_item.GetRect() + if gripper_rect.Contains(event.GetPosition()): + return + + if self._overflow_sizer_item: + + dropdown_size = self._art.GetElementSize(AUI_TBART_OVERFLOW_SIZE) + if dropdown_size > 0 and event.GetX() > cli_rect.width - dropdown_size and \ + event.GetY() >= 0 and event.GetY() < cli_rect.height and self._art: + return + + self._action_pos = wx.Point(*event.GetPosition()) + self._action_item = self.FindToolForPosition(*event.GetPosition()) + + if self._action_item: + if self._action_item.state & AUI_BUTTON_STATE_DISABLED: + + self._action_pos = wx.Point(-1, -1) + self._action_item = None + return + + + def OnMiddleUp(self, event): + """ + Handles the ``wx.EVT_MIDDLE_UP`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + hit_item = self.FindToolForPosition(*event.GetPosition()) + + if self._action_item and hit_item == self._action_item: + if hit_item.kind == ITEM_NORMAL: + + e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, self._action_item.id) + e.SetEventObject(self) + e.SetToolId(self._action_item.id) + e.SetClickPoint(self._action_pos) + self.ProcessEvent(e) + self.DoIdleUpdate() + + # reset member variables + self._action_pos = wx.Point(-1, -1) + self._action_item = None + + + def OnMotion(self, event): + """ + Handles the ``wx.EVT_MOTION`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + # start a drag event + if not self._dragging and self._action_item != None and self._action_pos != wx.Point(-1, -1) and \ + abs(event.GetX() - self._action_pos.x) + abs(event.GetY() - self._action_pos.y) > 5: + + self.SetToolTipString("") + self._dragging = True + + e = AuiToolBarEvent(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, self.GetId()) + e.SetEventObject(self) + e.SetToolId(self._action_item.id) + self.ProcessEvent(e) + self.DoIdleUpdate() + return + + hit_item = self.FindToolForPosition(*event.GetPosition()) + + if hit_item: + if not hit_item.state & AUI_BUTTON_STATE_DISABLED: + self.SetHoverItem(hit_item) + else: + self.SetHoverItem(None) + + else: + # no hit item, remove any hit item + self.SetHoverItem(hit_item) + + # figure out tooltips + packing_hit_item = self.FindToolForPositionWithPacking(*event.GetPosition()) + + if packing_hit_item: + + if packing_hit_item != self._tip_item: + self._tip_item = packing_hit_item + + if packing_hit_item.short_help != "": + self.StartPreviewTimer() + self.SetToolTipString(packing_hit_item.short_help) + else: + self.SetToolTipString("") + self.StopPreviewTimer() + + else: + + self.SetToolTipString("") + self._tip_item = None + self.StopPreviewTimer() + + # if we've pressed down an item and we're hovering + # over it, make sure it's state is set to pressed + if self._action_item: + + if self._action_item == hit_item: + self.SetPressedItem(self._action_item) + else: + self.SetPressedItem(None) + + # figure out the dropdown button state (are we hovering or pressing it?) + self.RefreshOverflowState() + + + def OnLeaveWindow(self, event): + """ + Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{AuiToolBar}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + self.RefreshOverflowState() + self.SetHoverItem(None) + self.SetPressedItem(None) + + self._tip_item = None + self.StopPreviewTimer() + + + def OnSetCursor(self, event): + """ + Handles the ``wx.EVT_SET_CURSOR`` event for L{AuiToolBar}. + + :param `event`: a `wx.SetCursorEvent` event to be processed. + """ + + cursor = wx.NullCursor + + if self._gripper_sizer_item: + + gripper_rect = self._gripper_sizer_item.GetRect() + if gripper_rect.Contains((event.GetX(), event.GetY())): + cursor = wx.StockCursor(wx.CURSOR_SIZING) + + event.SetCursor(cursor) + + + def OnCustomRender(self, dc, item, rect): + """ + Handles custom render for single L{AuiToolBar} items. + + :param `dc`: a `wx.DC` device context; + :param `item`: an instance of L{AuiToolBarItem}; + :param `rect`: the toolbar item rect. + + :note: This method must be overridden to provide custom rendering of items. + """ + + pass + + + def IsPaneMinimized(self): + """ Returns whether this L{AuiToolBar} contains a minimized pane tool. """ + + manager = self.GetAuiManager() + if not manager: + return False + + if manager.GetAGWFlags() & AUI_MGR_PREVIEW_MINIMIZED_PANES == 0: + # No previews here + return False + + self_name = manager.GetPane(self).name + + if not self_name.endswith("_min"): + # Wrong tool name + return False + + return self_name[0:-4] + + + def StartPreviewTimer(self): + """ Starts a timer in L{AuiManager} to slide-in/slide-out the minimized pane. """ + + self_name = self.IsPaneMinimized() + if not self_name: + return + + manager = self.GetAuiManager() + manager.StartPreviewTimer(self) + + + def StopPreviewTimer(self): + """ Stops a timer in L{AuiManager} to slide-in/slide-out the minimized pane. """ + + self_name = self.IsPaneMinimized() + if not self_name: + return + + manager = self.GetAuiManager() + manager.StopPreviewTimer() + diff --git a/autres/aui/auibook.py b/autres/aui/auibook.py new file mode 100644 index 0000000..62ae00c --- /dev/null +++ b/autres/aui/auibook.py @@ -0,0 +1,5737 @@ +""" +auibook contains a notebook control which implements many features common in +applications with dockable panes. Specifically, L{AuiNotebook} implements functionality +which allows the user to rearrange tab order via drag-and-drop, split the tab window +into many different splitter configurations, and toggle through different themes to +customize the control's look and feel. + +An effort has been made to try to maintain an API as similar to that of `wx.Notebook`. + +The default theme that is used is L{AuiDefaultTabArt}, which provides a modern, glossy +look and feel. The theme can be changed by calling L{AuiNotebook.SetArtProvider}. +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx +import types +import datetime + +from wx.lib.expando import ExpandoTextCtrl + +import framemanager +import tabart as TA + +from aui_utilities import LightColour, MakeDisabledBitmap, TabDragImage +from aui_utilities import TakeScreenShot, RescaleScreenShot + +from aui_constants import * + +# AuiNotebook events +wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_BUTTON = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_END_DRAG = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_DOWN = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_UP = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_DOWN = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_UP = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK = wx.NewEventType() + +# Define a new event for a drag cancelled +wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG = wx.NewEventType() + +# Define events for editing a tab label +wxEVT_COMMAND_AUINOTEBOOK_BEGIN_LABEL_EDIT = wx.NewEventType() +wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT = wx.NewEventType() + +# Create event binders +EVT_AUINOTEBOOK_PAGE_CLOSE = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, 1) +""" A tab in `AuiNotebook` is being closed. Can be vetoed by calling `Veto()`. """ +EVT_AUINOTEBOOK_PAGE_CLOSED = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, 1) +""" A tab in `AuiNotebook` has been closed. """ +EVT_AUINOTEBOOK_PAGE_CHANGED = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, 1) +""" The page selection was changed. """ +EVT_AUINOTEBOOK_PAGE_CHANGING = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, 1) +""" The page selection is being changed. """ +EVT_AUINOTEBOOK_BUTTON = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, 1) +""" The user clicked on a button in the `AuiNotebook` tab area. """ +EVT_AUINOTEBOOK_BEGIN_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, 1) +""" A drag-and-drop operation on a notebook tab has started. """ +EVT_AUINOTEBOOK_END_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, 1) +""" A drag-and-drop operation on a notebook tab has finished. """ +EVT_AUINOTEBOOK_DRAG_MOTION = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, 1) +""" A drag-and-drop operation on a notebook tab is ongoing. """ +EVT_AUINOTEBOOK_ALLOW_DND = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, 1) +""" Fires an event asking if it is OK to drag and drop a tab. """ +EVT_AUINOTEBOOK_DRAG_DONE = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, 1) +""" A drag-and-drop operation on a notebook tab has finished. """ +EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, 1) +""" The user clicked with the middle mouse button on a tab. """ +EVT_AUINOTEBOOK_TAB_MIDDLE_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, 1) +""" The user clicked with the middle mouse button on a tab. """ +EVT_AUINOTEBOOK_TAB_RIGHT_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, 1) +""" The user clicked with the right mouse button on a tab. """ +EVT_AUINOTEBOOK_TAB_RIGHT_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, 1) +""" The user clicked with the right mouse button on a tab. """ +EVT_AUINOTEBOOK_BG_MIDDLE_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_DOWN, 1) +""" The user middle-clicked in the tab area but not over a tab or a button. """ +EVT_AUINOTEBOOK_BG_MIDDLE_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_UP, 1) +""" The user middle-clicked in the tab area but not over a tab or a button. """ +EVT_AUINOTEBOOK_BG_RIGHT_DOWN = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_DOWN, 1) +""" The user right-clicked in the tab area but not over a tab or a button. """ +EVT_AUINOTEBOOK_BG_RIGHT_UP = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_UP, 1) +""" The user right-clicked in the tab area but not over a tab or a button. """ +EVT_AUINOTEBOOK_BG_DCLICK = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, 1) +""" The user left-clicked on the tab area not occupied by `AuiNotebook` tabs. """ +EVT_AUINOTEBOOK_CANCEL_DRAG = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, 1) +""" A drag and drop operation has been cancelled. """ +EVT_AUINOTEBOOK_TAB_DCLICK = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK, 1) +""" The user double-clicked with the left mouse button on a tab. """ +EVT_AUINOTEBOOK_BEGIN_LABEL_EDIT = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_LABEL_EDIT, 1) +""" The user double-clicked with the left mouse button on a tab which text is editable. """ +EVT_AUINOTEBOOK_END_LABEL_EDIT = wx.PyEventBinder(wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT, 1) +""" The user finished editing a tab label. """ + + +# ----------------------------------------------------------------------------- +# Auxiliary class: TabTextCtrl +# This is the temporary ExpandoTextCtrl created when you edit the text of a tab +# ----------------------------------------------------------------------------- + +class TabTextCtrl(ExpandoTextCtrl): + """ Control used for in-place edit. """ + + def __init__(self, owner, tab, page_index): + """ + Default class constructor. + For internal use: do not call it in your code! + + :param `owner`: the L{AuiTabCtrl} owning the tab; + :param `tab`: the actual L{AuiNotebookPage} tab; + :param `page_index`: the L{AuiNotebook} page index for the tab. + """ + + self._owner = owner + self._tabEdited = tab + self._pageIndex = page_index + self._startValue = tab.caption + self._finished = False + self._aboutToFinish = False + self._currentValue = self._startValue + + x, y, w, h = self._tabEdited.rect + + wnd = self._tabEdited.control + if wnd: + x += wnd.GetSize()[0] + 2 + h = 0 + + image_h = 0 + image_w = 0 + + image = tab.bitmap + + if image.IsOk(): + image_w, image_h = image.GetWidth(), image.GetHeight() + image_w += 6 + + dc = wx.ClientDC(self._owner) + h = max(image_h, dc.GetMultiLineTextExtent(tab.caption)[1]) + h = h + 2 + + # FIXME: what are all these hardcoded 4, 8 and 11s really? + x += image_w + w -= image_w + 4 + + y = (self._tabEdited.rect.height - h)/2 + 1 + + expandoStyle = wx.WANTS_CHARS + if wx.Platform in ["__WXGTK__", "__WXMAC__"]: + expandoStyle |= wx.SIMPLE_BORDER + xSize, ySize = w + 2, h + else: + expandoStyle |= wx.SUNKEN_BORDER + xSize, ySize = w + 2, h+2 + + ExpandoTextCtrl.__init__(self, self._owner, wx.ID_ANY, self._startValue, + wx.Point(x, y), wx.Size(xSize, ySize), + expandoStyle) + + if wx.Platform == "__WXMAC__": + self.SetFont(owner.GetFont()) + bs = self.GetBestSize() + self.SetSize((-1, bs.height)) + + self.Bind(wx.EVT_CHAR, self.OnChar) + self.Bind(wx.EVT_KEY_UP, self.OnKeyUp) + self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) + + + def AcceptChanges(self): + """ Accepts/refuses the changes made by the user. """ + + value = self.GetValue() + notebook = self._owner.GetParent() + + if value == self._startValue: + # nothing changed, always accept + # when an item remains unchanged, the owner + # needs to be notified that the user decided + # not to change the tree item label, and that + # the edit has been cancelled + notebook.OnRenameCancelled(self._pageIndex) + return True + + if not notebook.OnRenameAccept(self._pageIndex, value): + # vetoed by the user + return False + + # accepted, do rename the item + notebook.SetPageText(self._pageIndex, value) + + return True + + + def Finish(self): + """ Finish editing. """ + + if not self._finished: + + notebook = self._owner.GetParent() + + self._finished = True + self._owner.SetFocus() + notebook.ResetTextControl() + + + def OnChar(self, event): + """ + Handles the ``wx.EVT_CHAR`` event for L{TabTextCtrl}. + + :param `event`: a `wx.KeyEvent` event to be processed. + """ + + keycode = event.GetKeyCode() + shiftDown = event.ShiftDown() + + if keycode == wx.WXK_RETURN: + if shiftDown and self._tabEdited.IsMultiline(): + event.Skip() + else: + self._aboutToFinish = True + self.SetValue(self._currentValue) + # Notify the owner about the changes + self.AcceptChanges() + # Even if vetoed, close the control (consistent with MSW) + wx.CallAfter(self.Finish) + + elif keycode == wx.WXK_ESCAPE: + self.StopEditing() + + else: + event.Skip() + + + def OnKeyUp(self, event): + """ + Handles the ``wx.EVT_KEY_UP`` event for L{TabTextCtrl}. + + :param `event`: a `wx.KeyEvent` event to be processed. + """ + + if not self._finished: + + # auto-grow the textctrl: + mySize = self.GetSize() + + dc = wx.ClientDC(self) + sx, sy, dummy = dc.GetMultiLineTextExtent(self.GetValue() + "M") + + self.SetSize((sx, -1)) + self._currentValue = self.GetValue() + + event.Skip() + + + def OnKillFocus(self, event): + """ + Handles the ``wx.EVT_KILL_FOCUS`` event for L{TabTextCtrl}. + + :param `event`: a `wx.FocusEvent` event to be processed. + """ + + if not self._finished and not self._aboutToFinish: + + # We must finish regardless of success, otherwise we'll get + # focus problems: + if not self.AcceptChanges(): + self._owner.GetParent().OnRenameCancelled(self._pageIndex) + + # We must let the native text control handle focus, too, otherwise + # it could have problems with the cursor (e.g., in wxGTK). + event.Skip() + wx.CallAfter(self._owner.GetParent().ResetTextControl) + + + def StopEditing(self): + """ Suddenly stops the editing. """ + + self._owner.GetParent().OnRenameCancelled(self._pageIndex) + self.Finish() + + + def item(self): + """ Returns the item currently edited. """ + + return self._tabEdited + + +# ---------------------------------------------------------------------- + +class AuiNotebookPage(object): + """ + A simple class which holds information about tab captions, bitmaps and + colours. + """ + + def __init__(self): + """ + Default class constructor. + Used internally, do not call it in your code! + """ + + self.window = None # page's associated window + self.caption = "" # caption displayed on the tab + self.bitmap = wx.NullBitmap # tab's bitmap + self.dis_bitmap = wx.NullBitmap # tab's disabled bitmap + self.rect = wx.Rect() # tab's hit rectangle + self.active = False # True if the page is currently active + self.enabled = True # True if the page is currently enabled + self.hasCloseButton = True # True if the page has a close button using the style + # AUI_NB_CLOSE_ON_ALL_TABS + self.control = None # A control can now be inside a tab + self.renamable = False # If True, a tab can be renamed by a left double-click + + self.text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT) + + self.access_time = datetime.datetime.now() # Last time this page was selected + + + def IsMultiline(self): + """ Returns whether the tab contains multiline text. """ + + return "\n" in self.caption + + +# ---------------------------------------------------------------------- + +class AuiTabContainerButton(object): + """ + A simple class which holds information about tab buttons and their state. + """ + + def __init__(self): + """ + Default class constructor. + Used internally, do not call it in your code! + """ + + self.id = -1 # button's id + self.cur_state = AUI_BUTTON_STATE_NORMAL # current state (normal, hover, pressed, etc.) + self.location = wx.LEFT # buttons location (wxLEFT, wxRIGHT, or wxCENTER) + self.bitmap = wx.NullBitmap # button's hover bitmap + self.dis_bitmap = wx.NullBitmap # button's disabled bitmap + self.rect = wx.Rect() # button's hit rectangle + + +# ---------------------------------------------------------------------- + +class CommandNotebookEvent(wx.PyCommandEvent): + """ A specialized command event class for events sent by L{AuiNotebook} . """ + + def __init__(self, command_type=None, win_id=0): + """ + Default class constructor. + + :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. + :param `win_id`: the window identification number. + """ + + if type(command_type) == types.IntType: + wx.PyCommandEvent.__init__(self, command_type, win_id) + else: + wx.PyCommandEvent.__init__(self, command_type.GetEventType(), command_type.GetId()) + + self.old_selection = -1 + self.selection = -1 + self.drag_source = None + self.dispatched = 0 + self.label = "" + self.editCancelled = False + + + def SetSelection(self, s): + """ + Sets the selection member variable. + + :param `s`: the new selection. + """ + + self.selection = s + self._commandInt = s + + + def GetSelection(self): + """ Returns the currently selected page, or -1 if none was selected. """ + + return self.selection + + + def SetOldSelection(self, s): + """ + Sets the id of the page selected before the change. + + :param `s`: the old selection. + """ + + self.old_selection = s + + + def GetOldSelection(self): + """ + Returns the page that was selected before the change, or -1 if none was + selected. + """ + + return self.old_selection + + + def SetDragSource(self, s): + """ + Sets the drag and drop source. + + :param `s`: the drag source. + """ + + self.drag_source = s + + + def GetDragSource(self): + """ Returns the drag and drop source. """ + + return self.drag_source + + + def SetDispatched(self, b): + """ + Sets the event as dispatched (used for automatic L{AuiNotebook} ). + + :param `b`: whether the event was dispatched or not. + """ + + self.dispatched = b + + + def GetDispatched(self): + """ Returns whether the event was dispatched (used for automatic L{AuiNotebook} ). """ + + return self.dispatched + + + def IsEditCancelled(self): + """ Returns the edit cancel flag (for ``EVT_AUINOTEBOOK_BEGIN`` | ``END_LABEL_EDIT`` only).""" + + return self.editCancelled + + + def SetEditCanceled(self, editCancelled): + """ + Sets the edit cancel flag (for ``EVT_AUINOTEBOOK_BEGIN`` | ``END_LABEL_EDIT`` only). + + :param `editCancelled`: whether the editing action has been cancelled or not. + """ + + self.editCancelled = editCancelled + + + def GetLabel(self): + """Returns the label-itemtext (for ``EVT_AUINOTEBOOK_BEGIN`` | ``END_LABEL_EDIT`` only).""" + + return self.label + + + def SetLabel(self, label): + """ + Sets the label. Useful only for ``EVT_AUINOTEBOOK_END_LABEL_EDIT``. + + :param `label`: the new label. + """ + + self.label = label + + +# ---------------------------------------------------------------------- + +class AuiNotebookEvent(CommandNotebookEvent): + """ A specialized command event class for events sent by L{AuiNotebook}. """ + + def __init__(self, command_type=None, win_id=0): + """ + Default class constructor. + + :param `command_type`: the event kind or an instance of `wx.PyCommandEvent`. + :param `win_id`: the window identification number. + """ + + CommandNotebookEvent.__init__(self, command_type, win_id) + + if type(command_type) == types.IntType: + self.notify = wx.NotifyEvent(command_type, win_id) + else: + self.notify = wx.NotifyEvent(command_type.GetEventType(), command_type.GetId()) + + + def GetNotifyEvent(self): + """ Returns the actual `wx.NotifyEvent`. """ + + return self.notify + + + def IsAllowed(self): + """ Returns whether the event is allowed or not. """ + + return self.notify.IsAllowed() + + + def Veto(self): + """ + Prevents the change announced by this event from happening. + + It is in general a good idea to notify the user about the reasons for + vetoing the change because otherwise the applications behaviour (which + just refuses to do what the user wants) might be quite surprising. + """ + + self.notify.Veto() + + + def Allow(self): + """ + This is the opposite of L{Veto}: it explicitly allows the event to be + processed. For most events it is not necessary to call this method as the + events are allowed anyhow but some are forbidden by default (this will + be mentioned in the corresponding event description). + """ + + self.notify.Allow() + + +# ---------------------------------------------------------------------------- # +# Class TabNavigatorWindow +# ---------------------------------------------------------------------------- # + +class TabNavigatorWindow(wx.Dialog): + """ + This class is used to create a modal dialog that enables "Smart Tabbing", + similar to what you would get by hitting ``Alt`` + ``Tab`` on Windows. + """ + + def __init__(self, parent=None, icon=None): + """ + Default class constructor. Used internally. + + :param `parent`: the L{TabNavigatorWindow} parent; + :param `icon`: the L{TabNavigatorWindow} icon. + """ + + wx.Dialog.__init__(self, parent, wx.ID_ANY, "", style=0) + + self._selectedItem = -1 + self._indexMap = [] + + if icon is None: + self._bmp = Mondrian.GetBitmap() + else: + self._bmp = icon + + if self._bmp.GetSize() != (16, 16): + img = self._bmp.ConvertToImage() + img.Rescale(16, 16, wx.IMAGE_QUALITY_HIGH) + self._bmp = wx.BitmapFromImage(img) + + sz = wx.BoxSizer(wx.VERTICAL) + + self._listBox = wx.ListBox(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(200, 150), [], wx.LB_SINGLE | wx.NO_BORDER) + + mem_dc = wx.MemoryDC() + mem_dc.SelectObject(wx.EmptyBitmap(1,1)) + font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) + font.SetWeight(wx.BOLD) + mem_dc.SetFont(font) + + panelHeight = mem_dc.GetCharHeight() + panelHeight += 4 # Place a spacer of 2 pixels + + # Out signpost bitmap is 24 pixels + if panelHeight < 24: + panelHeight = 24 + + self._panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(200, panelHeight)) + + sz.Add(self._panel) + sz.Add(self._listBox, 1, wx.EXPAND) + + self.SetSizer(sz) + + # Connect events to the list box + self._listBox.Bind(wx.EVT_KEY_UP, self.OnKeyUp) + self._listBox.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigationKey) + self._listBox.Bind(wx.EVT_LISTBOX_DCLICK, self.OnItemSelected) + + # Connect paint event to the panel + self._panel.Bind(wx.EVT_PAINT, self.OnPanelPaint) + self._panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnPanelEraseBg) + + self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) + self._listBox.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) + self.PopulateListControl(parent) + + self.GetSizer().Fit(self) + self.GetSizer().SetSizeHints(self) + self.GetSizer().Layout() + self.Centre() + + # Set focus on the list box to avoid having to click on it to change + # the tab selection under GTK. + self._listBox.SetFocus() + + + def OnKeyUp(self, event): + """ + Handles the ``wx.EVT_KEY_UP`` for the L{TabNavigatorWindow}. + + :param `event`: a `wx.KeyEvent` event to be processed. + """ + + if event.GetKeyCode() == wx.WXK_CONTROL: + self.CloseDialog() + + + def OnNavigationKey(self, event): + """ + Handles the ``wx.EVT_NAVIGATION_KEY`` for the L{TabNavigatorWindow}. + + :param `event`: a `wx.NavigationKeyEvent` event to be processed. + """ + + selected = self._listBox.GetSelection() + bk = self.GetParent() + maxItems = bk.GetPageCount() + + if event.GetDirection(): + + # Select next page + if selected == maxItems - 1: + itemToSelect = 0 + else: + itemToSelect = selected + 1 + + else: + + # Previous page + if selected == 0: + itemToSelect = maxItems - 1 + else: + itemToSelect = selected - 1 + + self._listBox.SetSelection(itemToSelect) + + + def PopulateListControl(self, book): + """ + Populates the L{TabNavigatorWindow} listbox with a list of tabs. + + :param `book`: the actual L{AuiNotebook}. + """ + # Index of currently selected page + selection = book.GetSelection() + # Total number of pages + count = book.GetPageCount() + # List of (index, AuiNotebookPage) + pages = list(enumerate(book.GetTabContainer().GetPages())) + if book.GetAGWWindowStyleFlag() & AUI_NB_ORDER_BY_ACCESS: + # Sort pages using last access time. Most recently used is the + # first in line + pages.sort( + key = lambda element: element[1].access_time, + reverse = True + ) + else: + # Manually add the current selection as first item + # Remaining ones are added in the next loop + del pages[selection] + self._listBox.Append(book.GetPageText(selection)) + self._indexMap.append(selection) + + for (index, page) in pages: + self._listBox.Append(book.GetPageText(index)) + self._indexMap.append(index) + + # Select the next entry after the current selection + self._listBox.SetSelection(0) + dummy = wx.NavigationKeyEvent() + dummy.SetDirection(True) + self.OnNavigationKey(dummy) + + + def OnItemSelected(self, event): + """ + Handles the ``wx.EVT_LISTBOX_DCLICK`` event for the wx.ListBox inside L{TabNavigatorWindow}. + + :param `event`: a `wx.ListEvent` event to be processed. + """ + + self.CloseDialog() + + + def CloseDialog(self): + """ Closes the L{TabNavigatorWindow} dialog, setting selection in L{AuiNotebook}. """ + + bk = self.GetParent() + self._selectedItem = self._listBox.GetSelection() + self.EndModal(wx.ID_OK) + + + def GetSelectedPage(self): + """ Gets the page index that was selected when the dialog was closed. """ + + return self._indexMap[self._selectedItem] + + + def OnPanelPaint(self, event): + """ + Handles the ``wx.EVT_PAINT`` event for L{TabNavigatorWindow} top panel. + + :param `event`: a `wx.PaintEvent` event to be processed. + """ + + dc = wx.PaintDC(self._panel) + rect = self._panel.GetClientRect() + + bmp = wx.EmptyBitmap(rect.width, rect.height) + + mem_dc = wx.MemoryDC() + mem_dc.SelectObject(bmp) + + endColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW) + startColour = LightColour(endColour, 50) + mem_dc.GradientFillLinear(rect, startColour, endColour, wx.SOUTH) + + # Draw the caption title and place the bitmap + # get the bitmap optimal position, and draw it + bmpPt, txtPt = wx.Point(), wx.Point() + bmpPt.y = (rect.height - self._bmp.GetHeight())/2 + bmpPt.x = 3 + mem_dc.DrawBitmap(self._bmp, bmpPt.x, bmpPt.y, True) + + # get the text position, and draw it + font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) + font.SetWeight(wx.BOLD) + mem_dc.SetFont(font) + fontHeight = mem_dc.GetCharHeight() + + txtPt.x = bmpPt.x + self._bmp.GetWidth() + 4 + txtPt.y = (rect.height - fontHeight)/2 + mem_dc.SetTextForeground(wx.WHITE) + mem_dc.DrawText("Opened tabs:", txtPt.x, txtPt.y) + mem_dc.SelectObject(wx.NullBitmap) + + dc.DrawBitmap(bmp, 0, 0) + + + def OnPanelEraseBg(self, event): + """ + Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{TabNavigatorWindow} top panel. + + :param `event`: a `wx.EraseEvent` event to be processed. + + :note: This is intentionally empty, to reduce flicker. + """ + + pass + + +# ---------------------------------------------------------------------- +# -- AuiTabContainer class implementation -- + +class AuiTabContainer(object): + """ + AuiTabContainer is a class which contains information about each + tab. It also can render an entire tab control to a specified DC. + It's not a window class itself, because this code will be used by + the L{AuiManager}, where it is disadvantageous to have separate + windows for each tab control in the case of "docked tabs". + + A derived class, L{AuiTabCtrl}, is an actual `wx.Window`-derived window + which can be used as a tab control in the normal sense. + """ + + def __init__(self, auiNotebook): + """ + Default class constructor. + Used internally, do not call it in your code! + + :param `auiNotebook`: the parent L{AuiNotebook} window. + """ + + self._tab_offset = 0 + self._agwFlags = 0 + self._art = TA.AuiDefaultTabArt() + + self._buttons = [] + self._pages = [] + self._tab_close_buttons = [] + + self._rect = wx.Rect() + self._auiNotebook = auiNotebook + + self.AddButton(AUI_BUTTON_LEFT, wx.LEFT) + self.AddButton(AUI_BUTTON_RIGHT, wx.RIGHT) + self.AddButton(AUI_BUTTON_WINDOWLIST, wx.RIGHT) + self.AddButton(AUI_BUTTON_CLOSE, wx.RIGHT) + + + def SetArtProvider(self, art): + """ + Instructs L{AuiTabContainer} to use art provider specified by parameter `art` + for all drawing calls. This allows plugable look-and-feel features. + + :param `art`: an art provider. + + :note: The previous art provider object, if any, will be deleted by L{AuiTabContainer}. + """ + + del self._art + self._art = art + + if self._art: + self._art.SetAGWFlags(self._agwFlags) + + + def GetArtProvider(self): + """ Returns the current art provider being used. """ + + return self._art + + + def SetAGWFlags(self, agwFlags): + """ + Sets the tab art flags. + + :param `agwFlags`: a combination of the following values: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook + ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet + ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet + ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook + ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab + ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging + ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control + ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width + ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed + ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available + ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar + ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab + ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs + ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click + ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks + ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present + ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows + ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items + ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) + ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages + ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) + ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs + ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle + ==================================== ================================== + + :todo: Implementation of flags ``AUI_NB_RIGHT`` and ``AUI_NB_LEFT``. + + """ + + self._agwFlags = agwFlags + + # check for new close button settings + self.RemoveButton(AUI_BUTTON_LEFT) + self.RemoveButton(AUI_BUTTON_RIGHT) + self.RemoveButton(AUI_BUTTON_WINDOWLIST) + self.RemoveButton(AUI_BUTTON_CLOSE) + + if agwFlags & AUI_NB_SCROLL_BUTTONS: + self.AddButton(AUI_BUTTON_LEFT, wx.LEFT) + self.AddButton(AUI_BUTTON_RIGHT, wx.RIGHT) + + if agwFlags & AUI_NB_WINDOWLIST_BUTTON: + self.AddButton(AUI_BUTTON_WINDOWLIST, wx.RIGHT) + + if agwFlags & AUI_NB_CLOSE_BUTTON: + self.AddButton(AUI_BUTTON_CLOSE, wx.RIGHT) + + if self._art: + self._art.SetAGWFlags(self._agwFlags) + + + def GetAGWFlags(self): + """ + Returns the tab art flags. + + See L{SetAGWFlags} for a list of possible return values. + + :see: L{SetAGWFlags} + """ + + return self._agwFlags + + + def SetNormalFont(self, font): + """ + Sets the normal font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._art.SetNormalFont(font) + + + def SetSelectedFont(self, font): + """ + Sets the selected tab font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._art.SetSelectedFont(font) + + + def SetMeasuringFont(self, font): + """ + Sets the font for calculating text measurements. + + :param `font`: a `wx.Font` object. + """ + + self._art.SetMeasuringFont(font) + + + def SetTabRect(self, rect): + """ + Sets the tab area rectangle. + + :param `rect`: an instance of `wx.Rect`, specifying the available area for L{AuiTabContainer}. + """ + + self._rect = rect + + if self._art: + minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() + self._art.SetSizingInfo(rect.GetSize(), len(self._pages), minMaxTabWidth) + + + def AddPage(self, page, info): + """ + Adds a page to the tab control. + + :param `page`: the window associated with this tab; + :param `info`: an instance of L{AuiNotebookPage}. + """ + + page_info = info + page_info.window = page + + self._pages.append(page_info) + + # let the art provider know how many pages we have + if self._art: + minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() + self._art.SetSizingInfo(self._rect.GetSize(), len(self._pages), minMaxTabWidth) + + return True + + + def InsertPage(self, page, info, idx): + """ + Inserts a page in the tab control in the position specified by `idx`. + + :param `page`: the window associated with this tab; + :param `info`: an instance of L{AuiNotebookPage}; + :param `idx`: the page insertion index. + """ + + page_info = info + page_info.window = page + + if idx >= len(self._pages): + self._pages.append(page_info) + else: + self._pages.insert(idx, page_info) + + # let the art provider know how many pages we have + if self._art: + minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() + self._art.SetSizingInfo(self._rect.GetSize(), len(self._pages), minMaxTabWidth) + + return True + + + def MovePage(self, page, new_idx): + """ + Moves a page in a new position specified by `new_idx`. + + :param `page`: the window associated with this tab; + :param `new_idx`: the new page position. + """ + + idx = self.GetIdxFromWindow(page) + if idx == -1: + return False + + # get page entry, make a copy of it + p = self.GetPage(idx) + + # remove old page entry + self.RemovePage(page) + + # insert page where it should be + self.InsertPage(page, p, new_idx) + + return True + + + def RemovePage(self, wnd): + """ + Removes a page from the tab control. + + :param `wnd`: an instance of `wx.Window`, a window associated with this tab. + """ + + minMaxTabWidth = self._auiNotebook.GetMinMaxTabWidth() + + for page in self._pages: + if page.window == wnd: + self._pages.remove(page) + self._tab_offset = min(self._tab_offset, len(self._pages) - 1) + + # let the art provider know how many pages we have + if self._art: + self._art.SetSizingInfo(self._rect.GetSize(), len(self._pages), minMaxTabWidth) + + return True + + return False + + + def SetActivePage(self, wndOrInt): + """ + Sets the L{AuiTabContainer} active page. + + :param `wndOrInt`: an instance of `wx.Window` or an integer specifying a tab index. + """ + + if type(wndOrInt) == types.IntType: + + if wndOrInt >= len(self._pages): + return False + + wnd = self._pages[wndOrInt].window + + else: + wnd = wndOrInt + + found = False + + for indx, page in enumerate(self._pages): + if page.window == wnd: + page.active = True + found = True + else: + page.active = False + + return found + + + def SetNoneActive(self): + """ Sets all the tabs as inactive (non-selected). """ + + for page in self._pages: + page.active = False + + + def GetActivePage(self): + """ Returns the current selected tab or ``wx.NOT_FOUND`` if none is selected. """ + + for indx, page in enumerate(self._pages): + if page.active: + return indx + + return wx.NOT_FOUND + + + def GetWindowFromIdx(self, idx): + """ + Returns the window associated with the tab with index `idx`. + + :param `idx`: the tab index. + """ + + if idx >= len(self._pages): + return None + + return self._pages[idx].window + + + def GetIdxFromWindow(self, wnd): + """ + Returns the tab index based on the window `wnd` associated with it. + + :param `wnd`: an instance of `wx.Window`. + """ + + for indx, page in enumerate(self._pages): + if page.window == wnd: + return indx + + return wx.NOT_FOUND + + + def GetPage(self, idx): + """ + Returns the page specified by the given index. + + :param `idx`: the tab index. + """ + + if idx < 0 or idx >= len(self._pages): + raise Exception("Invalid Page index") + + return self._pages[idx] + + + def GetPages(self): + """ Returns a list of all the pages in this L{AuiTabContainer}. """ + + return self._pages + + + def GetPageCount(self): + """ Returns the number of pages in the L{AuiTabContainer}. """ + + return len(self._pages) + + + def GetEnabled(self, idx): + """ + Returns whether a tab is enabled or not. + + :param `idx`: the tab index. + """ + + if idx < 0 or idx >= len(self._pages): + return False + + return self._pages[idx].enabled + + + def EnableTab(self, idx, enable=True): + """ + Enables/disables a tab in the L{AuiTabContainer}. + + :param `idx`: the tab index; + :param `enable`: ``True`` to enable a tab, ``False`` to disable it. + """ + + if idx < 0 or idx >= len(self._pages): + raise Exception("Invalid Page index") + + self._pages[idx].enabled = enable + wnd = self.GetWindowFromIdx(idx) + wnd.Enable(enable) + + + def AddButton(self, id, location, normal_bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap): + """ + Adds a button in the tab area. + + :param `id`: the button identifier. This can be one of the following: + + ============================== ================================= + Button Identifier Description + ============================== ================================= + ``AUI_BUTTON_CLOSE`` Shows a close button on the tab area + ``AUI_BUTTON_WINDOWLIST`` Shows a window list button on the tab area + ``AUI_BUTTON_LEFT`` Shows a left button on the tab area + ``AUI_BUTTON_RIGHT`` Shows a right button on the tab area + ============================== ================================= + + :param `location`: the button location. Can be ``wx.LEFT`` or ``wx.RIGHT``; + :param `normal_bitmap`: the bitmap for an enabled tab; + :param `disabled_bitmap`: the bitmap for a disabled tab. + """ + + button = AuiTabContainerButton() + button.id = id + button.bitmap = normal_bitmap + button.dis_bitmap = disabled_bitmap + button.location = location + button.cur_state = AUI_BUTTON_STATE_NORMAL + + self._buttons.append(button) + + + def RemoveButton(self, id): + """ + Removes a button from the tab area. + + :param `id`: the button identifier. See L{AddButton} for a list of button identifiers. + + :see: L{AddButton} + """ + + for button in self._buttons: + if button.id == id: + self._buttons.remove(button) + return + + + def GetTabOffset(self): + """ Returns the tab offset. """ + + return self._tab_offset + + + def SetTabOffset(self, offset): + """ + Sets the tab offset. + + :param `offset`: the tab offset. + """ + + self._tab_offset = offset + + + def MinimizeTabOffset(self, dc, wnd, max_width): + """ + Minimize `self._tab_offset` to fit as many tabs as possible in the available space. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: an instance of `wx.Window`; + :param `max_width`: the maximum available width for the tabs. + """ + + total_width = 0 + + for i, page in reversed(list(enumerate(self._pages))): + + tab_button = self._tab_close_buttons[i] + (tab_width, tab_height), x_extent = self._art.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, tab_button.cur_state, page.control) + total_width += tab_width + + if total_width > max_width: + + tab_offset = i + 1 + + if tab_offset < self._tab_offset and tab_offset < len(self._pages): + self._tab_offset = tab_offset + + break + + if i == 0: + self._tab_offset = 0 + + + def Render(self, raw_dc, wnd): + """ + Renders the tab catalog to the specified `wx.DC`. + + It is a virtual function and can be overridden to provide custom drawing + capabilities. + + :param `raw_dc`: a `wx.DC` device context; + :param `wnd`: an instance of `wx.Window`. + """ + + if not raw_dc or not raw_dc.IsOk(): + return + + dc = wx.MemoryDC() + + # use the same layout direction as the window DC uses to ensure that the + # text is rendered correctly + dc.SetLayoutDirection(raw_dc.GetLayoutDirection()) + + page_count = len(self._pages) + button_count = len(self._buttons) + + # create off-screen bitmap + bmp = wx.EmptyBitmap(self._rect.GetWidth(), self._rect.GetHeight()) + dc.SelectObject(bmp) + + if not dc.IsOk(): + return + + # find out if size of tabs is larger than can be + # afforded on screen + total_width = visible_width = 0 + + for i in xrange(page_count): + page = self._pages[i] + + # determine if a close button is on this tab + close_button = False + if (self._agwFlags & AUI_NB_CLOSE_ON_ALL_TABS and page.hasCloseButton) or \ + (self._agwFlags & AUI_NB_CLOSE_ON_ACTIVE_TAB and page.active and page.hasCloseButton): + + close_button = True + + control = page.control + if control: + try: + control.GetSize() + except wx.PyDeadObjectError: + page.control = None + + size, x_extent = self._art.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, + (close_button and [AUI_BUTTON_STATE_NORMAL] or \ + [AUI_BUTTON_STATE_HIDDEN])[0], page.control) + + if i+1 < page_count: + total_width += x_extent + else: + total_width += size[0] + + if i >= self._tab_offset: + if i+1 < page_count: + visible_width += x_extent + else: + visible_width += size[0] + + if total_width > self._rect.GetWidth() or self._tab_offset != 0: + + # show left/right buttons + for button in self._buttons: + if button.id == AUI_BUTTON_LEFT or \ + button.id == AUI_BUTTON_RIGHT: + + button.cur_state &= ~AUI_BUTTON_STATE_HIDDEN + + else: + + # hide left/right buttons + for button in self._buttons: + if button.id == AUI_BUTTON_LEFT or \ + button.id == AUI_BUTTON_RIGHT: + + button.cur_state |= AUI_BUTTON_STATE_HIDDEN + + # determine whether left button should be enabled + for button in self._buttons: + if button.id == AUI_BUTTON_LEFT: + if self._tab_offset == 0: + button.cur_state |= AUI_BUTTON_STATE_DISABLED + else: + button.cur_state &= ~AUI_BUTTON_STATE_DISABLED + + if button.id == AUI_BUTTON_RIGHT: + if visible_width < self._rect.GetWidth() - 16*button_count: + button.cur_state |= AUI_BUTTON_STATE_DISABLED + else: + button.cur_state &= ~AUI_BUTTON_STATE_DISABLED + + # draw background + self._art.DrawBackground(dc, wnd, self._rect) + + # draw buttons + left_buttons_width = 0 + right_buttons_width = 0 + + # draw the buttons on the right side + offset = self._rect.x + self._rect.width + + for i in xrange(button_count): + button = self._buttons[button_count - i - 1] + + if button.location != wx.RIGHT: + continue + if button.cur_state & AUI_BUTTON_STATE_HIDDEN: + continue + + button_rect = wx.Rect(*self._rect) + button_rect.SetY(1) + button_rect.SetWidth(offset) + + button.rect = self._art.DrawButton(dc, wnd, button_rect, button, wx.RIGHT) + + offset -= button.rect.GetWidth() + right_buttons_width += button.rect.GetWidth() + + offset = 0 + + # draw the buttons on the left side + for i in xrange(button_count): + button = self._buttons[button_count - i - 1] + + if button.location != wx.LEFT: + continue + if button.cur_state & AUI_BUTTON_STATE_HIDDEN: + continue + + button_rect = wx.Rect(offset, 1, 1000, self._rect.height) + + button.rect = self._art.DrawButton(dc, wnd, button_rect, button, wx.LEFT) + + offset += button.rect.GetWidth() + left_buttons_width += button.rect.GetWidth() + + offset = left_buttons_width + + if offset == 0: + offset += self._art.GetIndentSize() + + # prepare the tab-close-button array + # make sure tab button entries which aren't used are marked as hidden + for i in xrange(page_count, len(self._tab_close_buttons)): + self._tab_close_buttons[i].cur_state = AUI_BUTTON_STATE_HIDDEN + + # make sure there are enough tab button entries to accommodate all tabs + while len(self._tab_close_buttons) < page_count: + tempbtn = AuiTabContainerButton() + tempbtn.id = AUI_BUTTON_CLOSE + tempbtn.location = wx.CENTER + tempbtn.cur_state = AUI_BUTTON_STATE_HIDDEN + self._tab_close_buttons.append(tempbtn) + + # buttons before the tab offset must be set to hidden + for i in xrange(self._tab_offset): + self._tab_close_buttons[i].cur_state = AUI_BUTTON_STATE_HIDDEN + if self._pages[i].control: + if self._pages[i].control.IsShown(): + self._pages[i].control.Hide() + + self.MinimizeTabOffset(dc, wnd, self._rect.GetWidth() - right_buttons_width - offset - 2) + + # draw the tabs + active = 999 + active_offset = 0 + + rect = wx.Rect(*self._rect) + rect.y = 0 + rect.height = self._rect.height + + for i in xrange(self._tab_offset, page_count): + + page = self._pages[i] + tab_button = self._tab_close_buttons[i] + + # determine if a close button is on this tab + if (self._agwFlags & AUI_NB_CLOSE_ON_ALL_TABS and page.hasCloseButton) or \ + (self._agwFlags & AUI_NB_CLOSE_ON_ACTIVE_TAB and page.active and page.hasCloseButton): + + if tab_button.cur_state == AUI_BUTTON_STATE_HIDDEN: + + tab_button.id = AUI_BUTTON_CLOSE + tab_button.cur_state = AUI_BUTTON_STATE_NORMAL + tab_button.location = wx.CENTER + + else: + + tab_button.cur_state = AUI_BUTTON_STATE_HIDDEN + + rect.x = offset + rect.width = self._rect.width - right_buttons_width - offset - 2 + + if rect.width <= 0: + break + + page.rect, tab_button.rect, x_extent = self._art.DrawTab(dc, wnd, page, rect, tab_button.cur_state) + + if page.active: + active = i + active_offset = offset + active_rect = wx.Rect(*rect) + + offset += x_extent + + lenPages = len(self._pages) + # make sure to deactivate buttons which are off the screen to the right + for j in xrange(i+1, len(self._tab_close_buttons)): + self._tab_close_buttons[j].cur_state = AUI_BUTTON_STATE_HIDDEN + if j > 0 and j <= lenPages: + if self._pages[j-1].control: + if self._pages[j-1].control.IsShown(): + self._pages[j-1].control.Hide() + + # draw the active tab again so it stands in the foreground + if active >= self._tab_offset and active < len(self._pages): + + page = self._pages[active] + tab_button = self._tab_close_buttons[active] + + rect.x = active_offset + dummy = self._art.DrawTab(dc, wnd, page, active_rect, tab_button.cur_state) + + raw_dc.Blit(self._rect.x, self._rect.y, self._rect.GetWidth(), self._rect.GetHeight(), dc, 0, 0) + + + def IsTabVisible(self, tabPage, tabOffset, dc, wnd): + """ + Returns whether a tab is visible or not. + + :param `tabPage`: the tab index; + :param `tabOffset`: the tab offset; + :param `dc`: a `wx.DC` device context; + :param `wnd`: an instance of `wx.Window` derived window. + """ + + if not dc or not dc.IsOk(): + return False + + page_count = len(self._pages) + button_count = len(self._buttons) + self.Render(dc, wnd) + + # Hasn't been rendered yet assume it's visible + if len(self._tab_close_buttons) < page_count: + return True + + if self._agwFlags & AUI_NB_SCROLL_BUTTONS: + # First check if both buttons are disabled - if so, there's no need to + # check further for visibility. + arrowButtonVisibleCount = 0 + for i in xrange(button_count): + + button = self._buttons[i] + if button.id == AUI_BUTTON_LEFT or \ + button.id == AUI_BUTTON_RIGHT: + + if button.cur_state & AUI_BUTTON_STATE_HIDDEN == 0: + arrowButtonVisibleCount += 1 + + # Tab must be visible + if arrowButtonVisibleCount == 0: + return True + + # If tab is less than the given offset, it must be invisible by definition + if tabPage < tabOffset: + return False + + # draw buttons + left_buttons_width = 0 + right_buttons_width = 0 + + offset = 0 + + # calculate size of the buttons on the right side + offset = self._rect.x + self._rect.width + + for i in xrange(button_count): + button = self._buttons[button_count - i - 1] + + if button.location != wx.RIGHT: + continue + if button.cur_state & AUI_BUTTON_STATE_HIDDEN: + continue + + offset -= button.rect.GetWidth() + right_buttons_width += button.rect.GetWidth() + + offset = 0 + + # calculate size of the buttons on the left side + for i in xrange(button_count): + button = self._buttons[button_count - i - 1] + + if button.location != wx.LEFT: + continue + if button.cur_state & AUI_BUTTON_STATE_HIDDEN: + continue + + offset += button.rect.GetWidth() + left_buttons_width += button.rect.GetWidth() + + offset = left_buttons_width + + if offset == 0: + offset += self._art.GetIndentSize() + + rect = wx.Rect(*self._rect) + rect.y = 0 + rect.height = self._rect.height + + # See if the given page is visible at the given tab offset (effectively scroll position) + for i in xrange(tabOffset, page_count): + + page = self._pages[i] + tab_button = self._tab_close_buttons[i] + + rect.x = offset + rect.width = self._rect.width - right_buttons_width - offset - 2 + + if rect.width <= 0: + return False # haven't found the tab, and we've run out of space, so return False + + size, x_extent = self._art.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, tab_button.cur_state, page.control) + offset += x_extent + + if i == tabPage: + + # If not all of the tab is visible, and supposing there's space to display it all, + # we could do better so we return False. + if (self._rect.width - right_buttons_width - offset - 2) <= 0 and (self._rect.width - right_buttons_width - left_buttons_width) > x_extent: + return False + else: + return True + + # Shouldn't really get here, but if it does, assume the tab is visible to prevent + # further looping in calling code. + return True + + + def MakeTabVisible(self, tabPage, win): + """ + Make the tab visible if it wasn't already. + + :param `tabPage`: the tab index; + :param `win`: an instance of `wx.Window` derived window. + """ + + dc = wx.ClientDC(win) + + if not self.IsTabVisible(tabPage, self.GetTabOffset(), dc, win): + for i in xrange(len(self._pages)): + if self.IsTabVisible(tabPage, i, dc, win): + self.SetTabOffset(i) + win.Refresh() + return + + + def TabHitTest(self, x, y): + """ + TabHitTest() tests if a tab was hit, passing the window pointer + back if that condition was fulfilled. + + :param `x`: the mouse `x` position; + :param `y`: the mouse `y` position. + """ + + if not self._rect.Contains((x,y)): + return None + + btn = self.ButtonHitTest(x, y) + if btn: + if btn in self._buttons: + return None + + for i in xrange(self._tab_offset, len(self._pages)): + page = self._pages[i] + if page.rect.Contains((x,y)): + return page.window + + return None + + + def ButtonHitTest(self, x, y): + """ + Tests if a button was hit. + + :param `x`: the mouse `x` position; + :param `y`: the mouse `y` position. + + :returns: and instance of L{AuiTabContainerButton} if a button was hit, ``None`` otherwise. + """ + + if not self._rect.Contains((x,y)): + return None + + for button in self._buttons: + if button.rect.Contains((x,y)) and \ + (button.cur_state & (AUI_BUTTON_STATE_HIDDEN|AUI_BUTTON_STATE_DISABLED)) == 0: + return button + + for button in self._tab_close_buttons: + if button.rect.Contains((x,y)) and \ + (button.cur_state & (AUI_BUTTON_STATE_HIDDEN|AUI_BUTTON_STATE_DISABLED)) == 0: + return button + + return None + + + def DoShowHide(self): + """ + This function shows the active window, then hides all of the other windows + (in that order). + """ + + pages = self.GetPages() + + # show new active page first + for page in pages: + if page.active: + page.window.Show(True) + break + + # hide all other pages + for page in pages: + if not page.active: + page.window.Show(False) + + +# ---------------------------------------------------------------------- +# -- AuiTabCtrl class implementation -- + +class AuiTabCtrl(wx.PyControl, AuiTabContainer): + """ + This is an actual `wx.Window`-derived window which can be used as a tab + control in the normal sense. + """ + + def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, + style=wx.NO_BORDER|wx.WANTS_CHARS|wx.TAB_TRAVERSAL): + """ + Default class constructor. + Used internally, do not call it in your code! + + :param `parent`: the L{AuiTabCtrl} parent; + :param `id`: an identifier for the control: a value of -1 is taken to mean a default; + :param `pos`: the control position. A value of (-1, -1) indicates a default position, + chosen by either the windowing system or wxPython, depending on platform; + :param `size`: the control size. A value of (-1, -1) indicates a default size, + chosen by either the windowing system or wxPython, depending on platform; + :param `style`: the window style. + """ + + wx.PyControl.__init__(self, parent, id, pos, size, style, name="AuiTabCtrl") + AuiTabContainer.__init__(self, parent) + + self._click_pt = wx.Point(-1, -1) + self._is_dragging = False + self._hover_button = None + self._pressed_button = None + self._drag_image = None + self._drag_img_offset = (0, 0) + self._on_button = False + + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) + self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick) + self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) + self.Bind(wx.EVT_MIDDLE_DOWN, self.OnMiddleDown) + self.Bind(wx.EVT_MIDDLE_UP, self.OnMiddleUp) + self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) + self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) + self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus) + self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) + self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) + self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnCaptureLost) + self.Bind(wx.EVT_MOTION, self.OnMotion) + self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) + self.Bind(EVT_AUINOTEBOOK_BUTTON, self.OnButton) + + + def IsDragging(self): + """ Returns whether the user is dragging a tab with the mouse or not. """ + + return self._is_dragging + + + def GetDefaultBorder(self): + """ Returns the default border style for L{AuiTabCtrl}. """ + + return wx.BORDER_NONE + + + def OnPaint(self, event): + """ + Handles the ``wx.EVT_PAINT`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.PaintEvent` event to be processed. + """ + + dc = wx.PaintDC(self) + dc.SetFont(self.GetFont()) + + if self.GetPageCount() > 0: + self.Render(dc, self) + + + def OnEraseBackground(self, event): + """ + Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.EraseEvent` event to be processed. + + :note: This is intentionally empty, to reduce flicker. + """ + + pass + + + def DoGetBestSize(self): + """ + Gets the size which best suits the window: for a control, it would be the + minimal size which doesn't truncate the control, for a panel - the same + size as it would have after a call to `Fit()`. + + :note: Overridden from `wx.PyControl`. + """ + + return wx.Size(self._rect.width, self._rect.height) + + + def OnSize(self, event): + """ + Handles the ``wx.EVT_SIZE`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.SizeEvent` event to be processed. + """ + + s = event.GetSize() + self.SetTabRect(wx.Rect(0, 0, s.GetWidth(), s.GetHeight())) + + + def OnLeftDown(self, event): + """ + Handles the ``wx.EVT_LEFT_DOWN`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + self.CaptureMouse() + self._click_pt = wx.Point(-1, -1) + self._is_dragging = False + self._click_tab = None + self._pressed_button = None + + wnd = self.TabHitTest(event.GetX(), event.GetY()) + + if wnd is not None: + new_selection = self.GetIdxFromWindow(wnd) + + # AuiNotebooks always want to receive this event + # even if the tab is already active, because they may + # have multiple tab controls + if new_selection != self.GetActivePage() or isinstance(self.GetParent(), AuiNotebook): + + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) + e.SetSelection(new_selection) + e.SetOldSelection(self.GetActivePage()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + self._click_pt.x = event.GetX() + self._click_pt.y = event.GetY() + self._click_tab = wnd + else: + page_index = self.GetActivePage() + if page_index != wx.NOT_FOUND: + self.GetWindowFromIdx(page_index).SetFocus() + + if self._hover_button: + self._pressed_button = self._hover_button + self._pressed_button.cur_state = AUI_BUTTON_STATE_PRESSED + self._on_button = True + self.Refresh() + self.Update() + + + def OnCaptureLost(self, event): + """ + Handles the ``wx.EVT_MOUSE_CAPTURE_LOST`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseCaptureLostEvent` event to be processed. + """ + + if self._is_dragging: + self._is_dragging = False + self._on_button = False + + if self._drag_image: + self._drag_image.EndDrag() + del self._drag_image + self._drag_image = None + + event = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, self.GetId()) + event.SetSelection(self.GetIdxFromWindow(self._click_tab)) + event.SetOldSelection(event.GetSelection()) + event.SetEventObject(self) + self.GetEventHandler().ProcessEvent(event) + + + def OnLeftUp(self, event): + """ + Handles the ``wx.EVT_LEFT_UP`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + self._on_button = False + + if self._is_dragging: + + if self.HasCapture(): + self.ReleaseMouse() + + self._is_dragging = False + if self._drag_image: + self._drag_image.EndDrag() + del self._drag_image + self._drag_image = None + self.GetParent().Refresh() + + evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, self.GetId()) + evt.SetSelection(self.GetIdxFromWindow(self._click_tab)) + evt.SetOldSelection(evt.GetSelection()) + evt.SetEventObject(self) + self.GetEventHandler().ProcessEvent(evt) + + return + + self.GetParent()._mgr.HideHint() + + if self.HasCapture(): + self.ReleaseMouse() + + if self._hover_button: + self._pressed_button = self._hover_button + + if self._pressed_button: + + # make sure we're still clicking the button + button = self.ButtonHitTest(event.GetX(), event.GetY()) + + if button is None: + return + + if button != self._pressed_button: + self._pressed_button = None + return + + self.Refresh() + self.Update() + + if self._pressed_button.cur_state & AUI_BUTTON_STATE_DISABLED == 0: + + evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, self.GetId()) + evt.SetSelection(self.GetIdxFromWindow(self._click_tab)) + evt.SetInt(self._pressed_button.id) + evt.SetEventObject(self) + eventHandler = self.GetEventHandler() + + if eventHandler is not None: + eventHandler.ProcessEvent(evt) + + self._pressed_button = None + + self._click_pt = wx.Point(-1, -1) + self._is_dragging = False + self._click_tab = None + + + def OnMiddleUp(self, event): + """ + Handles the ``wx.EVT_MIDDLE_UP`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + eventHandler = self.GetEventHandler() + if not isinstance(eventHandler, AuiTabCtrl): + event.Skip() + return + + x, y = event.GetX(), event.GetY() + wnd = self.TabHitTest(x, y) + + if wnd: + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, self.GetId()) + e.SetEventObject(self) + e.SetSelection(self.GetIdxFromWindow(wnd)) + self.GetEventHandler().ProcessEvent(e) + elif not self.ButtonHitTest(x, y): + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_UP, self.GetId()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnMiddleDown(self, event): + """ + Handles the ``wx.EVT_MIDDLE_DOWN`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + eventHandler = self.GetEventHandler() + if not isinstance(eventHandler, AuiTabCtrl): + event.Skip() + return + + x, y = event.GetX(), event.GetY() + wnd = self.TabHitTest(x, y) + + if wnd: + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, self.GetId()) + e.SetEventObject(self) + e.SetSelection(self.GetIdxFromWindow(wnd)) + self.GetEventHandler().ProcessEvent(e) + elif not self.ButtonHitTest(x, y): + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_MIDDLE_DOWN, self.GetId()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnRightUp(self, event): + """ + Handles the ``wx.EVT_RIGHT_UP`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + x, y = event.GetX(), event.GetY() + wnd = self.TabHitTest(x, y) + + if wnd: + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, self.GetId()) + e.SetEventObject(self) + e.SetSelection(self.GetIdxFromWindow(wnd)) + self.GetEventHandler().ProcessEvent(e) + elif not self.ButtonHitTest(x, y): + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_UP, self.GetId()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnRightDown(self, event): + """ + Handles the ``wx.EVT_RIGHT_DOWN`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + x, y = event.GetX(), event.GetY() + wnd = self.TabHitTest(x, y) + + if wnd: + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, self.GetId()) + e.SetEventObject(self) + e.SetSelection(self.GetIdxFromWindow(wnd)) + self.GetEventHandler().ProcessEvent(e) + elif not self.ButtonHitTest(x, y): + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_RIGHT_DOWN, self.GetId()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnLeftDClick(self, event): + """ + Handles the ``wx.EVT_LEFT_DCLICK`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + x, y = event.GetX(), event.GetY() + wnd = self.TabHitTest(x, y) + + if wnd: + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK, self.GetId()) + e.SetEventObject(self) + e.SetSelection(self.GetIdxFromWindow(wnd)) + self.GetEventHandler().ProcessEvent(e) + elif not self.ButtonHitTest(x, y): + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, self.GetId()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnMotion(self, event): + """ + Handles the ``wx.EVT_MOTION`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + pos = event.GetPosition() + + # check if the mouse is hovering above a button + + button = self.ButtonHitTest(pos.x, pos.y) + wnd = self.TabHitTest(pos.x, pos.y) + + if wnd is not None: + mouse_tab = self.GetIdxFromWindow(wnd) + if not self._pages[mouse_tab].enabled: + self._hover_button = None + return + + if self._on_button: + return + + if button: + + if self._hover_button and button != self._hover_button: + self._hover_button.cur_state = AUI_BUTTON_STATE_NORMAL + self._hover_button = None + self.Refresh() + self.Update() + + if button.cur_state != AUI_BUTTON_STATE_HOVER: + button.cur_state = AUI_BUTTON_STATE_HOVER + self.Refresh() + self.Update() + self._hover_button = button + return + + else: + + if self._hover_button: + self._hover_button.cur_state = AUI_BUTTON_STATE_NORMAL + self._hover_button = None + self.Refresh() + self.Update() + + if not event.LeftIsDown() or self._click_pt == wx.Point(-1, -1): + return + + if not self.HasCapture(): + return + + wnd = self.TabHitTest(pos.x, pos.y) + + if not self._is_dragging: + + drag_x_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_X) + drag_y_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_Y) + + if abs(pos.x - self._click_pt.x) > drag_x_threshold or \ + abs(pos.y - self._click_pt.y) > drag_y_threshold: + + self._is_dragging = True + + if self._drag_image: + self._drag_image.EndDrag() + del self._drag_image + self._drag_image = None + + if self._agwFlags & AUI_NB_DRAW_DND_TAB: + # Create the custom draw image from the icons and the text of the item + mouse_tab = self.GetIdxFromWindow(wnd) + page = self._pages[mouse_tab] + tab_button = self._tab_close_buttons[mouse_tab] + self._drag_image = TabDragImage(self, page, tab_button.cur_state, self._art) + + if self._agwFlags & AUI_NB_TAB_FLOAT: + self._drag_image.BeginDrag(wx.Point(0,0), self, fullScreen=True) + else: + self._drag_image.BeginDragBounded(wx.Point(0,0), self, self.GetParent()) + + # Capture the mouse cursor position offset relative to + # The tab image location + self._drag_img_offset = (pos[0] - page.rect.x, + pos[1] - page.rect.y) + + self._drag_image.Show() + + if not wnd: + evt2 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, self.GetId()) + evt2.SetSelection(self.GetIdxFromWindow(self._click_tab)) + evt2.SetOldSelection(evt2.GetSelection()) + evt2.SetEventObject(self) + self.GetEventHandler().ProcessEvent(evt2) + if evt2.GetDispatched(): + return + + evt3 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, self.GetId()) + evt3.SetSelection(self.GetIdxFromWindow(self._click_tab)) + evt3.SetOldSelection(evt3.GetSelection()) + evt3.SetEventObject(self) + self.GetEventHandler().ProcessEvent(evt3) + + if self._drag_image: + # Apply the drag images offset + pos -= self._drag_img_offset + self._drag_image.Move(pos) + + + def OnLeaveWindow(self, event): + """ + Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.MouseEvent` event to be processed. + """ + + if self._hover_button: + self._hover_button.cur_state = AUI_BUTTON_STATE_NORMAL + self._hover_button = None + self.Refresh() + self.Update() + + + def OnButton(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_BUTTON`` event for L{AuiTabCtrl}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + button = event.GetInt() + + if button == AUI_BUTTON_LEFT or button == AUI_BUTTON_RIGHT: + if button == AUI_BUTTON_LEFT: + if self.GetTabOffset() > 0: + + self.SetTabOffset(self.GetTabOffset()-1) + self.Refresh() + self.Update() + else: + self.SetTabOffset(self.GetTabOffset()+1) + self.Refresh() + self.Update() + + elif button == AUI_BUTTON_WINDOWLIST: + idx = self.GetArtProvider().ShowDropDown(self, self._pages, self.GetActivePage()) + + if idx != -1: + + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) + e.SetSelection(idx) + e.SetOldSelection(self.GetActivePage()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + else: + event.Skip() + + + def OnSetFocus(self, event): + """ + Handles the ``wx.EVT_SET_FOCUS`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.FocusEvent` event to be processed. + """ + + self.Refresh() + + + def OnKillFocus(self, event): + """ + Handles the ``wx.EVT_KILL_FOCUS`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.FocusEvent` event to be processed. + """ + + self.Refresh() + + + def OnKeyDown(self, event): + """ + Handles the ``wx.EVT_KEY_DOWN`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.KeyEvent` event to be processed. + """ + + key = event.GetKeyCode() + nb = self.GetParent() + + if key == wx.WXK_LEFT: + nb.AdvanceSelection(False) + self.SetFocus() + + elif key == wx.WXK_RIGHT: + nb.AdvanceSelection(True) + self.SetFocus() + + elif key == wx.WXK_HOME: + newPage = 0 + nb.SetSelection(newPage) + self.SetFocus() + + elif key == wx.WXK_END: + newPage = nb.GetPageCount() - 1 + nb.SetSelection(newPage) + self.SetFocus() + + elif key == wx.WXK_TAB: + if not event.ControlDown(): + flags = 0 + if not event.ShiftDown(): flags |= wx.NavigationKeyEvent.IsForward + if event.CmdDown(): flags |= wx.NavigationKeyEvent.WinChange + self.Navigate(flags) + else: + + if not nb or not isinstance(nb, AuiNotebook): + event.Skip() + return + + bForward = bWindowChange = 0 + if not event.ShiftDown(): bForward |= wx.NavigationKeyEvent.IsForward + if event.CmdDown(): bWindowChange |= wx.NavigationKeyEvent.WinChange + + keyEvent = wx.NavigationKeyEvent() + keyEvent.SetDirection(bForward) + keyEvent.SetWindowChange(bWindowChange) + keyEvent.SetFromTab(True) + keyEvent.SetEventObject(nb) + + if not nb.GetEventHandler().ProcessEvent(keyEvent): + + # Not processed? Do an explicit tab into the page. + win = self.GetWindowFromIdx(self.GetActivePage()) + if win: + win.SetFocus() + + self.SetFocus() + + return + + else: + event.Skip() + + + def OnKeyDown2(self, event): + """ + Deprecated. + + Handles the ``wx.EVT_KEY_DOWN`` event for L{AuiTabCtrl}. + + :param `event`: a `wx.KeyEvent` event to be processed. + + :warning: This method implementation is now deprecated. Refer to L{OnKeyDown} + for the correct one. + """ + + if self.GetActivePage() == -1: + event.Skip() + return + + # We can't leave tab processing to the system on Windows, tabs and keys + # get eaten by the system and not processed properly if we specify both + # wxTAB_TRAVERSAL and wxWANTS_CHARS. And if we specify just wxTAB_TRAVERSAL, + # we don't key arrow key events. + + key = event.GetKeyCode() + + if key == wx.WXK_NUMPAD_PAGEUP: + key = wx.WXK_PAGEUP + if key == wx.WXK_NUMPAD_PAGEDOWN: + key = wx.WXK_PAGEDOWN + if key == wx.WXK_NUMPAD_HOME: + key = wx.WXK_HOME + if key == wx.WXK_NUMPAD_END: + key = wx.WXK_END + if key == wx.WXK_NUMPAD_LEFT: + key = wx.WXK_LEFT + if key == wx.WXK_NUMPAD_RIGHT: + key = wx.WXK_RIGHT + + if key == wx.WXK_TAB or key == wx.WXK_PAGEUP or key == wx.WXK_PAGEDOWN: + + bCtrlDown = event.ControlDown() + bShiftDown = event.ShiftDown() + + bForward = (key == wx.WXK_TAB and not bShiftDown) or (key == wx.WXK_PAGEDOWN) + bWindowChange = (key == wx.WXK_PAGEUP) or (key == wx.WXK_PAGEDOWN) or bCtrlDown + bFromTab = (key == wx.WXK_TAB) + + nb = self.GetParent() + if not nb or not isinstance(nb, AuiNotebook): + event.Skip() + return + + keyEvent = wx.NavigationKeyEvent() + keyEvent.SetDirection(bForward) + keyEvent.SetWindowChange(bWindowChange) + keyEvent.SetFromTab(bFromTab) + keyEvent.SetEventObject(nb) + + if not nb.GetEventHandler().ProcessEvent(keyEvent): + + # Not processed? Do an explicit tab into the page. + win = self.GetWindowFromIdx(self.GetActivePage()) + if win: + win.SetFocus() + + return + + if len(self._pages) < 2: + event.Skip() + return + + newPage = -1 + + if self.GetLayoutDirection() == wx.Layout_RightToLeft: + forwardKey = wx.WXK_LEFT + backwardKey = wx.WXK_RIGHT + else: + forwardKey = wx.WXK_RIGHT + backwardKey = wx.WXK_LEFT + + if key == forwardKey: + if self.GetActivePage() == -1: + newPage = 0 + elif self.GetActivePage() < len(self._pages) - 1: + newPage = self.GetActivePage() + 1 + + elif key == backwardKey: + if self.GetActivePage() == -1: + newPage = len(self._pages) - 1 + elif self.GetActivePage() > 0: + newPage = self.GetActivePage() - 1 + + elif key == wx.WXK_HOME: + newPage = 0 + + elif key == wx.WXK_END: + newPage = len(self._pages) - 1 + + else: + event.Skip() + + if newPage != -1: + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) + e.SetSelection(newPage) + e.SetOldSelection(newPage) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + else: + event.Skip() + + +# ---------------------------------------------------------------------- + +class TabFrame(wx.PyWindow): + """ + TabFrame is an interesting case. It's important that all child pages + of the multi-notebook control are all actually children of that control + (and not grandchildren). TabFrame facilitates this. There is one + instance of TabFrame for each tab control inside the multi-notebook. + + It's important to know that TabFrame is not a real window, but it merely + used to capture the dimensions/positioning of the internal tab control and + it's managed page windows. + """ + + def __init__(self, parent): + """ + Default class constructor. + Used internally, do not call it in your code! + """ + + pre = wx.PrePyWindow() + + self._tabs = None + self._rect = wx.Rect(0, 0, 200, 200) + self._tab_ctrl_height = 20 + self._tab_rect = wx.Rect() + self._parent = parent + + self.PostCreate(pre) + + + def SetTabCtrlHeight(self, h): + """ + Sets the tab control height. + + :param `h`: the tab area height. + """ + + self._tab_ctrl_height = h + + + def DoSetSize(self, x, y, width, height, flags=wx.SIZE_AUTO): + """ + Sets the position and size of the window in pixels. The `flags` + parameter indicates the interpretation of the other params if they are + equal to -1. + + :param `x`: the window `x` position; + :param `y`: the window `y` position; + :param `width`: the window width; + :param `height`: the window height; + :param `flags`: may have one of this bit set: + + =================================== ====================================== + Size Flags Description + =================================== ====================================== + ``wx.SIZE_AUTO`` A -1 indicates that a class-specific default should be used. + ``wx.SIZE_AUTO_WIDTH`` A -1 indicates that a class-specific default should be used for the width. + ``wx.SIZE_AUTO_HEIGHT`` A -1 indicates that a class-specific default should be used for the height. + ``wx.SIZE_USE_EXISTING`` Existing dimensions should be used if -1 values are supplied. + ``wx.SIZE_ALLOW_MINUS_ONE`` Allow dimensions of -1 and less to be interpreted as real dimensions, not default values. + ``wx.SIZE_FORCE`` Normally, if the position and the size of the window are already the same as the parameters of this function, nothing is done. but with this flag a window resize may be forced even in this case (supported in wx 2.6.2 and later and only implemented for MSW and ignored elsewhere currently) + =================================== ====================================== + + :note: Overridden from `wx.PyControl`. + """ + + self._rect = wx.Rect(x, y, max(1, width), max(1, height)) + self.DoSizing() + + + def DoGetSize(self): + """ + Returns the window size. + + :note: Overridden from `wx.PyControl`. + """ + + return self._rect.width, self._rect.height + + + def DoGetClientSize(self): + """ + Returns the window client size. + + :note: Overridden from `wx.PyControl`. + """ + + return self._rect.width, self._rect.height + + + def Show(self, show=True): + """ + Shows/hides the window. + + :param `show`: ``True`` to show the window, ``False`` otherwise. + + :note: Overridden from `wx.PyControl`, this method always returns ``False`` as + L{TabFrame} should never be phisically shown on screen. + """ + + return False + + + def DoSizing(self): + """ Does the actual sizing of the tab control. """ + + if not self._tabs: + return + + hideOnSingle = ((self._tabs.GetAGWFlags() & AUI_NB_HIDE_ON_SINGLE_TAB) and \ + self._tabs.GetPageCount() <= 1) + + if not hideOnSingle and not self._parent._hide_tabs: + tab_height = self._tab_ctrl_height + + self._tab_rect = wx.Rect(self._rect.x, self._rect.y, self._rect.width, self._tab_ctrl_height) + + if self._tabs.GetAGWFlags() & AUI_NB_BOTTOM: + self._tab_rect = wx.Rect(self._rect.x, self._rect.y + self._rect.height - tab_height, + self._rect.width, tab_height) + self._tabs.SetDimensions(self._rect.x, self._rect.y + self._rect.height - tab_height, + self._rect.width, tab_height) + self._tabs.SetTabRect(wx.Rect(0, 0, self._rect.width, tab_height)) + + else: + + self._tab_rect = wx.Rect(self._rect.x, self._rect.y, self._rect.width, tab_height) + self._tabs.SetDimensions(self._rect.x, self._rect.y, self._rect.width, tab_height) + self._tabs.SetTabRect(wx.Rect(0, 0, self._rect.width, tab_height)) + + # TODO: elif (GetAGWFlags() & AUI_NB_LEFT) + # TODO: elif (GetAGWFlags() & AUI_NB_RIGHT) + + self._tabs.Refresh() + self._tabs.Update() + + else: + + tab_height = 0 + self._tabs.SetDimensions(self._rect.x, self._rect.y, self._rect.width, tab_height) + self._tabs.SetTabRect(wx.Rect(0, 0, self._rect.width, tab_height)) + + pages = self._tabs.GetPages() + + for page in pages: + + height = self._rect.height - tab_height + + if height < 0: + # avoid passing negative height to wx.Window.SetSize(), this + # results in assert failures/GTK+ warnings + height = 0 + + if self._tabs.GetAGWFlags() & AUI_NB_BOTTOM: + page.window.SetDimensions(self._rect.x, self._rect.y, self._rect.width, height) + + else: + page.window.SetDimensions(self._rect.x, self._rect.y + tab_height, + self._rect.width, height) + + # TODO: elif (GetAGWFlags() & AUI_NB_LEFT) + # TODO: elif (GetAGWFlags() & AUI_NB_RIGHT) + + if repr(page.window.__class__).find("AuiMDIChildFrame") >= 0: + page.window.ApplyMDIChildFrameRect() + + + def Update(self): + """ + Calling this method immediately repaints the invalidated area of the window + and all of its children recursively while this would usually only happen when + the flow of control returns to the event loop. + + :note: Notice that this function doesn't invalidate any area of the window so + nothing happens if nothing has been invalidated (i.e. marked as requiring a redraw). + Use `Refresh` first if you want to immediately redraw the window unconditionally. + + :note: Overridden from `wx.PyControl`. + """ + + # does nothing + pass + + +# ---------------------------------------------------------------------- +# -- AuiNotebook class implementation -- + +class AuiNotebook(wx.PyPanel): + """ + AuiNotebook is a notebook control which implements many features common in + applications with dockable panes. Specifically, AuiNotebook implements functionality + which allows the user to rearrange tab order via drag-and-drop, split the tab window + into many different splitter configurations, and toggle through different themes to + customize the control's look and feel. + + An effort has been made to try to maintain an API as similar to that of `wx.Notebook`. + + The default theme that is used is L{AuiDefaultTabArt}, which provides a modern, glossy + look and feel. The theme can be changed by calling L{AuiNotebook.SetArtProvider}. + """ + + def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, + style=0, agwStyle=AUI_NB_DEFAULT_STYLE): + """ + Default class constructor. + + :param `parent`: the L{AuiNotebook} parent; + :param `id`: an identifier for the control: a value of -1 is taken to mean a default; + :param `pos`: the control position. A value of (-1, -1) indicates a default position, + chosen by either the windowing system or wxPython, depending on platform; + :param `size`: the control size. A value of (-1, -1) indicates a default size, + chosen by either the windowing system or wxPython, depending on platform; + :param `style`: the underlying `wx.PyPanel` window style; + :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook + ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. + ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. + ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook + ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab + ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging + ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control + ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width + ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed + ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available + ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar + ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab + ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs + ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click + ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks + ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present + ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows + ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items + ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) + ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages + ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) + ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs + ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle + ==================================== ================================== + + Default value for `agwStyle` is: + ``AUI_NB_DEFAULT_STYLE`` = ``AUI_NB_TOP`` | ``AUI_NB_TAB_SPLIT`` | ``AUI_NB_TAB_MOVE`` | ``AUI_NB_SCROLL_BUTTONS`` | ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` | ``AUI_NB_MIDDLE_CLICK_CLOSE`` | ``AUI_NB_DRAW_DND_TAB`` + + """ + + self._curpage = -1 + self._tab_id_counter = AuiBaseTabCtrlId + self._dummy_wnd = None + self._hide_tabs = False + self._sash_dclick_unsplit = False + self._tab_ctrl_height = 20 + self._requested_bmp_size = wx.Size(-1, -1) + self._requested_tabctrl_height = -1 + self._textCtrl = None + self._tabBounds = (-1, -1) + self._click_tab = None + + wx.PyPanel.__init__(self, parent, id, pos, size, style|wx.BORDER_NONE|wx.TAB_TRAVERSAL) + self._mgr = framemanager.AuiManager() + self._tabs = AuiTabContainer(self) + + self.InitNotebook(agwStyle) + + + def GetTabContainer(self): + """ Returns the instance of L{AuiTabContainer}. """ + + return self._tabs + + + def InitNotebook(self, agwStyle): + """ + Contains common initialization code called by all constructors. + + :param `agwStyle`: the notebook style. + + :see: L{__init__} + """ + + self.SetName("AuiNotebook") + self._agwFlags = agwStyle + + self._popupWin = None + self._naviIcon = None + self._imageList = None + self._last_drag_x = 0 + + self._normal_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + self._selected_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + self._selected_font.SetWeight(wx.BOLD) + + self.SetArtProvider(TA.AuiDefaultTabArt()) + + self._dummy_wnd = wx.Window(self, wx.ID_ANY, wx.Point(0, 0), wx.Size(0, 0)) + self._dummy_wnd.SetSize((200, 200)) + self._dummy_wnd.Show(False) + + self._mgr.SetManagedWindow(self) + self._mgr.SetAGWFlags(AUI_MGR_DEFAULT) + self._mgr.SetDockSizeConstraint(1.0, 1.0) # no dock size constraint + + self._mgr.AddPane(self._dummy_wnd, framemanager.AuiPaneInfo().Name("dummy").Bottom().CaptionVisible(False).Show(False)) + self._mgr.Update() + + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocusNotebook) + self.Bind(EVT_AUINOTEBOOK_PAGE_CHANGING, self.OnTabClicked, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_BEGIN_DRAG, self.OnTabBeginDrag, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_END_DRAG, self.OnTabEndDrag, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_DRAG_MOTION, self.OnTabDragMotion, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_CANCEL_DRAG, self.OnTabCancelDrag, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_BUTTON, self.OnTabButton, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, self.OnTabMiddleDown, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_TAB_MIDDLE_UP, self.OnTabMiddleUp, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_TAB_RIGHT_DOWN, self.OnTabRightDown, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_TAB_RIGHT_UP, self.OnTabRightUp, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_BG_DCLICK, self.OnTabBgDClick, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + self.Bind(EVT_AUINOTEBOOK_TAB_DCLICK, self.OnTabDClick, + id=AuiBaseTabCtrlId, id2=AuiBaseTabCtrlId+500) + + self.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigationKeyNotebook) + + + def SetArtProvider(self, art): + """ + Sets the art provider to be used by the notebook. + + :param `art`: an art provider. + """ + + self._tabs.SetArtProvider(art) + self.UpdateTabCtrlHeight(force=True) + + + def SavePerspective(self): + """ + Saves the entire user interface layout into an encoded string, which can then + be stored by the application (probably using `wx.Config`). When a perspective + is restored using L{LoadPerspective}, the entire user interface will return + to the state it was when the perspective was saved. + """ + + # Build list of panes/tabs + tabs = "" + all_panes = self._mgr.GetAllPanes() + + for pane in all_panes: + + if pane.name == "dummy": + continue + + tabframe = pane.window + + if tabs: + tabs += "|" + + tabs += pane.name + "=" + + # add tab id's + page_count = tabframe._tabs.GetPageCount() + + for p in xrange(page_count): + + page = tabframe._tabs.GetPage(p) + page_idx = self._tabs.GetIdxFromWindow(page.window) + + if p: + tabs += "," + + if p == tabframe._tabs.GetActivePage(): + tabs += "+" + elif page_idx == self._curpage: + tabs += "*" + + tabs += "%u"%page_idx + + tabs += "@" + + # Add frame perspective + tabs += self._mgr.SavePerspective() + + return tabs + + + def LoadPerspective(self, layout): + """ + Loads a layout which was saved with L{SavePerspective}. + + :param `layout`: a string which contains a saved L{AuiNotebook} layout. + """ + + # Remove all tab ctrls (but still keep them in main index) + tab_count = self._tabs.GetPageCount() + for i in xrange(tab_count): + wnd = self._tabs.GetWindowFromIdx(i) + + # find out which onscreen tab ctrl owns this tab + ctrl, ctrl_idx = self.FindTab(wnd) + if not ctrl: + return False + + # remove the tab from ctrl + if not ctrl.RemovePage(wnd): + return False + + self.RemoveEmptyTabFrames() + + sel_page = 0 + tabs = layout[0:layout.index("@")] + to_break1 = False + + while 1: + + if "|" not in tabs: + to_break1 = True + tab_part = tabs + else: + tab_part = tabs[0:tabs.index('|')] + + if "=" not in tab_part: + # No pages in this perspective... + return False + + # Get pane name + pane_name = tab_part[0:tab_part.index("=")] + + # create a new tab frame + new_tabs = TabFrame(self) + self._tab_id_counter += 1 + new_tabs._tabs = AuiTabCtrl(self, self._tab_id_counter) + new_tabs._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) + new_tabs.SetTabCtrlHeight(self._tab_ctrl_height) + new_tabs._tabs.SetAGWFlags(self._agwFlags) + dest_tabs = new_tabs._tabs + + # create a pane info structure with the information + # about where the pane should be added + pane_info = framemanager.AuiPaneInfo().Name(pane_name).Bottom().CaptionVisible(False) + self._mgr.AddPane(new_tabs, pane_info) + + # Get list of tab id's and move them to pane + tab_list = tab_part[tab_part.index("=")+1:] + to_break2, active_found = False, False + + while 1: + if "," not in tab_list: + to_break2 = True + tab = tab_list + else: + tab = tab_list[0:tab_list.index(",")] + tab_list = tab_list[tab_list.index(",")+1:] + + # Check if this page has an 'active' marker + c = tab[0] + if c in ['+', '*']: + tab = tab[1:] + + tab_idx = int(tab) + if tab_idx >= self.GetPageCount(): + to_break1 = True + break + + # Move tab to pane + page = self._tabs.GetPage(tab_idx) + newpage_idx = dest_tabs.GetPageCount() + dest_tabs.InsertPage(page.window, page, newpage_idx) + + if c == '+': + dest_tabs.SetActivePage(newpage_idx) + active_found = True + elif c == '*': + sel_page = tab_idx + + if to_break2: + break + + if not active_found: + dest_tabs.SetActivePage(0) + + new_tabs.DoSizing() + dest_tabs.DoShowHide() + dest_tabs.Refresh() + + if to_break1: + break + + tabs = tabs[tabs.index('|')+1:] + + # Load the frame perspective + frames = layout[layout.index('@')+1:] + self._mgr.LoadPerspective(frames) + + # Force refresh of selection + self._curpage = -1 + self.SetSelection(sel_page) + + return True + + + def SetTabCtrlHeight(self, height): + """ + Sets the tab height. + + By default, the tab control height is calculated by measuring the text + height and bitmap sizes on the tab captions. + + Calling this method will override that calculation and set the tab control + to the specified height parameter. A call to this method will override + any call to L{SetUniformBitmapSize}. Specifying -1 as the height will + return the control to its default auto-sizing behaviour. + + :param `height`: the tab control area height. + """ + + self._requested_tabctrl_height = height + + # if window is already initialized, recalculate the tab height + if self._dummy_wnd: + self.UpdateTabCtrlHeight() + + + def SetUniformBitmapSize(self, size): + """ + Ensures that all tabs will have the same height, even if some tabs + don't have bitmaps. Passing ``wx.DefaultSize`` to this + function will instruct the control to use dynamic tab height, which is + the default behaviour. Under the default behaviour, when a tab with a + large bitmap is added, the tab control's height will automatically + increase to accommodate the larger bitmap. + + :param `size`: an instance of `wx.Size` specifying the tab bitmap size. + """ + + self._requested_bmp_size = wx.Size(*size) + + # if window is already initialized, recalculate the tab height + if self._dummy_wnd: + self.UpdateTabCtrlHeight() + + + def UpdateTabCtrlHeight(self, force=False): + """ + UpdateTabCtrlHeight() does the actual tab resizing. It's meant + to be used interally. + + :param `force`: ``True`` to force the tab art to repaint. + """ + + # get the tab ctrl height we will use + height = self.CalculateTabCtrlHeight() + + # if the tab control height needs to change, update + # all of our tab controls with the new height + if self._tab_ctrl_height != height or force: + art = self._tabs.GetArtProvider() + + self._tab_ctrl_height = height + + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + + if pane.name == "dummy": + continue + + tab_frame = pane.window + tabctrl = tab_frame._tabs + tab_frame.SetTabCtrlHeight(self._tab_ctrl_height) + tabctrl.SetArtProvider(art.Clone()) + tab_frame.DoSizing() + + + def UpdateHintWindowSize(self): + """ Updates the L{AuiManager} hint window size. """ + + size = self.CalculateNewSplitSize() + + # the placeholder hint window should be set to this size + info = self._mgr.GetPane("dummy") + + if info.IsOk(): + info.MinSize(size) + info.BestSize(size) + self._dummy_wnd.SetSize(size) + + + def CalculateNewSplitSize(self): + """ Calculates the size of the new split. """ + + # count number of tab controls + tab_ctrl_count = 0 + all_panes = self._mgr.GetAllPanes() + + for pane in all_panes: + if pane.name == "dummy": + continue + + tab_ctrl_count += 1 + + # if there is only one tab control, the first split + # should happen around the middle + if tab_ctrl_count < 2: + new_split_size = self.GetClientSize() + new_split_size.x /= 2 + new_split_size.y /= 2 + + else: + + # this is in place of a more complicated calculation + # that needs to be implemented + new_split_size = wx.Size(180, 180) + + return new_split_size + + + def CalculateTabCtrlHeight(self): + """ Calculates the tab control area height. """ + + # if a fixed tab ctrl height is specified, + # just return that instead of calculating a + # tab height + if self._requested_tabctrl_height != -1: + return self._requested_tabctrl_height + + # find out new best tab height + art = self._tabs.GetArtProvider() + + return art.GetBestTabCtrlSize(self, self._tabs.GetPages(), self._requested_bmp_size) + + + def GetArtProvider(self): + """ Returns the associated art provider. """ + + return self._tabs.GetArtProvider() + + + def SetAGWWindowStyleFlag(self, agwStyle): + """ + Sets the AGW-specific style of the window. + + :param `agwStyle`: the new window style. This can be a combination of the following bits: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook + ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. + ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. + ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook + ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab + ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging + ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control + ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width + ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed + ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available + ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar + ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab + ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs + ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click + ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks + ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present + ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows + ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items + ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) + ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages + ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) + ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs + ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle + ==================================== ================================== + + :note: Please note that some styles cannot be changed after the window + creation and that `Refresh` might need to be be called after changing the + others for the change to take place immediately. + + :todo: Implementation of flags ``AUI_NB_RIGHT`` and ``AUI_NB_LEFT``. + """ + + self._agwFlags = agwStyle + + # if the control is already initialized + if self._mgr.GetManagedWindow() == self: + + # let all of the tab children know about the new style + + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabframe = pane.window + tabctrl = tabframe._tabs + tabctrl.SetAGWFlags(self._agwFlags) + tabframe.DoSizing() + tabctrl.Refresh() + tabctrl.Update() + + + def GetAGWWindowStyleFlag(self): + """ + Returns the AGW-specific style of the window. + + :see: L{SetAGWWindowStyleFlag} for a list of possible AGW-specific window styles. + """ + + return self._agwFlags + + + def AddPage(self, page, caption, select=False, bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap, control=None): + """ + Adds a page. If the `select` parameter is ``True``, calling this will generate a + page change event. + + :param `page`: the page to be added; + :param `caption`: specifies the text for the new page; + :param `select`: specifies whether the page should be selected; + :param `bitmap`: the `wx.Bitmap` to display in the enabled tab; + :param `disabled_bitmap`: the `wx.Bitmap` to display in the disabled tab; + :param `control`: a `wx.Window` instance inside a tab (or ``None``). + """ + + return self.InsertPage(self.GetPageCount(), page, caption, select, bitmap, disabled_bitmap, control) + + + def InsertPage(self, page_idx, page, caption, select=False, bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap, + control=None): + """ + This is similar to L{AddPage}, but allows the ability to specify the insert location. + + :param `page_idx`: specifies the position for the new page; + :param `page`: the page to be added; + :param `caption`: specifies the text for the new page; + :param `select`: specifies whether the page should be selected; + :param `bitmap`: the `wx.Bitmap` to display in the enabled tab; + :param `disabled_bitmap`: the `wx.Bitmap` to display in the disabled tab; + :param `control`: a `wx.Window` instance inside a tab (or ``None``). + """ + + if not page: + return False + + page.Reparent(self) + info = AuiNotebookPage() + info.window = page + info.caption = caption + info.bitmap = bitmap + info.active = False + info.control = control + + originalPaneMgr = framemanager.GetManager(page) + if originalPaneMgr: + originalPane = originalPaneMgr.GetPane(page) + + if originalPane: + info.hasCloseButton = originalPane.HasCloseButton() + + if bitmap.IsOk() and not disabled_bitmap.IsOk(): + disabled_bitmap = MakeDisabledBitmap(bitmap) + info.dis_bitmap = disabled_bitmap + + # if there are currently no tabs, the first added + # tab must be active + if self._tabs.GetPageCount() == 0: + info.active = True + + self._tabs.InsertPage(page, info, page_idx) + + # if that was the first page added, even if + # select is False, it must become the "current page" + # (though no select events will be fired) + if not select and self._tabs.GetPageCount() == 1: + select = True + + active_tabctrl = self.GetActiveTabCtrl() + if page_idx >= active_tabctrl.GetPageCount(): + active_tabctrl.AddPage(page, info) + else: + active_tabctrl.InsertPage(page, info, page_idx) + + force = False + if control: + force = True + control.Reparent(active_tabctrl) + control.Show() + + self.UpdateTabCtrlHeight(force=force) + self.DoSizing() + active_tabctrl.DoShowHide() + + # adjust selected index + if self._curpage >= page_idx: + self._curpage += 1 + + if select: + self.SetSelectionToWindow(page) + + return True + + + def DeletePage(self, page_idx): + """ + Deletes a page at the given index. Calling this method will generate a page + change event. + + :param `page_idx`: the page index to be deleted. + + :note: L{DeletePage} removes a tab from the multi-notebook, and destroys the window as well. + + :see: L{RemovePage} + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + wnd = self._tabs.GetWindowFromIdx(page_idx) + # hide the window in advance, as this will + # prevent flicker + wnd.Show(False) + + self.RemoveControlFromPage(page_idx) + + if not self.RemovePage(page_idx): + return False + + wnd.Destroy() + + return True + + + def RemovePage(self, page_idx): + """ + Removes a page, without deleting the window pointer. + + :param `page_idx`: the page index to be removed. + + :note: L{RemovePage} removes a tab from the multi-notebook, but does not destroy the window. + + :see: L{DeletePage} + """ + + # save active window pointer + active_wnd = None + if self._curpage >= 0: + active_wnd = self._tabs.GetWindowFromIdx(self._curpage) + + # save pointer of window being deleted + wnd = self._tabs.GetWindowFromIdx(page_idx) + new_active = None + + # make sure we found the page + if not wnd: + return False + + # find out which onscreen tab ctrl owns this tab + ctrl, ctrl_idx = self.FindTab(wnd) + if not ctrl: + return False + + currentPage = ctrl.GetPage(ctrl_idx) + is_curpage = (self._curpage == page_idx) + is_active_in_split = currentPage.active + + # remove the tab from main catalog + if not self._tabs.RemovePage(wnd): + return False + + # remove the tab from the onscreen tab ctrl + ctrl.RemovePage(wnd) + + if is_active_in_split: + + ctrl_new_page_count = ctrl.GetPageCount() + + if ctrl_idx >= ctrl_new_page_count: + ctrl_idx = ctrl_new_page_count - 1 + + if ctrl_idx >= 0 and ctrl_idx < ctrl.GetPageCount(): + + ctrl_idx = self.FindNextActiveTab(ctrl_idx, ctrl) + + # set new page as active in the tab split + ctrl.SetActivePage(ctrl_idx) + + # if the page deleted was the current page for the + # entire tab control, then record the window + # pointer of the new active page for activation + if is_curpage: + new_active = ctrl.GetWindowFromIdx(ctrl_idx) + + else: + + # we are not deleting the active page, so keep it the same + new_active = active_wnd + + if not new_active: + + # we haven't yet found a new page to active, + # so select the next page from the main tab + # catalogue + + if 0 <= page_idx < self._tabs.GetPageCount(): + new_active = self._tabs.GetPage(page_idx).window + if not new_active and self._tabs.GetPageCount() > 0: + new_active = self._tabs.GetPage(0).window + + self.RemoveEmptyTabFrames() + + # set new active pane + if new_active: + if not self.IsBeingDeleted(): + self._curpage = -1 + self.SetSelectionToWindow(new_active) + else: + self._curpage = -1 + self._tabs.SetNoneActive() + + return True + + + def FindNextActiveTab(self, ctrl_idx, ctrl): + """ + Finds the next active tab (used mainly when L{AuiNotebook} has inactive/disabled + tabs in it). + + :param `ctrl_idx`: the index of the first (most obvious) tab to check for active status; + :param `ctrl`: an instance of L{AuiTabCtrl}. + """ + + if self.GetEnabled(ctrl_idx): + return ctrl_idx + + for indx in xrange(ctrl_idx, ctrl.GetPageCount()): + if self.GetEnabled(indx): + return indx + + for indx in xrange(ctrl_idx, -1, -1): + if self.GetEnabled(indx): + return indx + + return 0 + + + def HideAllTabs(self, hidden=True): + """ + Hides all tabs on the L{AuiNotebook} control. + + :param `hidden`: if ``True`` hides all tabs. + """ + + self._hide_tabs = hidden + + + def SetSashDClickUnsplit(self, unsplit=True): + """ + Sets whether to unsplit a splitted L{AuiNotebook} when double-clicking on a sash. + + :param `unsplit`: ``True`` to unsplit on sash double-clicking, ``False`` otherwise. + """ + + self._sash_dclick_unsplit = unsplit + + + def GetSashDClickUnsplit(self): + """ + Returns whether a splitted L{AuiNotebook} can be unsplitted by double-clicking + on the splitter sash. + """ + + return self._sash_dclick_unsplit + + + def SetMinMaxTabWidth(self, minTabWidth, maxTabWidth): + """ + Sets the minimum and/or the maximum tab widths for L{AuiNotebook} when the + ``AUI_NB_TAB_FIXED_WIDTH`` style is defined. + + Pass -1 to either `minTabWidth` or `maxTabWidth` to reset to the default tab + width behaviour for L{AuiNotebook}. + + :param `minTabWidth`: the minimum allowed tab width, in pixels; + :param `maxTabWidth`: the maximum allowed tab width, in pixels. + + :note: Minimum and maximum tabs widths are used only when the ``AUI_NB_TAB_FIXED_WIDTH`` + style is present. + """ + + if minTabWidth > maxTabWidth: + raise Exception("Minimum tab width must be less or equal than maximum tab width") + + self._tabBounds = (minTabWidth, maxTabWidth) + self.SetAGWWindowStyleFlag(self._agwFlags) + + + def GetMinMaxTabWidth(self): + """ + Returns the minimum and the maximum tab widths for L{AuiNotebook} when the + ``AUI_NB_TAB_FIXED_WIDTH`` style is defined. + + :note: Minimum and maximum tabs widths are used only when the ``AUI_NB_TAB_FIXED_WIDTH`` + style is present. + + :see: L{SetMinMaxTabWidth} for more information. + """ + + return self._tabBounds + + + def GetPageIndex(self, page_wnd): + """ + Returns the page index for the specified window. If the window is not + found in the notebook, ``wx.NOT_FOUND`` is returned. + """ + + return self._tabs.GetIdxFromWindow(page_wnd) + + + def SetPageText(self, page_idx, text): + """ + Sets the tab label for the page. + + :param `page_idx`: the page index; + :param `text`: the new tab label. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + should_refresh = page_info.caption != text + page_info.caption = text + + # update what's on screen + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + info = ctrl.GetPage(ctrl_idx) + should_refresh = should_refresh or info.caption != text + info.caption = text + + if should_refresh: + ctrl.Refresh() + ctrl.Update() + + self.UpdateTabCtrlHeight(force=True) + + return True + + + def GetPageText(self, page_idx): + """ + Returns the tab label for the page. + + :param `page_idx`: the page index. + """ + + if page_idx >= self._tabs.GetPageCount(): + return "" + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + return page_info.caption + + + def SetPageBitmap(self, page_idx, bitmap): + """ + Sets the tab bitmap for the page. + + :param `page_idx`: the page index; + :param `bitmap`: an instance of `wx.Bitmap`. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + should_refresh = page_info.bitmap is not bitmap + page_info.bitmap = bitmap + if bitmap.IsOk() and not page_info.dis_bitmap.IsOk(): + page_info.dis_bitmap = MakeDisabledBitmap(bitmap) + + # tab height might have changed + self.UpdateTabCtrlHeight() + + # update what's on screen + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + info = ctrl.GetPage(ctrl_idx) + should_refresh = should_refresh or info.bitmap is not bitmap + info.bitmap = bitmap + info.dis_bitmap = page_info.dis_bitmap + if should_refresh: + ctrl.Refresh() + ctrl.Update() + + return True + + + def GetPageBitmap(self, page_idx): + """ + Returns the tab bitmap for the page. + + :param `page_idx`: the page index. + """ + + if page_idx >= self._tabs.GetPageCount(): + return wx.NullBitmap + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + return page_info.bitmap + + + def SetImageList(self, imageList): + """ + Sets the image list for the L{AuiNotebook} control. + + :param `imageList`: an instance of `wx.ImageList`. + """ + + self._imageList = imageList + + + def AssignImageList(self, imageList): + """ + Sets the image list for the L{AuiNotebook} control. + + :param `imageList`: an instance of `wx.ImageList`. + """ + + self.SetImageList(imageList) + + + def GetImageList(self): + """ Returns the associated image list (if any). """ + + return self._imageList + + + def SetPageImage(self, page, image): + """ + Sets the image index for the given page. + + :param `page`: the page index; + :param `image`: an index into the image list which was set with L{SetImageList}. + """ + + if page >= self._tabs.GetPageCount(): + return False + + if not isinstance(image, types.IntType): + raise Exception("The image parameter must be an integer, you passed " \ + "%s"%repr(image)) + + if not self._imageList: + raise Exception("To use SetPageImage you need to associate an image list " \ + "Using SetImageList or AssignImageList") + + if image >= self._imageList.GetImageCount(): + raise Exception("Invalid image index (%d), the image list contains only" \ + " (%d) bitmaps"%(image, self._imageList.GetImageCount())) + + if image == -1: + self.SetPageBitmap(page, wx.NullBitmap) + return + + bitmap = self._imageList.GetBitmap(image) + self.SetPageBitmap(page, bitmap) + + + def GetPageImage(self, page): + """ + Returns the image index for the given page. + + :param `page`: the given page for which to retrieve the image index. + """ + + if page >= self._tabs.GetPageCount(): + return False + + bitmap = self.GetPageBitmap(page) + for indx in xrange(self._imageList.GetImageCount()): + imgListBmp = self._imageList.GetBitmap(indx) + if imgListBmp == bitmap: + return indx + + return wx.NOT_FOUND + + + def SetPageTextColour(self, page_idx, colour): + """ + Sets the tab text colour for the page. + + :param `page_idx`: the page index; + :param `colour`: an instance of `wx.Colour`. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + should_refresh = page_info.text_colour != colour + page_info.text_colour = colour + + # update what's on screen + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + info = ctrl.GetPage(ctrl_idx) + should_refresh = should_refresh or info.text_colour != colour + info.text_colour = page_info.text_colour + + if should_refresh: + ctrl.Refresh() + ctrl.Update() + + return True + + + def GetPageTextColour(self, page_idx): + """ + Returns the tab text colour for the page. + + :param `page_idx`: the page index. + """ + + if page_idx >= self._tabs.GetPageCount(): + return wx.NullColour + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + return page_info.text_colour + + + def AddControlToPage(self, page_idx, control): + """ + Adds a control inside a tab (not in the tab area). + + :param `page_idx`: the page index; + :param `control`: an instance of `wx.Window`. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + page_info.control = control + + # tab height might have changed + self.UpdateTabCtrlHeight(force=True) + + # update what's on screen + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + control.Reparent(ctrl) + + info = ctrl.GetPage(ctrl_idx) + info.control = control + ctrl.Refresh() + ctrl.Update() + + return True + + + def RemoveControlFromPage(self, page_idx): + """ + Removes a control from a tab (not from the tab area). + + :param `page_idx`: the page index. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + page_info = self._tabs.GetPage(page_idx) + if page_info.control is None: + return False + + page_info.control.Destroy() + page_info.control = None + + # tab height might have changed + self.UpdateTabCtrlHeight(force=True) + + # update what's on screen + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + info = ctrl.GetPage(ctrl_idx) + info.control = None + ctrl.Refresh() + ctrl.Update() + + return True + + + def SetCloseButton(self, page_idx, hasCloseButton): + """ + Sets whether a tab should display a close button or not. + + :param `page_idx`: the page index; + :param `hasCloseButton`: ``True`` if the page displays a close button. + + :note: This can only be called if ``AUI_NB_CLOSE_ON_ALL_TABS`` is specified. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + if self._agwFlags & AUI_NB_CLOSE_ON_ALL_TABS == 0: + raise Exception("SetCloseButton can only be used with AUI_NB_CLOSE_ON_ALL_TABS style.") + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + page_info.hasCloseButton = hasCloseButton + + # update what's on screen + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + info = ctrl.GetPage(ctrl_idx) + info.hasCloseButton = page_info.hasCloseButton + ctrl.Refresh() + ctrl.Update() + + return True + + + def HasCloseButton(self, page_idx): + """ + Returns whether a tab displays a close button or not. + + :param `page_idx`: the page index. + + :note: This can only be called if ``AUI_NB_CLOSE_ON_ALL_TABS`` is specified. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + page_info = self._tabs.GetPage(page_idx) + return page_info.hasCloseButton + + + def GetSelection(self): + """ Returns the index of the currently active page, or -1 if none was selected. """ + + return self._curpage + + + def GetCurrentPage(self): + """ Returns the currently active page (not the index), or ``None`` if none was selected. """ + + if self._curpage >= 0 and self._curpage < self._tabs.GetPageCount(): + return self.GetPage(self._curpage) + + return None + + + def EnsureVisible(self, indx): + """ + Ensures the input page index `indx` is visible. + + :param `indx`: the page index. + """ + + self._tabs.MakeTabVisible(indx, self) + + + def SetSelection(self, new_page, force=False): + """ + Sets the page selection. Calling this method will generate a page change event. + + :param `new_page`: the index of the new selection; + :param `force`: whether to force the selection or not. + """ + wnd = self._tabs.GetWindowFromIdx(new_page) + + #Update page access time + self._tabs.GetPages()[new_page].access_time = datetime.datetime.now() + + if not wnd or not self.GetEnabled(new_page): + return self._curpage + + # don't change the page unless necessary + # however, clicking again on a tab should give it the focus. + if new_page == self._curpage and not force: + + ctrl, ctrl_idx = self.FindTab(wnd) + if wx.Window.FindFocus() != ctrl: + ctrl.SetFocus() + + return self._curpage + + evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, self.GetId()) + evt.SetSelection(new_page) + evt.SetOldSelection(self._curpage) + evt.SetEventObject(self) + + if not self.GetEventHandler().ProcessEvent(evt) or evt.IsAllowed(): + + old_curpage = self._curpage + self._curpage = new_page + + # program allows the page change + evt.SetEventType(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED) + self.GetEventHandler().ProcessEvent(evt) + + if not evt.IsAllowed(): # event is no longer allowed after handler + return self._curpage + + ctrl, ctrl_idx = self.FindTab(wnd) + + if ctrl: + self._tabs.SetActivePage(wnd) + ctrl.SetActivePage(ctrl_idx) + self.DoSizing() + ctrl.DoShowHide() + ctrl.MakeTabVisible(ctrl_idx, ctrl) + + # set fonts + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabctrl = pane.window._tabs + if tabctrl != ctrl: + tabctrl.SetSelectedFont(self._normal_font) + else: + tabctrl.SetSelectedFont(self._selected_font) + + tabctrl.Refresh() + tabctrl.Update() + + # Set the focus to the page if we're not currently focused on the tab. + # This is Firefox-like behaviour. + if wnd.IsShownOnScreen() and wx.Window.FindFocus() != ctrl: + wnd.SetFocus() + + return old_curpage + + return self._curpage + + + def SetSelectionToWindow(self, win): + """ + Sets the selection based on the input window `win`. + + :param `win`: a `wx.Window` derived window. + """ + + idx = self._tabs.GetIdxFromWindow(win) + + if idx == wx.NOT_FOUND: + raise Exception("invalid notebook page") + + if not self.GetEnabled(idx): + return + + # since a tab was clicked, let the parent know that we received + # the focus, even if we will assign that focus immediately + # to the child tab in the SetSelection call below + # (the child focus event will also let AuiManager, if any, + # know that the notebook control has been activated) + + parent = self.GetParent() + if parent: + eventFocus = wx.ChildFocusEvent(self) + parent.GetEventHandler().ProcessEvent(eventFocus) + + self.SetSelection(idx) + + + def SetSelectionToPage(self, page): + """ + Sets the selection based on the input page. + + :param `page`: an instance of L{AuiNotebookPage}. + """ + + self.SetSelectionToWindow(page.window) + + + def GetPageCount(self): + """ Returns the number of pages in the notebook. """ + + return self._tabs.GetPageCount() + + + def GetPage(self, page_idx): + """ + Returns the page specified by the given index. + + :param `page_idx`: the page index. + """ + + if page_idx >= self._tabs.GetPageCount(): + raise Exception("invalid notebook page") + + return self._tabs.GetWindowFromIdx(page_idx) + + + def GetPageInfo(self, page_idx): + """ + Returns the L{AuiNotebookPage} info structure specified by the given index. + + :param `page_idx`: the page index. + """ + + if page_idx >= self._tabs.GetPageCount(): + raise Exception("invalid notebook page") + + return self._tabs.GetPage(page_idx) + + + def GetEnabled(self, page_idx): + """ + Returns whether the page specified by the index `page_idx` is enabled. + + :param `page_idx`: the page index. + """ + + return self._tabs.GetEnabled(page_idx) + + + def EnableTab(self, page_idx, enable=True): + """ + Enables/disables a page in the notebook. + + :param `page_idx`: the page index; + :param `enable`: ``True`` to enable the page, ``False`` to disable it. + """ + + self._tabs.EnableTab(page_idx, enable) + self.Refresh() + + + def DoSizing(self): + """ Performs all sizing operations in each tab control. """ + + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabframe = pane.window + tabframe.DoSizing() + + + def GetAuiManager(self): + """ Returns the associated L{AuiManager}. """ + + return self._mgr + + + def GetActiveTabCtrl(self): + """ + Returns the active tab control. It is called to determine which control + gets new windows being added. + """ + + if self._curpage >= 0 and self._curpage < self._tabs.GetPageCount(): + + # find the tab ctrl with the current page + ctrl, idx = self.FindTab(self._tabs.GetPage(self._curpage).window) + if ctrl: + return ctrl + + # no current page, just find the first tab ctrl + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabframe = pane.window + return tabframe._tabs + + # If there is no tabframe at all, create one + tabframe = TabFrame(self) + tabframe.SetTabCtrlHeight(self._tab_ctrl_height) + self._tab_id_counter += 1 + tabframe._tabs = AuiTabCtrl(self, self._tab_id_counter) + + tabframe._tabs.SetAGWFlags(self._agwFlags) + tabframe._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) + self._mgr.AddPane(tabframe, framemanager.AuiPaneInfo().Center().CaptionVisible(False). + PaneBorder((self._agwFlags & AUI_NB_SUB_NOTEBOOK) == 0)) + + self._mgr.Update() + + return tabframe._tabs + + + def FindTab(self, page): + """ + Finds the tab control that currently contains the window as well + as the index of the window in the tab control. It returns ``True`` if the + window was found, otherwise ``False``. + + :param `page`: an instance of L{AuiNotebookPage}. + """ + + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabframe = pane.window + + page_idx = tabframe._tabs.GetIdxFromWindow(page) + + if page_idx != -1: + + ctrl = tabframe._tabs + idx = page_idx + return ctrl, idx + + return None, wx.NOT_FOUND + + + def Split(self, page, direction): + """ + Performs a split operation programmatically. + + :param `page`: indicates the page that will be split off. This page will also become + the active page after the split. + :param `direction`: specifies where the pane should go, it should be one of the + following: ``wx.TOP``, ``wx.BOTTOM``, ``wx.LEFT``, or ``wx.RIGHT``. + """ + + cli_size = self.GetClientSize() + + # get the page's window pointer + wnd = self.GetPage(page) + if not wnd: + return + + # notebooks with 1 or less pages can't be split + if self.GetPageCount() < 2: + return + + # find out which tab control the page currently belongs to + + src_tabs, src_idx = self.FindTab(wnd) + if not src_tabs: + return + + # choose a split size + if self.GetPageCount() > 2: + split_size = self.CalculateNewSplitSize() + else: + # because there are two panes, always split them + # equally + split_size = self.GetClientSize() + split_size.x /= 2 + split_size.y /= 2 + + # create a new tab frame + new_tabs = TabFrame(self) + new_tabs._rect = wx.RectPS(wx.Point(0, 0), split_size) + new_tabs.SetTabCtrlHeight(self._tab_ctrl_height) + self._tab_id_counter += 1 + new_tabs._tabs = AuiTabCtrl(self, self._tab_id_counter) + + new_tabs._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) + new_tabs._tabs.SetAGWFlags(self._agwFlags) + dest_tabs = new_tabs._tabs + + page_info = src_tabs.GetPage(src_idx) + if page_info.control: + self.ReparentControl(page_info.control, dest_tabs) + + # create a pane info structure with the information + # about where the pane should be added + pane_info = framemanager.AuiPaneInfo().Bottom().CaptionVisible(False) + + if direction == wx.LEFT: + + pane_info.Left() + mouse_pt = wx.Point(0, cli_size.y/2) + + elif direction == wx.RIGHT: + + pane_info.Right() + mouse_pt = wx.Point(cli_size.x, cli_size.y/2) + + elif direction == wx.TOP: + + pane_info.Top() + mouse_pt = wx.Point(cli_size.x/2, 0) + + elif direction == wx.BOTTOM: + + pane_info.Bottom() + mouse_pt = wx.Point(cli_size.x/2, cli_size.y) + + self._mgr.AddPane(new_tabs, pane_info, mouse_pt) + self._mgr.Update() + + # remove the page from the source tabs + page_info.active = False + + src_tabs.RemovePage(page_info.window) + + if src_tabs.GetPageCount() > 0: + src_tabs.SetActivePage(0) + src_tabs.DoShowHide() + src_tabs.Refresh() + + # add the page to the destination tabs + dest_tabs.InsertPage(page_info.window, page_info, 0) + + if src_tabs.GetPageCount() == 0: + self.RemoveEmptyTabFrames() + + self.DoSizing() + dest_tabs.DoShowHide() + dest_tabs.Refresh() + + # force the set selection function reset the selection + self._curpage = -1 + + # set the active page to the one we just split off + self.SetSelectionToPage(page_info) + + self.UpdateHintWindowSize() + + + def UnSplit(self): + """ Restores original view after a tab split. """ + + self.Freeze() + + # remember the tab now selected + nowSelected = self.GetSelection() + # select first tab as destination + self.SetSelection(0) + # iterate all other tabs + for idx in xrange(1, self.GetPageCount()): + # get win reference + win = self.GetPage(idx) + # get tab title + title = self.GetPageText(idx) + # get page bitmap + bmp = self.GetPageBitmap(idx) + # remove from notebook + self.RemovePage(idx) + # re-add in the same position so it will tab + self.InsertPage(idx, win, title, False, bmp) + # restore orignial selected tab + self.SetSelection(nowSelected) + + self.Thaw() + + + def ReparentControl(self, control, dest_tabs): + """ + Reparents a control added inside a tab. + + :param `control`: an instance of `wx.Window`; + :param `dest_tabs`: the destination L{AuiTabCtrl}. + """ + + control.Hide() + control.Reparent(dest_tabs) + + + def UnsplitDClick(self, part, sash_size, pos): + """ + Unsplit the L{AuiNotebook} on sash double-click. + + :param `part`: an UI part representing the sash; + :param `sash_size`: the sash size; + :param `pos`: the double-click mouse position. + + :warning: Due to a bug on MSW, for disabled pages `wx.FindWindowAtPoint` + returns the wrong window. See http://trac.wxwidgets.org/ticket/2942 + """ + + if not self._sash_dclick_unsplit: + # Unsplit not allowed + return + + pos1 = wx.Point(*pos) + pos2 = wx.Point(*pos) + if part.orientation == wx.HORIZONTAL: + pos1.y -= 2*sash_size + pos2.y += 2*sash_size + self.GetTabCtrlHeight() + elif part.orientation == wx.VERTICAL: + pos1.x -= 2*sash_size + pos2.x += 2*sash_size + else: + raise Exception("Invalid UI part orientation") + + pos1, pos2 = self.ClientToScreen(pos1), self.ClientToScreen(pos2) + win1, win2 = wx.FindWindowAtPoint(pos1), wx.FindWindowAtPoint(pos2) + + if isinstance(win1, wx.ScrollBar): + # Hopefully it will work + pos1 = wx.Point(*pos) + shift = wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X) + 2*(sash_size+1) + if part.orientation == wx.HORIZONTAL: + pos1.y -= shift + else: + pos1.x -= shift + + pos1 = self.ClientToScreen(pos1) + win1 = wx.FindWindowAtPoint(pos1) + + if isinstance(win2, wx.ScrollBar): + pos2 = wx.Point(*pos) + shift = wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X) + 2*(sash_size+1) + if part.orientation == wx.HORIZONTAL: + pos2.y += shift + else: + pos2.x += shift + + pos2 = self.ClientToScreen(pos2) + win2 = wx.FindWindowAtPoint(pos2) + + if not win1 or not win2: + # How did we get here? + return + + if isinstance(win1, AuiNotebook) or isinstance(win2, AuiNotebook): + # This is a bug on MSW, for disabled pages wx.FindWindowAtPoint + # returns the wrong window. + # See http://trac.wxwidgets.org/ticket/2942 + return + + tab_frame1, tab_frame2 = self.GetTabFrameFromWindow(win1), self.GetTabFrameFromWindow(win2) + + if not tab_frame1 or not tab_frame2: + return + + tab_ctrl_1, tab_ctrl_2 = tab_frame1._tabs, tab_frame2._tabs + + if tab_ctrl_1.GetPageCount() > tab_ctrl_2.GetPageCount(): + src_tabs = tab_ctrl_2 + dest_tabs = tab_ctrl_1 + else: + src_tabs = tab_ctrl_1 + dest_tabs = tab_ctrl_2 + + selection = -1 + page_count = dest_tabs.GetPageCount() + + for page in xrange(src_tabs.GetPageCount()-1, -1, -1): + # remove the page from the source tabs + page_info = src_tabs.GetPage(page) + if page_info.active: + selection = page_count + page + src_tabs.RemovePage(page_info.window) + + # add the page to the destination tabs + dest_tabs.AddPage(page_info.window, page_info) + if page_info.control: + self.ReparentControl(page_info.control, dest_tabs) + + self.RemoveEmptyTabFrames() + + dest_tabs.DoShowHide() + self.DoSizing() + dest_tabs.Refresh() + self._mgr.Update() + if selection > 0: + wx.CallAfter(dest_tabs.MakeTabVisible, selection, self) + + + def OnSize(self, event): + """ + Handles the ``wx.EVT_SIZE`` event for L{AuiNotebook}. + + :param `event`: a `wx.SizeEvent` event to be processed. + """ + + self.UpdateHintWindowSize() + event.Skip() + + + def OnTabClicked(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_PAGE_CHANGING`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + if self._textCtrl is not None: + self._textCtrl.StopEditing() + + ctrl = event.GetEventObject() + assert ctrl != None + + wnd = ctrl.GetWindowFromIdx(event.GetSelection()) + assert wnd != None + + self.SetSelectionToWindow(wnd) + + + def OnTabBgDClick(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_BG_DCLICK`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + if self._textCtrl is not None: + self._textCtrl.StopEditing() + + # notify owner that the tabbar background has been double-clicked + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, self.GetId()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnTabDClick(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_TAB_DCLICK`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + # notify owner that the tabbar background has been double-clicked + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_DCLICK, self.GetId()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + if not self.IsRenamable(event.GetSelection()): + return + + self.EditTab(event.GetSelection()) + + + def OnTabBeginDrag(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_BEGIN_DRAG`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + self._last_drag_x = 0 + + + def OnTabDragMotion(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_DRAG_MOTION`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + if self._textCtrl is not None: + self._textCtrl.StopEditing() + + screen_pt = wx.GetMousePosition() + client_pt = self.ScreenToClient(screen_pt) + zero = wx.Point(0, 0) + + src_tabs = event.GetEventObject() + dest_tabs = self.GetTabCtrlFromPoint(client_pt) + + if dest_tabs == src_tabs: + + # always hide the hint for inner-tabctrl drag + self._mgr.HideHint() + + # if tab moving is not allowed, leave + if not self._agwFlags & AUI_NB_TAB_MOVE: + return + + pt = dest_tabs.ScreenToClient(screen_pt) + + # this is an inner-tab drag/reposition + dest_location_tab = dest_tabs.TabHitTest(pt.x, pt.y) + + if dest_location_tab: + + src_idx = event.GetSelection() + dest_idx = dest_tabs.GetIdxFromWindow(dest_location_tab) + + # prevent jumpy drag + if (src_idx == dest_idx) or dest_idx == -1 or \ + (src_idx > dest_idx and self._last_drag_x <= pt.x) or \ + (src_idx < dest_idx and self._last_drag_x >= pt.x): + + self._last_drag_x = pt.x + return + + src_tab = dest_tabs.GetWindowFromIdx(src_idx) + dest_tabs.MovePage(src_tab, dest_idx) + self._tabs.MovePage(self._tabs.GetPage(src_idx).window, dest_idx) + dest_tabs.SetActivePage(dest_idx) + dest_tabs.DoShowHide() + dest_tabs.Refresh() + self._last_drag_x = pt.x + + return + + # if external drag is allowed, check if the tab is being dragged + # over a different AuiNotebook control + if self._agwFlags & AUI_NB_TAB_EXTERNAL_MOVE: + + tab_ctrl = wx.FindWindowAtPoint(screen_pt) + + # if we aren't over any window, stop here + if not tab_ctrl: + if self._agwFlags & AUI_NB_TAB_FLOAT: + if self.IsMouseWellOutsideWindow(): + hintRect = wx.RectPS(screen_pt, (400, 300)) + # Use CallAfter so we overwrite the hint that might be + # shown by our superclass: + wx.CallAfter(self._mgr.ShowHint, hintRect) + return + + # make sure we are not over the hint window + if not isinstance(tab_ctrl, wx.Frame): + while tab_ctrl: + if isinstance(tab_ctrl, AuiTabCtrl): + break + + tab_ctrl = tab_ctrl.GetParent() + + if tab_ctrl: + nb = tab_ctrl.GetParent() + + if nb != self: + + hint_rect = tab_ctrl.GetClientRect() + hint_rect.x, hint_rect.y = tab_ctrl.ClientToScreenXY(hint_rect.x, hint_rect.y) + self._mgr.ShowHint(hint_rect) + return + + else: + + if not dest_tabs: + # we are either over a hint window, or not over a tab + # window, and there is no where to drag to, so exit + return + + if self._agwFlags & AUI_NB_TAB_FLOAT: + if self.IsMouseWellOutsideWindow(): + hintRect = wx.RectPS(screen_pt, (400, 300)) + # Use CallAfter so we overwrite the hint that might be + # shown by our superclass: + wx.CallAfter(self._mgr.ShowHint, hintRect) + return + + # if there are less than two panes, split can't happen, so leave + if self._tabs.GetPageCount() < 2: + return + + # if tab moving is not allowed, leave + if not self._agwFlags & AUI_NB_TAB_SPLIT: + return + + if dest_tabs: + + hint_rect = dest_tabs.GetRect() + hint_rect.x, hint_rect.y = self.ClientToScreenXY(hint_rect.x, hint_rect.y) + self._mgr.ShowHint(hint_rect) + + else: + rect = self._mgr.CalculateHintRect(self._dummy_wnd, client_pt, zero) + if rect.IsEmpty(): + self._mgr.HideHint() + return + + hit_wnd = wx.FindWindowAtPoint(screen_pt) + if hit_wnd and not isinstance(hit_wnd, AuiNotebook): + tab_frame = self.GetTabFrameFromWindow(hit_wnd) + if tab_frame: + hint_rect = wx.Rect(*tab_frame._rect) + hint_rect.x, hint_rect.y = self.ClientToScreenXY(hint_rect.x, hint_rect.y) + rect.Intersect(hint_rect) + self._mgr.ShowHint(rect) + else: + self._mgr.DrawHintRect(self._dummy_wnd, client_pt, zero) + else: + self._mgr.DrawHintRect(self._dummy_wnd, client_pt, zero) + + + def OnTabEndDrag(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_END_DRAG`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + self._mgr.HideHint() + + src_tabs = event.GetEventObject() + if not src_tabs: + raise Exception("no source object?") + + # get the mouse position, which will be used to determine the drop point + mouse_screen_pt = wx.GetMousePosition() + mouse_client_pt = self.ScreenToClient(mouse_screen_pt) + + # check for an external move + if self._agwFlags & AUI_NB_TAB_EXTERNAL_MOVE: + tab_ctrl = wx.FindWindowAtPoint(mouse_screen_pt) + + while tab_ctrl: + + if isinstance(tab_ctrl, AuiTabCtrl): + break + + tab_ctrl = tab_ctrl.GetParent() + + if tab_ctrl: + + nb = tab_ctrl.GetParent() + + if nb != self: + + # find out from the destination control + # if it's ok to drop this tab here + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, self.GetId()) + e.SetSelection(event.GetSelection()) + e.SetOldSelection(event.GetSelection()) + e.SetEventObject(self) + e.SetDragSource(self) + e.Veto() # dropping must be explicitly approved by control owner + + nb.GetEventHandler().ProcessEvent(e) + + if not e.IsAllowed(): + + # no answer or negative answer + self._mgr.HideHint() + return + + # drop was allowed + src_idx = event.GetSelection() + src_page = src_tabs.GetWindowFromIdx(src_idx) + + # Check that it's not an impossible parent relationship + p = nb + while p and not p.IsTopLevel(): + if p == src_page: + return + + p = p.GetParent() + + # get main index of the page + main_idx = self._tabs.GetIdxFromWindow(src_page) + if main_idx == wx.NOT_FOUND: + raise Exception("no source page?") + + # make a copy of the page info + page_info = self._tabs.GetPage(main_idx) + + # remove the page from the source notebook + self.RemovePage(main_idx) + + # reparent the page + src_page.Reparent(nb) + + # Reparent the control in a tab (if any) + if page_info.control: + self.ReparentControl(page_info.control, tab_ctrl) + + # find out the insert idx + dest_tabs = tab_ctrl + pt = dest_tabs.ScreenToClient(mouse_screen_pt) + + target = dest_tabs.TabHitTest(pt.x, pt.y) + insert_idx = -1 + if target: + insert_idx = dest_tabs.GetIdxFromWindow(target) + + # add the page to the new notebook + if insert_idx == -1: + insert_idx = dest_tabs.GetPageCount() + + dest_tabs.InsertPage(page_info.window, page_info, insert_idx) + nb._tabs.AddPage(page_info.window, page_info) + + nb.DoSizing() + dest_tabs.DoShowHide() + dest_tabs.Refresh() + + # set the selection in the destination tab control + nb.SetSelectionToPage(page_info) + + # notify owner that the tab has been dragged + e2 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, self.GetId()) + e2.SetSelection(event.GetSelection()) + e2.SetOldSelection(event.GetSelection()) + e2.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e2) + + # notify the target notebook that the tab has been dragged + e3 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, nb.GetId()) + e3.SetSelection(insert_idx) + e3.SetOldSelection(insert_idx) + e3.SetEventObject(nb) + nb.GetEventHandler().ProcessEvent(e3) + + return + + if self._agwFlags & AUI_NB_TAB_FLOAT: + self._mgr.HideHint() + if self.IsMouseWellOutsideWindow(): + # Use CallAfter so we our superclass can deal with the event first + wx.CallAfter(self.FloatPage, self.GetSelection()) + event.Skip() + return + + # only perform a tab split if it's allowed + dest_tabs = None + + if self._agwFlags & AUI_NB_TAB_SPLIT and self._tabs.GetPageCount() >= 2: + + # If the pointer is in an existing tab frame, do a tab insert + hit_wnd = wx.FindWindowAtPoint(mouse_screen_pt) + tab_frame = self.GetTabFrameFromTabCtrl(hit_wnd) + insert_idx = -1 + + if tab_frame: + + dest_tabs = tab_frame._tabs + + if dest_tabs == src_tabs: + return + + pt = dest_tabs.ScreenToClient(mouse_screen_pt) + target = dest_tabs.TabHitTest(pt.x, pt.y) + + if target: + insert_idx = dest_tabs.GetIdxFromWindow(target) + + else: + + zero = wx.Point(0, 0) + rect = self._mgr.CalculateHintRect(self._dummy_wnd, mouse_client_pt, zero) + + if rect.IsEmpty(): + # there is no suitable drop location here, exit out + return + + # If there is no tabframe at all, create one + new_tabs = TabFrame(self) + new_tabs._rect = wx.RectPS(wx.Point(0, 0), self.CalculateNewSplitSize()) + new_tabs.SetTabCtrlHeight(self._tab_ctrl_height) + self._tab_id_counter += 1 + new_tabs._tabs = AuiTabCtrl(self, self._tab_id_counter) + new_tabs._tabs.SetArtProvider(self._tabs.GetArtProvider().Clone()) + new_tabs._tabs.SetAGWFlags(self._agwFlags) + + self._mgr.AddPane(new_tabs, framemanager.AuiPaneInfo().Bottom().CaptionVisible(False), mouse_client_pt) + self._mgr.Update() + dest_tabs = new_tabs._tabs + + # remove the page from the source tabs + page_info = src_tabs.GetPage(event.GetSelection()) + + if page_info.control: + self.ReparentControl(page_info.control, dest_tabs) + + page_info.active = False + src_tabs.RemovePage(page_info.window) + + if src_tabs.GetPageCount() > 0: + src_tabs.SetActivePage(0) + src_tabs.DoShowHide() + src_tabs.Refresh() + + # add the page to the destination tabs + if insert_idx == -1: + insert_idx = dest_tabs.GetPageCount() + + dest_tabs.InsertPage(page_info.window, page_info, insert_idx) + + if src_tabs.GetPageCount() == 0: + self.RemoveEmptyTabFrames() + + self.DoSizing() + dest_tabs.DoShowHide() + dest_tabs.Refresh() + + # force the set selection function reset the selection + self._curpage = -1 + + # set the active page to the one we just split off + self.SetSelectionToPage(page_info) + + self.UpdateHintWindowSize() + + # notify owner that the tab has been dragged + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, self.GetId()) + e.SetSelection(event.GetSelection()) + e.SetOldSelection(event.GetSelection()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnTabCancelDrag(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_CANCEL_DRAG`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + self._mgr.HideHint() + + src_tabs = event.GetEventObject() + if not src_tabs: + raise Exception("no source object?") + + + def IsMouseWellOutsideWindow(self): + """ Returns whether the mouse is well outside the L{AuiNotebook} screen rectangle. """ + + screen_rect = self.GetScreenRect() + screen_rect.Inflate(50, 50) + + return not screen_rect.Contains(wx.GetMousePosition()) + + + def FloatPage(self, page_index): + """ + Float the page in `page_index` by reparenting it to a floating frame. + + :param `page_index`: the index of the page to be floated. + + :warning: When the notebook is more or less full screen, tabs cannot be dragged far + enough outside of the notebook to become floating pages. + """ + + root_manager = framemanager.GetManager(self) + page_title = self.GetPageText(page_index) + page_contents = self.GetPage(page_index) + page_bitmap = self.GetPageBitmap(page_index) + text_colour = self.GetPageTextColour(page_index) + info = self.GetPageInfo(page_index) + + if root_manager and root_manager != self._mgr: + root_manager = framemanager.GetManager(self) + + if hasattr(page_contents, "__floating_size__"): + floating_size = wx.Size(*page_contents.__floating_size__) + else: + floating_size = page_contents.GetBestSize() + if floating_size == wx.DefaultSize: + floating_size = wx.Size(300, 200) + + page_contents.__page_index__ = page_index + page_contents.__aui_notebook__ = self + page_contents.__text_colour__ = text_colour + page_contents.__control__ = info.control + + if info.control: + info.control.Reparent(page_contents) + info.control.Hide() + info.control = None + + self.RemovePage(page_index) + self.RemoveEmptyTabFrames() + + pane_info = framemanager.AuiPaneInfo().Float().FloatingPosition(wx.GetMousePosition()). \ + FloatingSize(floating_size).BestSize(floating_size).Name("__floating__%s"%page_title). \ + Caption(page_title).Icon(page_bitmap) + root_manager.AddPane(page_contents, pane_info) + root_manager.Bind(framemanager.EVT_AUI_PANE_CLOSE, self.OnCloseFloatingPage) + self.GetActiveTabCtrl().DoShowHide() + self.DoSizing() + root_manager.Update() + + else: + frame = wx.Frame(self, title=page_title, + style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_TOOL_WINDOW| + wx.FRAME_FLOAT_ON_PARENT | wx.FRAME_NO_TASKBAR) + + if info.control: + info.control.Reparent(frame) + info.control.Hide() + + frame.bitmap = page_bitmap + frame.page_index = page_index + frame.text_colour = text_colour + frame.control = info.control + page_contents.Reparent(frame) + frame.Bind(wx.EVT_CLOSE, self.OnCloseFloatingPage) + frame.Move(wx.GetMousePosition()) + frame.Show() + self.RemovePage(page_index) + + self.RemoveEmptyTabFrames() + + wx.CallAfter(self.RemoveEmptyTabFrames) + + + def OnCloseFloatingPage(self, event): + """ + Handles the ``wx.EVT_CLOSE`` event for a floating page in L{AuiNotebook}. + + :param `event`: a `wx.CloseEvent` event to be processed. + """ + + root_manager = framemanager.GetManager(self) + if root_manager and root_manager != self._mgr: + pane = event.pane + if pane.name.startswith("__floating__"): + self.ReDockPage(pane) + return + + event.Skip() + else: + event.Skip() + frame = event.GetEventObject() + page_title = frame.GetTitle() + page_contents = list(frame.GetChildren())[-1] + page_contents.Reparent(self) + self.InsertPage(frame.page_index, page_contents, page_title, select=True, bitmap=frame.bitmap, control=frame.control) + + if frame.control: + src_tabs, idx = self.FindTab(page_contents) + frame.control.Reparent(src_tabs) + frame.control.Hide() + frame.control = None + + self.SetPageTextColour(frame.page_index, frame.text_colour) + + + def ReDockPage(self, pane): + """ + Re-docks a floating L{AuiNotebook} tab in the original position, when possible. + + :param `pane`: an instance of L{framemanager.AuiPaneInfo}. + """ + + root_manager = framemanager.GetManager(self) + + pane.window.__floating_size__ = wx.Size(*pane.floating_size) + page_index = pane.window.__page_index__ + text_colour = pane.window.__text_colour__ + control = pane.window.__control__ + + root_manager.DetachPane(pane.window) + self.InsertPage(page_index, pane.window, pane.caption, True, pane.icon, control=control) + + self.SetPageTextColour(page_index, text_colour) + self.GetActiveTabCtrl().DoShowHide() + self.DoSizing() + if control: + self.UpdateTabCtrlHeight(force=True) + + self._mgr.Update() + root_manager.Update() + + + def GetTabCtrlFromPoint(self, pt): + """ + Returns the tab control at the specified point. + + :param `pt`: a `wx.Point` object. + """ + + # if we've just removed the last tab from the source + # tab set, the remove the tab control completely + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabframe = pane.window + if tabframe._tab_rect.Contains(pt): + return tabframe._tabs + + return None + + + def GetTabFrameFromTabCtrl(self, tab_ctrl): + """ + Returns the tab frame associated with a tab control. + + :param `tab_ctrl`: an instance of L{AuiTabCtrl}. + """ + + # if we've just removed the last tab from the source + # tab set, the remove the tab control completely + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabframe = pane.window + if tabframe._tabs == tab_ctrl: + return tabframe + + return None + + + def GetTabFrameFromWindow(self, wnd): + """ + Returns the tab frame associated with a window. + + :param `wnd`: an instance of `wx.Window`. + """ + + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + tabframe = pane.window + for page in tabframe._tabs.GetPages(): + if wnd == page.window: + return tabframe + + return None + + + def RemoveEmptyTabFrames(self): + """ Removes all the empty tab frames. """ + + # if we've just removed the last tab from the source + # tab set, the remove the tab control completely + all_panes = self._mgr.GetAllPanes() + + for indx in xrange(len(all_panes)-1, -1, -1): + pane = all_panes[indx] + if pane.name == "dummy": + continue + + tab_frame = pane.window + if tab_frame._tabs.GetPageCount() == 0: + self._mgr.DetachPane(tab_frame) + tab_frame._tabs.Destroy() + tab_frame._tabs = None + del tab_frame + + # check to see if there is still a center pane + # if there isn't, make a frame the center pane + first_good = None + center_found = False + + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + + if pane.dock_direction == AUI_DOCK_CENTRE: + center_found = True + if not first_good: + first_good = pane.window + + if not center_found and first_good: + self._mgr.GetPane(first_good).Centre() + + if not self.IsBeingDeleted(): + self._mgr.Update() + + + def OnChildFocusNotebook(self, event): + """ + Handles the ``wx.EVT_CHILD_FOCUS`` event for L{AuiNotebook}. + + :param `event`: a `wx.ChildFocusEvent` event to be processed. + """ + + # if we're dragging a tab, don't change the current selection. + # This code prevents a bug that used to happen when the hint window + # was hidden. In the bug, the focus would return to the notebook + # child, which would then enter this handler and call + # SetSelection, which is not desired turn tab dragging. + + event.Skip() + + all_panes = self._mgr.GetAllPanes() + for pane in all_panes: + if pane.name == "dummy": + continue + tabframe = pane.window + if tabframe._tabs.IsDragging(): + return + +## # change the tab selection to the child +## # which was focused +## idx = self._tabs.GetIdxFromWindow(event.GetWindow()) +## if idx != -1 and idx != self._curpage: +## self.SetSelection(idx) + + + def SetNavigatorIcon(self, bmp): + """ + Sets the icon used by the L{TabNavigatorWindow}. + + :param `bmp`: an instance of `wx.Bitmap`. + """ + + if isinstance(bmp, wx.Bitmap) and bmp.IsOk(): + # Make sure image is proper size + if bmp.GetSize() != (16, 16): + img = bmp.ConvertToImage() + img.Rescale(16, 16, wx.IMAGE_QUALITY_HIGH) + bmp = wx.BitmapFromImage(img) + self._naviIcon = bmp + else: + raise TypeError, "SetNavigatorIcon requires a valid bitmap" + + + def OnNavigationKeyNotebook(self, event): + """ + Handles the ``wx.EVT_NAVIGATION_KEY`` event for L{AuiNotebook}. + + :param `event`: a `wx.NavigationKeyEvent` event to be processed. + """ + + if event.IsWindowChange(): + if self._agwFlags & AUI_NB_SMART_TABS: + if not self._popupWin: + self._popupWin = TabNavigatorWindow(self, self._naviIcon) + self._popupWin.SetReturnCode(wx.ID_OK) + self._popupWin.ShowModal() + idx = self._popupWin.GetSelectedPage() + self._popupWin.Destroy() + self._popupWin = None + # Need to do CallAfter so that the selection and its + # associated events get processed outside the context of + # this key event. Not doing so causes odd issues with the + # window focus under certain use cases on Windows. + wx.CallAfter(self.SetSelection, idx, True) + else: + # a dialog is already opened + self._popupWin.OnNavigationKey(event) + return + else: + # change pages + # FIXME: the problem with this is that if we have a split notebook, + # we selection may go all over the place. + self.AdvanceSelection(event.GetDirection()) + + else: + # we get this event in 3 cases + # + # a) one of our pages might have generated it because the user TABbed + # out from it in which case we should propagate the event upwards and + # our parent will take care of setting the focus to prev/next sibling + # + # or + # + # b) the parent panel wants to give the focus to us so that we + # forward it to our selected page. We can't deal with this in + # OnSetFocus() because we don't know which direction the focus came + # from in this case and so can't choose between setting the focus to + # first or last panel child + # + # or + # + # c) we ourselves (see MSWTranslateMessage) generated the event + # + parent = self.GetParent() + + # the wxObject* casts are required to avoid MinGW GCC 2.95.3 ICE + isFromParent = event.GetEventObject() == parent + isFromSelf = event.GetEventObject() == self + + if isFromParent or isFromSelf: + + # no, it doesn't come from child, case (b) or (c): forward to a + # page but only if direction is backwards (TAB) or from ourselves, + if self.GetSelection() != wx.NOT_FOUND and (not event.GetDirection() or isFromSelf): + + # so that the page knows that the event comes from it's parent + # and is being propagated downwards + event.SetEventObject(self) + + page = self.GetPage(self.GetSelection()) + if not page.GetEventHandler().ProcessEvent(event): + page.SetFocus() + + #else: page manages focus inside it itself + + else: # otherwise set the focus to the notebook itself + + self.SetFocus() + + else: + + # send this event back for the 'wraparound' focus. + winFocus = event.GetCurrentFocus() + + if winFocus: + event.SetEventObject(self) + winFocus.GetEventHandler().ProcessEvent(event) + + + def OnTabButton(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_BUTTON`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + button_id = event.GetInt() + + if button_id == AUI_BUTTON_CLOSE: + + selection = event.GetSelection() + + if selection == -1: + + # if the close button is to the right, use the active + # page selection to determine which page to close + selection = tabs.GetActivePage() + + if selection == -1 or not tabs.GetEnabled(selection): + return + + if selection != -1: + + close_wnd = tabs.GetWindowFromIdx(selection) + + if close_wnd.GetName() == "__fake__page__": + # This is a notebook preview + previous_active, page_status = close_wnd.__previousStatus + for page, status in zip(tabs.GetPages(), page_status): + page.enabled = status + + main_idx = self._tabs.GetIdxFromWindow(close_wnd) + self.DeletePage(main_idx) + + if previous_active >= 0: + tabs.SetActivePage(previous_active) + page_count = tabs.GetPageCount() + selection = -1 + + for page in xrange(page_count): + # remove the page from the source tabs + page_info = tabs.GetPage(page) + if page_info.active: + selection = page + break + + tabs.DoShowHide() + self.DoSizing() + tabs.Refresh() + + if selection >= 0: + wx.CallAfter(tabs.MakeTabVisible, selection, self) + + # Don't fire the event + return + + # ask owner if it's ok to close the tab + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, self.GetId()) + idx = self._tabs.GetIdxFromWindow(close_wnd) + e.SetSelection(idx) + e.SetOldSelection(event.GetSelection()) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + if not e.IsAllowed(): + return + + if repr(close_wnd.__class__).find("AuiMDIChildFrame") >= 0: + close_wnd.Close() + + else: + main_idx = self._tabs.GetIdxFromWindow(close_wnd) + self.DeletePage(main_idx) + + # notify owner that the tab has been closed + e2 = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, self.GetId()) + e2.SetSelection(idx) + e2.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e2) + + if self.GetPageCount() == 0: + mgr = self.GetAuiManager() + win = mgr.GetManagedWindow() + win.SendSizeEvent() + + + def OnTabMiddleDown(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + # patch event through to owner + wnd = tabs.GetWindowFromIdx(event.GetSelection()) + + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, self.GetId()) + e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnTabMiddleUp(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_TAB_MIDDLE_UP`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + # if the AUI_NB_MIDDLE_CLICK_CLOSE is specified, middle + # click should act like a tab close action. However, first + # give the owner an opportunity to handle the middle up event + # for custom action + + wnd = tabs.GetWindowFromIdx(event.GetSelection()) + + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, self.GetId()) + e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) + e.SetEventObject(self) + if self.GetEventHandler().ProcessEvent(e): + return + if not e.IsAllowed(): + return + + # check if we are supposed to close on middle-up + if self._agwFlags & AUI_NB_MIDDLE_CLICK_CLOSE == 0: + return + + # simulate the user pressing the close button on the tab + event.SetInt(AUI_BUTTON_CLOSE) + self.OnTabButton(event) + + + def OnTabRightDown(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_TAB_RIGHT_DOWN`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + # patch event through to owner + wnd = tabs.GetWindowFromIdx(event.GetSelection()) + + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, self.GetId()) + e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def OnTabRightUp(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_TAB_RIGHT_UP`` event for L{AuiNotebook}. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + tabs = event.GetEventObject() + if not tabs.GetEnabled(event.GetSelection()): + return + + # patch event through to owner + wnd = tabs.GetWindowFromIdx(event.GetSelection()) + + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, self.GetId()) + e.SetSelection(self._tabs.GetIdxFromWindow(wnd)) + e.SetEventObject(self) + self.GetEventHandler().ProcessEvent(e) + + + def SetNormalFont(self, font): + """ + Sets the normal font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._normal_font = font + self.GetArtProvider().SetNormalFont(font) + + + def SetSelectedFont(self, font): + """ + Sets the selected tab font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._selected_font = font + self.GetArtProvider().SetSelectedFont(font) + + + def SetMeasuringFont(self, font): + """ + Sets the font for calculating text measurements. + + :param `font`: a `wx.Font` object. + """ + + self.GetArtProvider().SetMeasuringFont(font) + + + def SetFont(self, font): + """ + Sets the tab font. + + :param `font`: a `wx.Font` object. + + :note: Overridden from `wx.PyPanel`. + """ + + wx.PyPanel.SetFont(self, font) + + selectedFont = wx.Font(font.GetPointSize(), font.GetFamily(), + font.GetStyle(), wx.BOLD, font.GetUnderlined(), + font.GetFaceName(), font.GetEncoding()) + + self.SetNormalFont(font) + self.SetSelectedFont(selectedFont) + self.SetMeasuringFont(selectedFont) + + # Recalculate tab container size based on new font + self.UpdateTabCtrlHeight(force=False) + self.DoSizing() + + return True + + + def GetTabCtrlHeight(self): + """ Returns the tab control height. """ + + return self._tab_ctrl_height + + + def GetHeightForPageHeight(self, pageHeight): + """ + Gets the height of the notebook for a given page height. + + :param `pageHeight`: the given page height. + """ + + self.UpdateTabCtrlHeight() + + tabCtrlHeight = self.GetTabCtrlHeight() + decorHeight = 2 + return tabCtrlHeight + pageHeight + decorHeight + + + def AdvanceSelection(self, forward=True, wrap=True): + """ + Cycles through the tabs. + + :param `forward`: whether to advance forward or backward; + :param `wrap`: ``True`` to return to the first tab if we reach the last tab. + + :note: The call to this function generates the page changing events. + """ + + tabCtrl = self.GetActiveTabCtrl() + newPage = -1 + + focusWin = tabCtrl.FindFocus() + activePage = tabCtrl.GetActivePage() + lenPages = len(tabCtrl.GetPages()) + + if lenPages == 1: + return False + + if forward: + if lenPages > 1: + + if activePage == -1 or activePage == lenPages - 1: + if not wrap: + return False + + newPage = 0 + + elif activePage < lenPages - 1: + newPage = activePage + 1 + + else: + + if lenPages > 1: + if activePage == -1 or activePage == 0: + if not wrap: + return False + + newPage = lenPages - 1 + + elif activePage > 0: + newPage = activePage - 1 + + + if newPage != -1: + if not self.GetEnabled(newPage): + return False + + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, tabCtrl.GetId()) + e.SetSelection(newPage) + e.SetOldSelection(activePage) + e.SetEventObject(tabCtrl) + self.GetEventHandler().ProcessEvent(e) + +## if focusWin: +## focusWin.SetFocus() + + return True + + + def ShowWindowMenu(self): + """ + Shows the window menu for the active tab control associated with this + notebook, and returns ``True`` if a selection was made. + """ + + tabCtrl = self.GetActiveTabCtrl() + idx = tabCtrl.GetArtProvider().ShowDropDown(tabCtrl, tabCtrl.GetPages(), tabCtrl.GetActivePage()) + + if not self.GetEnabled(idx): + return False + + if idx != -1: + e = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, tabCtrl.GetId()) + e.SetSelection(idx) + e.SetOldSelection(tabCtrl.GetActivePage()) + e.SetEventObject(tabCtrl) + self.GetEventHandler().ProcessEvent(e) + + return True + + else: + + return False + + + def AddTabAreaButton(self, id, location, normal_bitmap=wx.NullBitmap, disabled_bitmap=wx.NullBitmap): + """ + Adds a button in the tab area. + + :param `id`: the button identifier. This can be one of the following: + + ============================== ================================= + Button Identifier Description + ============================== ================================= + ``AUI_BUTTON_CLOSE`` Shows a close button on the tab area + ``AUI_BUTTON_WINDOWLIST`` Shows a window list button on the tab area + ``AUI_BUTTON_LEFT`` Shows a left button on the tab area + ``AUI_BUTTON_RIGHT`` Shows a right button on the tab area + ============================== ================================= + + :param `location`: the button location. Can be ``wx.LEFT`` or ``wx.RIGHT``; + :param `normal_bitmap`: the bitmap for an enabled tab; + :param `disabled_bitmap`: the bitmap for a disabled tab. + """ + + active_tabctrl = self.GetActiveTabCtrl() + active_tabctrl.AddButton(id, location, normal_bitmap, disabled_bitmap) + + + def RemoveTabAreaButton(self, id): + """ + Removes a button from the tab area. + + :param `id`: the button identifier. See L{AddTabAreaButton} for a list of button identifiers. + + :see: L{AddTabAreaButton} + """ + + active_tabctrl = self.GetActiveTabCtrl() + active_tabctrl.RemoveButton(id) + + + def HasMultiplePages(self): + """ + This method should be overridden to return ``True`` if this window has multiple pages. All + standard class with multiple pages such as `wx.Notebook`, `wx.Listbook` and `wx.Treebook` + already override it to return ``True`` and user-defined classes with similar behaviour + should do it as well to allow the library to handle such windows appropriately. + + :note: Overridden from `wx.PyPanel`. + """ + + return True + + + def GetDefaultBorder(self): + """ Returns the default border style for L{AuiNotebook}. """ + + return wx.BORDER_NONE + + + def NotebookPreview(self, thumbnail_size=200): + """ + Generates a preview of all the pages in the notebook (MSW and GTK only). + + :param `thumbnail_size`: the maximum size of every page thumbnail. + + :note: this functionality is currently unavailable on wxMac. + """ + + if wx.Platform == "__WXMAC__": + return False + + tabCtrl = self.GetActiveTabCtrl() + activePage = tabCtrl.GetActivePage() + pages = tabCtrl.GetPages() + + pageStatus, pageText = [], [] + + for indx, page in enumerate(pages): + + pageStatus.append(page.enabled) + + if not page.enabled: + continue + + self.SetSelectionToPage(page) + pageText.append(page.caption) + + rect = page.window.GetScreenRect() + bmp = RescaleScreenShot(TakeScreenShot(rect), thumbnail_size) + + page.enabled = False + if indx == 0: + il = wx.ImageList(bmp.GetWidth(), bmp.GetHeight(), True) + + il.Add(bmp) + + # create the list control + listCtrl = wx.ListCtrl(self, style=wx.LC_ICON|wx.LC_AUTOARRANGE|wx.LC_HRULES|wx.LC_VRULES, + name="__fake__page__") + + # assign the image list to it + listCtrl.AssignImageList(il, wx.IMAGE_LIST_NORMAL) + listCtrl.__previousStatus = [activePage, pageStatus] + + # create some items for the list + for indx, text in enumerate(pageText): + listCtrl.InsertImageStringItem(10000, text, indx) + + self.AddPage(listCtrl, "AuiNotebook Preview", True, bitmap=auinotebook_preview.GetBitmap(), disabled_bitmap=wx.NullBitmap) + return True + + + def SetRenamable(self, page_idx, renamable): + """ + Sets whether a tab can be renamed via a left double-click or not. + + :param `page_idx`: the page index; + :param `renamable`: ``True`` if the page can be renamed. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + # update our own tab catalog + page_info = self._tabs.GetPage(page_idx) + page_info.renamable = renamable + + # update what's on screen + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + info = ctrl.GetPage(ctrl_idx) + info.renamable = page_info.renamable + + return True + + + def IsRenamable(self, page_idx): + """ + Returns whether a tab can be renamed or not. + + :param `page_idx`: the page index. + + :returns: ``True`` is a page can be renamed, ``False`` otherwise. + """ + + if page_idx >= self._tabs.GetPageCount(): + return False + + page_info = self._tabs.GetPage(page_idx) + return page_info.renamable + + + def OnRenameCancelled(self, page_index): + """ + Called by L{TabTextCtrl}, to cancel the changes and to send the + `EVT_AUINOTEBOOK_END_LABEL_EDIT` event. + + :param `page_index`: the page index in the notebook. + """ + + # let owner know that the edit was cancelled + evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT, self.GetId()) + + evt.SetSelection(page_index) + evt.SetEventObject(self) + evt.SetLabel("") + evt.SetEditCanceled(True) + self.GetEventHandler().ProcessEvent(evt) + + + def OnRenameAccept(self, page_index, value): + """ + Called by L{TabTextCtrl}, to accept the changes and to send the + `EVT_AUINOTEBOOK_END_LABEL_EDIT` event. + + :param `page_index`: the page index in the notebook; + :param `value`: the new label for the tab. + """ + + evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_END_LABEL_EDIT, self.GetId()) + evt.SetSelection(page_index) + evt.SetEventObject(self) + evt.SetLabel(value) + evt.SetEditCanceled(False) + + return not self.GetEventHandler().ProcessEvent(evt) or evt.IsAllowed() + + + def ResetTextControl(self): + """ Called by L{TabTextCtrl} when it marks itself for deletion. """ + + if not self._textCtrl: + return + + self._textCtrl.Destroy() + self._textCtrl = None + + # tab height might have changed + self.UpdateTabCtrlHeight(force=True) + + + def EditTab(self, page_index): + """ + Starts the editing of an item label, sending a `EVT_AUINOTEBOOK_BEGIN_LABEL_EDIT` event. + + :param `page_index`: the page index we want to edit. + """ + + if page_index >= self._tabs.GetPageCount(): + return False + + if not self.IsRenamable(page_index): + return False + + page_info = self._tabs.GetPage(page_index) + ctrl, ctrl_idx = self.FindTab(page_info.window) + if not ctrl: + return False + + evt = AuiNotebookEvent(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_LABEL_EDIT, self.GetId()) + evt.SetSelection(page_index) + evt.SetEventObject(self) + if self.GetEventHandler().ProcessEvent(evt) and not evt.IsAllowed(): + # vetoed by user + return False + + if self._textCtrl is not None and page_info != self._textCtrl.item(): + self._textCtrl.StopEditing() + + self._textCtrl = TabTextCtrl(ctrl, page_info, page_index) + self._textCtrl.SetFocus() + + return True diff --git a/autres/aui/dockart.py b/autres/aui/dockart.py new file mode 100644 index 0000000..17da477 --- /dev/null +++ b/autres/aui/dockart.py @@ -0,0 +1,1162 @@ +""" +Dock art provider code - a dock provider provides all drawing functionality to +the AUI dock manager. This allows the dock manager to have a plugable look-and-feel. + +By default, a L{AuiManager} uses an instance of this class called L{AuiDefaultDockArt} +which provides bitmap art and a colour scheme that is adapted to the major platforms' +look. You can either derive from that class to alter its behaviour or write a +completely new dock art class. Call L{AuiManager.SetArtProvider} to make use this +new dock art. +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx +import types + +from aui_utilities import BitmapFromBits, StepColour, ChopText, GetBaseColour +from aui_utilities import DrawGradientRectangle, DrawMACCloseButton +from aui_utilities import DarkenBitmap, LightContrastColour +from aui_constants import * + +optionActive = 2**14 + +_ctypes = False + +# Try to import winxptheme for ModernDockArt +if wx.Platform == "__WXMSW__": + try: + import ctypes + import winxptheme + _ctypes = True + except ImportError: + pass + +# -- AuiDefaultDockArt class implementation -- + +class AuiDefaultDockArt(object): + """ + Dock art provider code - a dock provider provides all drawing functionality + to the AUI dock manager. This allows the dock manager to have a plugable + look-and-feel. + + By default, a L{AuiManager} uses an instance of this class called L{AuiDefaultDockArt} + which provides bitmap art and a colour scheme that is adapted to the major + platforms' look. You can either derive from that class to alter its behaviour or + write a completely new dock art class. + + Call L{AuiManager.SetArtProvider} to make use this new dock art. + + + **Metric Ordinals** + + These are the possible pane dock art settings for L{AuiManager}: + + ================================================ ====================================== + Metric Ordinal Constant Description + ================================================ ====================================== + ``AUI_DOCKART_SASH_SIZE`` Customizes the sash size + ``AUI_DOCKART_CAPTION_SIZE`` Customizes the caption size + ``AUI_DOCKART_GRIPPER_SIZE`` Customizes the gripper size + ``AUI_DOCKART_PANE_BORDER_SIZE`` Customizes the pane border size + ``AUI_DOCKART_PANE_BUTTON_SIZE`` Customizes the pane button size + ``AUI_DOCKART_BACKGROUND_COLOUR`` Customizes the background colour + ``AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR`` Customizes the background gradient colour + ``AUI_DOCKART_SASH_COLOUR`` Customizes the sash colour + ``AUI_DOCKART_ACTIVE_CAPTION_COLOUR`` Customizes the active caption colour + ``AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR`` Customizes the active caption gradient colour + ``AUI_DOCKART_INACTIVE_CAPTION_COLOUR`` Customizes the inactive caption colour + ``AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR`` Customizes the inactive gradient caption colour + ``AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR`` Customizes the active caption text colour + ``AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR`` Customizes the inactive caption text colour + ``AUI_DOCKART_BORDER_COLOUR`` Customizes the border colour + ``AUI_DOCKART_GRIPPER_COLOUR`` Customizes the gripper colour + ``AUI_DOCKART_CAPTION_FONT`` Customizes the caption font + ``AUI_DOCKART_GRADIENT_TYPE`` Customizes the gradient type (no gradient, vertical or horizontal) + ``AUI_DOCKART_DRAW_SASH_GRIP`` Draw a sash grip on the sash + ================================================ ====================================== + + + **Gradient Types** + + These are the possible gradient dock art settings for L{AuiManager}: + + ============================================ ====================================== + Gradient Constant Description + ============================================ ====================================== + ``AUI_GRADIENT_NONE`` No gradient on the captions + ``AUI_GRADIENT_VERTICAL`` Vertical gradient on the captions + ``AUI_GRADIENT_HORIZONTAL`` Horizontal gradient on the captions + ============================================ ====================================== + + + **Button States** + + These are the possible pane button / L{AuiNotebook} button / L{AuiToolBar} button states: + + ============================================ ====================================== + Button State Constant Description + ============================================ ====================================== + ``AUI_BUTTON_STATE_NORMAL`` Normal button state + ``AUI_BUTTON_STATE_HOVER`` Hovered button state + ``AUI_BUTTON_STATE_PRESSED`` Pressed button state + ``AUI_BUTTON_STATE_DISABLED`` Disabled button state + ``AUI_BUTTON_STATE_HIDDEN`` Hidden button state + ``AUI_BUTTON_STATE_CHECKED`` Checked button state + ============================================ ====================================== + + + **Button Identifiers** + + These are the possible pane button / L{AuiNotebook} button / L{AuiToolBar} button identifiers: + + ============================================ ====================================== + Button Identifier Description + ============================================ ====================================== + ``AUI_BUTTON_CLOSE`` Shows a close button on the pane + ``AUI_BUTTON_MAXIMIZE_RESTORE`` Shows a maximize/restore button on the pane + ``AUI_BUTTON_MINIMIZE`` Shows a minimize button on the pane + ``AUI_BUTTON_PIN`` Shows a pin button on the pane + ``AUI_BUTTON_OPTIONS`` Shows an option button on the pane (not implemented) + ``AUI_BUTTON_WINDOWLIST`` Shows a window list button on the pane (for L{AuiNotebook}) + ``AUI_BUTTON_LEFT`` Shows a left button on the pane (for L{AuiNotebook}) + ``AUI_BUTTON_RIGHT`` Shows a right button on the pane (for L{AuiNotebook}) + ``AUI_BUTTON_UP`` Shows an up button on the pane (not implemented) + ``AUI_BUTTON_DOWN`` Shows a down button on the pane (not implemented) + ``AUI_BUTTON_CUSTOM1`` Shows a custom button on the pane (not implemented) + ``AUI_BUTTON_CUSTOM2`` Shows a custom button on the pane (not implemented) + ``AUI_BUTTON_CUSTOM3`` Shows a custom button on the pane (not implemented) + ============================================ ====================================== + + """ + + def __init__(self): + """ Default class constructor. """ + + self.Init() + + isMac = wx.Platform == "__WXMAC__" + + if isMac: + self._caption_font = wx.SMALL_FONT + else: + self._caption_font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False) + + self.SetDefaultPaneBitmaps(isMac) + self._restore_bitmap = wx.BitmapFromXPMData(restore_xpm) + + # default metric values + self._sash_size = 4 + + if isMac: + # This really should be implemented in wx.SystemSettings + # There is no way to do this that I am aware outside of using + # the cocoa python bindings. 8 pixels looks correct on my system + # so hard coding it for now. + + # How do I translate this?!? Not sure of the below implementation... + # SInt32 height; + # GetThemeMetric( kThemeMetricSmallPaneSplitterHeight , &height ); + # self._sash_size = height; + + self._sash_size = 8 # Carbon.Appearance.kThemeMetricPaneSplitterHeight + + elif wx.Platform == "__WXGTK__": + self._sash_size = wx.RendererNative.Get().GetSplitterParams(wx.GetTopLevelWindows()[0]).widthSash + + else: + self._sash_size = 4 + + self._caption_size = 19 + self._border_size = 1 + self._button_size = 14 + self._gripper_size = 9 + self._gradient_type = AUI_GRADIENT_VERTICAL + self._draw_sash = False + + + def Init(self): + """ Initializes the dock art. """ + + base_colour = GetBaseColour() + darker1_colour = StepColour(base_colour, 85) + darker2_colour = StepColour(base_colour, 75) + darker3_colour = StepColour(base_colour, 60) + darker4_colour = StepColour(base_colour, 40) + + self._background_colour = base_colour + self._background_gradient_colour = StepColour(base_colour, 180) + + isMac = wx.Platform == "__WXMAC__" + + if isMac: + self._active_caption_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) + else: + self._active_caption_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION) + + self._active_caption_gradient_colour = LightContrastColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)) + self._active_caption_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT) + self._inactive_caption_colour = darker1_colour + self._inactive_caption_gradient_colour = StepColour(base_colour, 97) + self._inactive_caption_text_colour = wx.BLACK + + self._sash_brush = wx.Brush(base_colour) + self._background_brush = wx.Brush(base_colour) + self._border_pen = wx.Pen(darker2_colour) + self._gripper_brush = wx.Brush(base_colour) + self._gripper_pen1 = wx.Pen(darker4_colour) + self._gripper_pen2 = wx.Pen(darker3_colour) + self._gripper_pen3 = wx.WHITE_PEN + + + def GetMetric(self, id): + """ + Gets the value of a certain setting. + + :param `id`: can be one of the size values in `Metric Ordinals`. + """ + + + if id == AUI_DOCKART_SASH_SIZE: + return self._sash_size + elif id == AUI_DOCKART_CAPTION_SIZE: + return self._caption_size + elif id == AUI_DOCKART_GRIPPER_SIZE: + return self._gripper_size + elif id == AUI_DOCKART_PANE_BORDER_SIZE: + return self._border_size + elif id == AUI_DOCKART_PANE_BUTTON_SIZE: + return self._button_size + elif id == AUI_DOCKART_GRADIENT_TYPE: + return self._gradient_type + elif id == AUI_DOCKART_DRAW_SASH_GRIP: + return self._draw_sash + else: + raise Exception("Invalid Metric Ordinal.") + + + def SetMetric(self, id, new_val): + """ + Sets the value of a certain setting using `new_val` + + :param `id`: can be one of the size values in `Metric Ordinals`; + :param `new_val`: the new value of the setting. + """ + + if id == AUI_DOCKART_SASH_SIZE: + self._sash_size = new_val + elif id == AUI_DOCKART_CAPTION_SIZE: + self._caption_size = new_val + elif id == AUI_DOCKART_GRIPPER_SIZE: + self._gripper_size = new_val + elif id == AUI_DOCKART_PANE_BORDER_SIZE: + self._border_size = new_val + elif id == AUI_DOCKART_PANE_BUTTON_SIZE: + self._button_size = new_val + elif id == AUI_DOCKART_GRADIENT_TYPE: + self._gradient_type = new_val + elif id == AUI_DOCKART_DRAW_SASH_GRIP: + self._draw_sash = new_val + else: + raise Exception("Invalid Metric Ordinal.") + + + def GetColor(self, id): + """ + Gets the colour of a certain setting. + + :param `id`: can be one of the colour values in `Metric Ordinals`. + """ + + if id == AUI_DOCKART_BACKGROUND_COLOUR: + return self._background_brush.GetColour() + elif id == AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR: + return self._background_gradient_colour + elif id == AUI_DOCKART_SASH_COLOUR: + return self._sash_brush.GetColour() + elif id == AUI_DOCKART_INACTIVE_CAPTION_COLOUR: + return self._inactive_caption_colour + elif id == AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR: + return self._inactive_caption_gradient_colour + elif id == AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR: + return self._inactive_caption_text_colour + elif id == AUI_DOCKART_ACTIVE_CAPTION_COLOUR: + return self._active_caption_colour + elif id == AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR: + return self._active_caption_gradient_colour + elif id == AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR: + return self._active_caption_text_colour + elif id == AUI_DOCKART_BORDER_COLOUR: + return self._border_pen.GetColour() + elif id == AUI_DOCKART_GRIPPER_COLOUR: + return self._gripper_brush.GetColour() + else: + raise Exception("Invalid Colour Ordinal.") + + + def SetColor(self, id, colour): + """ + Sets the colour of a certain setting. + + :param `id`: can be one of the colour values in `Metric Ordinals`; + :param `colour`: the new value of the setting. + """ + + if isinstance(colour, basestring): + colour = wx.NamedColour(colour) + elif isinstance(colour, types.TupleType): + colour = wx.Colour(*colour) + elif isinstance(colour, types.IntType): + colour = wx.ColourRGB(colour) + + if id == AUI_DOCKART_BACKGROUND_COLOUR: + self._background_brush.SetColour(colour) + elif id == AUI_DOCKART_BACKGROUND_GRADIENT_COLOUR: + self._background_gradient_colour = colour + elif id == AUI_DOCKART_SASH_COLOUR: + self._sash_brush.SetColour(colour) + elif id == AUI_DOCKART_INACTIVE_CAPTION_COLOUR: + self._inactive_caption_colour = colour + if not self._custom_pane_bitmaps and wx.Platform == "__WXMAC__": + # No custom bitmaps for the pane close button + # Change the MAC close bitmap colour + self._inactive_close_bitmap = DrawMACCloseButton(wx.WHITE, colour) + + elif id == AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR: + self._inactive_caption_gradient_colour = colour + elif id == AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR: + self._inactive_caption_text_colour = colour + elif id == AUI_DOCKART_ACTIVE_CAPTION_COLOUR: + self._active_caption_colour = colour + if not self._custom_pane_bitmaps and wx.Platform == "__WXMAC__": + # No custom bitmaps for the pane close button + # Change the MAC close bitmap colour + self._active_close_bitmap = DrawMACCloseButton(wx.WHITE, colour) + + elif id == AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR: + self._active_caption_gradient_colour = colour + elif id == AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR: + self._active_caption_text_colour = colour + elif id == AUI_DOCKART_BORDER_COLOUR: + self._border_pen.SetColour(colour) + elif id == AUI_DOCKART_GRIPPER_COLOUR: + self._gripper_brush.SetColour(colour) + self._gripper_pen1.SetColour(StepColour(colour, 40)) + self._gripper_pen2.SetColour(StepColour(colour, 60)) + else: + raise Exception("Invalid Colour Ordinal.") + + + GetColour = GetColor + SetColour = SetColor + + def SetFont(self, id, font): + """ + Sets a font setting. + + :param `id`: must be ``AUI_DOCKART_CAPTION_FONT``; + :param `font`: an instance of `wx.Font`. + """ + + if id == AUI_DOCKART_CAPTION_FONT: + self._caption_font = font + + + def GetFont(self, id): + """ + Gets a font setting. + + :param `id`: must be ``AUI_DOCKART_CAPTION_FONT``, otherwise `wx.NullFont` is returned. + """ + + if id == AUI_DOCKART_CAPTION_FONT: + return self._caption_font + + return wx.NullFont + + + def DrawSash(self, dc, window, orient, rect): + """ + Draws a sash between two windows. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `orient`: the sash orientation; + :param `rect`: the sash rectangle. + """ + + # AG: How do we make this work?!? + # RendererNative does not use the sash_brush chosen by the user + # and the rect.GetSize() is ignored as the sash is always drawn + # 3 pixel wide + # wx.RendererNative.Get().DrawSplitterSash(window, dc, rect.GetSize(), pos, orient) + + dc.SetPen(wx.TRANSPARENT_PEN) + dc.SetBrush(self._sash_brush) + dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) + + draw_sash = self.GetMetric(AUI_DOCKART_DRAW_SASH_GRIP) + if draw_sash: + self.DrawSashGripper(dc, orient, rect) + + + def DrawBackground(self, dc, window, orient, rect): + """ + Draws a background. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `orient`: the gradient (if any) orientation; + :param `rect`: the background rectangle. + """ + + dc.SetPen(wx.TRANSPARENT_PEN) + if wx.Platform == "__WXMAC__": + # we have to clear first, otherwise we are drawing a light striped pattern + # over an already darker striped background + dc.SetBrush(wx.WHITE_BRUSH) + dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) + + DrawGradientRectangle(dc, rect, self._background_brush.GetColour(), + self._background_gradient_colour, + AUI_GRADIENT_HORIZONTAL, rect.x, 700) + + + def DrawBorder(self, dc, window, rect, pane): + """ + Draws the pane border. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `rect`: the border rectangle; + :param `pane`: the pane for which the border is drawn. + """ + + drect = wx.Rect(*rect) + + dc.SetPen(self._border_pen) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + + border_width = self.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) + + if pane.IsToolbar(): + + for ii in xrange(0, border_width): + + dc.SetPen(wx.WHITE_PEN) + dc.DrawLine(drect.x, drect.y, drect.x+drect.width, drect.y) + dc.DrawLine(drect.x, drect.y, drect.x, drect.y+drect.height) + dc.SetPen(self._border_pen) + dc.DrawLine(drect.x, drect.y+drect.height-1, + drect.x+drect.width, drect.y+drect.height-1) + dc.DrawLine(drect.x+drect.width-1, drect.y, + drect.x+drect.width-1, drect.y+drect.height) + drect.Deflate(1, 1) + + else: + + for ii in xrange(0, border_width): + + dc.DrawRectangle(drect.x, drect.y, drect.width, drect.height) + drect.Deflate(1, 1) + + + def DrawCaptionBackground(self, dc, rect, pane): + """ + Draws the text caption background in the pane. + + :param `dc`: a `wx.DC` device context; + :param `rect`: the text caption rectangle; + :param `pane`: the pane for which the text background is drawn. + """ + + active = pane.state & optionActive + + if self._gradient_type == AUI_GRADIENT_NONE: + if active: + dc.SetBrush(wx.Brush(self._active_caption_colour)) + else: + dc.SetBrush(wx.Brush(self._inactive_caption_colour)) + + dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) + + else: + + switch_gradient = pane.HasCaptionLeft() + gradient_type = self._gradient_type + if switch_gradient: + gradient_type = (self._gradient_type == AUI_GRADIENT_HORIZONTAL and [AUI_GRADIENT_VERTICAL] or \ + [AUI_GRADIENT_HORIZONTAL])[0] + + if active: + if wx.Platform == "__WXMAC__": + DrawGradientRectangle(dc, rect, self._active_caption_colour, + self._active_caption_gradient_colour, + gradient_type) + else: + DrawGradientRectangle(dc, rect, self._active_caption_gradient_colour, + self._active_caption_colour, + gradient_type) + else: + if wx.Platform == "__WXMAC__": + DrawGradientRectangle(dc, rect, self._inactive_caption_gradient_colour, + self._inactive_caption_colour, + gradient_type) + else: + DrawGradientRectangle(dc, rect, self._inactive_caption_colour, + self._inactive_caption_gradient_colour, + gradient_type) + + + def DrawIcon(self, dc, rect, pane): + """ + Draws the icon in the pane caption area. + + :param `dc`: a `wx.DC` device context; + :param `rect`: the pane caption rectangle; + :param `pane`: the pane for which the icon is drawn. + """ + + # Draw the icon centered vertically + if pane.icon.Ok(): + if pane.HasCaptionLeft(): + bmp = wx.ImageFromBitmap(pane.icon).Rotate90(clockwise=False) + dc.DrawBitmap(bmp.ConvertToBitmap(), rect.x+(rect.width-pane.icon.GetWidth())/2, rect.y+rect.height-2-pane.icon.GetHeight(), True) + else: + dc.DrawBitmap(pane.icon, rect.x+2, rect.y+(rect.height-pane.icon.GetHeight())/2, True) + + + def DrawCaption(self, dc, window, text, rect, pane): + """ + Draws the text in the pane caption. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `text`: the text to be displayed; + :param `rect`: the pane caption rectangle; + :param `pane`: the pane for which the text is drawn. + """ + + dc.SetPen(wx.TRANSPARENT_PEN) + dc.SetFont(self._caption_font) + + self.DrawCaptionBackground(dc, rect, pane) + + if pane.state & optionActive: + dc.SetTextForeground(self._active_caption_text_colour) + else: + dc.SetTextForeground(self._inactive_caption_text_colour) + + w, h = dc.GetTextExtent("ABCDEFHXfgkj") + + clip_rect = wx.Rect(*rect) + btns = pane.CountButtons() + + captionLeft = pane.HasCaptionLeft() + variable = (captionLeft and [rect.height] or [rect.width])[0] + + variable -= 3 # text offset + variable -= 2 # button padding + + caption_offset = 0 + if pane.icon: + if captionLeft: + caption_offset += pane.icon.GetHeight() + 3 + else: + caption_offset += pane.icon.GetWidth() + 3 + + self.DrawIcon(dc, rect, pane) + + variable -= caption_offset + variable -= btns*(self._button_size + self._border_size) + draw_text = ChopText(dc, text, variable) + + if captionLeft: + dc.DrawRotatedText(draw_text, rect.x+(rect.width/2)-(h/2)-1, rect.y+rect.height-3-caption_offset, 90) + else: + dc.DrawText(draw_text, rect.x+3+caption_offset, rect.y+(rect.height/2)-(h/2)-1) + + + def RequestUserAttention(self, dc, window, text, rect, pane): + """ + Requests the user attention by intermittently highlighting the pane caption. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `text`: the text to be displayed; + :param `rect`: the pane caption rectangle; + :param `pane`: the pane for which the text is drawn. + """ + + state = pane.state + pane.state &= ~optionActive + + for indx in xrange(6): + active = (indx%2 == 0 and [True] or [False])[0] + if active: + pane.state |= optionActive + else: + pane.state &= ~optionActive + + self.DrawCaptionBackground(dc, rect, pane) + self.DrawCaption(dc, window, text, rect, pane) + wx.SafeYield() + wx.MilliSleep(350) + + pane.state = state + + + def DrawGripper(self, dc, window, rect, pane): + """ + Draws a gripper on the pane. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `rect`: the pane caption rectangle; + :param `pane`: the pane for which the gripper is drawn. + """ + + dc.SetPen(wx.TRANSPARENT_PEN) + dc.SetBrush(self._gripper_brush) + + dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) + + if not pane.HasGripperTop(): + y = 4 + while 1: + dc.SetPen(self._gripper_pen1) + dc.DrawPoint(rect.x+3, rect.y+y) + dc.SetPen(self._gripper_pen2) + dc.DrawPoint(rect.x+3, rect.y+y+1) + dc.DrawPoint(rect.x+4, rect.y+y) + dc.SetPen(self._gripper_pen3) + dc.DrawPoint(rect.x+5, rect.y+y+1) + dc.DrawPoint(rect.x+5, rect.y+y+2) + dc.DrawPoint(rect.x+4, rect.y+y+2) + y = y + 4 + if y > rect.GetHeight() - 4: + break + else: + x = 4 + while 1: + dc.SetPen(self._gripper_pen1) + dc.DrawPoint(rect.x+x, rect.y+3) + dc.SetPen(self._gripper_pen2) + dc.DrawPoint(rect.x+x+1, rect.y+3) + dc.DrawPoint(rect.x+x, rect.y+4) + dc.SetPen(self._gripper_pen3) + dc.DrawPoint(rect.x+x+1, rect.y+5) + dc.DrawPoint(rect.x+x+2, rect.y+5) + dc.DrawPoint(rect.x+x+2, rect.y+4) + x = x + 4 + if x > rect.GetWidth() - 4: + break + + + def DrawPaneButton(self, dc, window, button, button_state, _rect, pane): + """ + Draws a pane button in the pane caption area. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `button`: the button to be drawn; + :param `button_state`: the pane button state; + :param `_rect`: the pane caption rectangle; + :param `pane`: the pane for which the button is drawn. + """ + + if not pane: + return + + if button == AUI_BUTTON_CLOSE: + if pane.state & optionActive: + bmp = self._active_close_bitmap + else: + bmp = self._inactive_close_bitmap + + elif button == AUI_BUTTON_PIN: + if pane.state & optionActive: + bmp = self._active_pin_bitmap + else: + bmp = self._inactive_pin_bitmap + + elif button == AUI_BUTTON_MAXIMIZE_RESTORE: + if pane.IsMaximized(): + if pane.state & optionActive: + bmp = self._active_restore_bitmap + else: + bmp = self._inactive_restore_bitmap + else: + if pane.state & optionActive: + bmp = self._active_maximize_bitmap + else: + bmp = self._inactive_maximize_bitmap + + elif button == AUI_BUTTON_MINIMIZE: + if pane.state & optionActive: + bmp = self._active_minimize_bitmap + else: + bmp = self._inactive_minimize_bitmap + + isVertical = pane.HasCaptionLeft() + + rect = wx.Rect(*_rect) + + if isVertical: + old_x = rect.x + rect.x = rect.x + (rect.width/2) - (bmp.GetWidth()/2) + rect.width = old_x + rect.width - rect.x - 1 + else: + old_y = rect.y + rect.y = rect.y + (rect.height/2) - (bmp.GetHeight()/2) + rect.height = old_y + rect.height - rect.y - 1 + + if button_state == AUI_BUTTON_STATE_PRESSED: + rect.x += 1 + rect.y += 1 + + if button_state in [AUI_BUTTON_STATE_HOVER, AUI_BUTTON_STATE_PRESSED]: + + if pane.state & optionActive: + + dc.SetBrush(wx.Brush(StepColour(self._active_caption_colour, 120))) + dc.SetPen(wx.Pen(StepColour(self._active_caption_colour, 70))) + + else: + + dc.SetBrush(wx.Brush(StepColour(self._inactive_caption_colour, 120))) + dc.SetPen(wx.Pen(StepColour(self._inactive_caption_colour, 70))) + + if wx.Platform != "__WXMAC__": + # draw the background behind the button + dc.DrawRectangle(rect.x, rect.y, 15, 15) + else: + # Darker the bitmap a bit + bmp = DarkenBitmap(bmp, self._active_caption_colour, StepColour(self._active_caption_colour, 110)) + + if isVertical: + bmp = wx.ImageFromBitmap(bmp).Rotate90(clockwise=False).ConvertToBitmap() + + # draw the button itself + dc.DrawBitmap(bmp, rect.x, rect.y, True) + + + def DrawSashGripper(self, dc, orient, rect): + """ + Draws a sash gripper on a sash between two windows. + + :param `dc`: a `wx.DC` device context; + :param `orient`: the sash orientation; + :param `rect`: the sash rectangle. + """ + + dc.SetBrush(self._gripper_brush) + + if orient == wx.HORIZONTAL: # horizontal sash + + x = rect.x + int((1.0/4.0)*rect.width) + xend = rect.x + int((3.0/4.0)*rect.width) + y = rect.y + (rect.height/2) - 1 + + while 1: + dc.SetPen(self._gripper_pen3) + dc.DrawRectangle(x, y, 2, 2) + dc.SetPen(self._gripper_pen2) + dc.DrawPoint(x+1, y+1) + x = x + 5 + + if x >= xend: + break + + else: + + y = rect.y + int((1.0/4.0)*rect.height) + yend = rect.y + int((3.0/4.0)*rect.height) + x = rect.x + (rect.width/2) - 1 + + while 1: + dc.SetPen(self._gripper_pen3) + dc.DrawRectangle(x, y, 2, 2) + dc.SetPen(self._gripper_pen2) + dc.DrawPoint(x+1, y+1) + y = y + 5 + + if y >= yend: + break + + + def SetDefaultPaneBitmaps(self, isMac): + """ + Assigns the default pane bitmaps. + + :param `isMac`: whether we are on wxMAC or not. + """ + + if isMac: + self._inactive_close_bitmap = DrawMACCloseButton(wx.WHITE, self._inactive_caption_colour) + self._active_close_bitmap = DrawMACCloseButton(wx.WHITE, self._active_caption_colour) + else: + self._inactive_close_bitmap = BitmapFromBits(close_bits, 16, 16, self._inactive_caption_text_colour) + self._active_close_bitmap = BitmapFromBits(close_bits, 16, 16, self._active_caption_text_colour) + + if isMac: + self._inactive_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, wx.WHITE) + self._active_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, wx.WHITE) + else: + self._inactive_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, self._inactive_caption_text_colour) + self._active_maximize_bitmap = BitmapFromBits(max_bits, 16, 16, self._active_caption_text_colour) + + if isMac: + self._inactive_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, wx.WHITE) + self._active_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, wx.WHITE) + else: + self._inactive_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, self._inactive_caption_text_colour) + self._active_restore_bitmap = BitmapFromBits(restore_bits, 16, 16, self._active_caption_text_colour) + + if isMac: + self._inactive_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, wx.WHITE) + self._active_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, wx.WHITE) + else: + self._inactive_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, self._inactive_caption_text_colour) + self._active_minimize_bitmap = BitmapFromBits(minimize_bits, 16, 16, self._active_caption_text_colour) + + self._inactive_pin_bitmap = BitmapFromBits(pin_bits, 16, 16, self._inactive_caption_text_colour) + self._active_pin_bitmap = BitmapFromBits(pin_bits, 16, 16, self._active_caption_text_colour) + + self._custom_pane_bitmaps = False + + + def SetCustomPaneBitmap(self, bmp, button, active, maximize=False): + """ + Sets a custom button bitmap for the pane button. + + :param `bmp`: the actual bitmap to set; + :param `button`: the button identifier; + :param `active`: whether it is the bitmap for the active button or not; + :param `maximize`: used to distinguish between the maximize and restore bitmaps. + """ + + if bmp.GetWidth() > 16 or bmp.GetHeight() > 16: + raise Exception("The input bitmap is too big") + + if button == AUI_BUTTON_CLOSE: + if active: + self._active_close_bitmap = bmp + else: + self._inactive_close_bitmap = bmp + + if wx.Platform == "__WXMAC__": + self._custom_pane_bitmaps = True + + elif button == AUI_BUTTON_PIN: + if active: + self._active_pin_bitmap = bmp + else: + self._inactive_pin_bitmap = bmp + + elif button == AUI_BUTTON_MAXIMIZE_RESTORE: + if maximize: + if active: + self._active_maximize_bitmap = bmp + else: + self._inactive_maximize_bitmap = bmp + else: + if active: + self._active_restore_bitmap = bmp + else: + self._inactive_restore_bitmap = bmp + + elif button == AUI_BUTTON_MINIMIZE: + if active: + self._active_minimize_bitmap = bmp + else: + self._inactive_minimize_bitmap = bmp + + +if _ctypes: + class RECT(ctypes.Structure): + """ Used to handle L{ModernDockArt} on Windows XP/Vista/7. """ + _fields_ = [('left', ctypes.c_ulong),('top', ctypes.c_ulong),('right', ctypes.c_ulong),('bottom', ctypes.c_ulong)] + + def dump(self): + """ Dumps `self` as a `wx.Rect`. """ + return map(int, (self.left, self.top, self.right, self.bottom)) + + + class SIZE(ctypes.Structure): + """ Used to handle L{ModernDockArt} on Windows XP/Vista/7. """ + _fields_ = [('x', ctypes.c_long),('y', ctypes.c_long)] + + +class ModernDockArt(AuiDefaultDockArt): + """ + ModernDockArt is a custom `AuiDockArt` class, that implements a look similar to + Firefox and other recents applications. + + Is uses the `winxptheme` module and XP themes whenever possible, so it should + look good even if the user has a custom theme. + + :note: This dock art is Windows only and will only work if you have installed + Mark Hammond's `pywin32` module (http://sourceforge.net/projects/pywin32/). + """ + + def __init__(self, win): + """ + Default class constructor. + + :param `win`: the window managed by L{AuiManager}. + """ + + AuiDefaultDockArt.__init__(self) + + self.win = win + + # Get the size of a small close button (themed) + hwnd = self.win.GetHandle() + + self.hTheme1 = winxptheme.OpenThemeData(hwnd, "Window") + + self.usingTheme = True + + if not self.hTheme1: + self.usingTheme = False + + self._button_size = 13 + + self._button_border_size = 3 + self._caption_text_indent = 6 + self._caption_size = 22 + + # We only highlight the active pane with the caption text being in bold. + # So we do not want a special colour for active elements. + self._active_close_bitmap = self._inactive_close_bitmap + + self.Init() + + + def Init(self): + """ Initializes the dock art. """ + + AuiDefaultDockArt.Init(self) + + self._active_caption_colour = self._inactive_caption_colour + self._active_caption_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_CAPTIONTEXT) + self._inactive_caption_text_colour = self._active_caption_text_colour + + + def DrawCaption(self, dc, window, text, rect, pane): + """ + Draws the text in the pane caption. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `text`: the text to be displayed; + :param `rect`: the pane caption rectangle; + :param `pane`: the pane for which the text is drawn. + """ + + dc.SetPen(wx.TRANSPARENT_PEN) + self.DrawCaptionBackground(dc, rect, pane) + + active = ((pane.state & optionActive) and [True] or [False])[0] + + self._caption_font.SetWeight(wx.FONTWEIGHT_BOLD) + dc.SetFont(self._caption_font) + + if active: + dc.SetTextForeground(self._active_caption_text_colour) + else: + dc.SetTextForeground(self._inactive_caption_text_colour) + + w, h = dc.GetTextExtent("ABCDEFHXfgkj") + + clip_rect = wx.Rect(*rect) + btns = pane.CountButtons() + + captionLeft = pane.HasCaptionLeft() + variable = (captionLeft and [rect.height] or [rect.width])[0] + + variable -= 3 # text offset + variable -= 2 # button padding + + caption_offset = 0 + if pane.icon: + if captionLeft: + caption_offset += pane.icon.GetHeight() + 3 + else: + caption_offset += pane.icon.GetWidth() + 3 + + self.DrawIcon(dc, rect, pane) + + diff = -2 + if self.usingTheme: + diff = -1 + + variable -= caption_offset + variable -= btns*(self._button_size + self._button_border_size) + draw_text = ChopText(dc, text, variable) + + if captionLeft: + dc.DrawRotatedText(draw_text, rect.x+(rect.width/2)-(h/2)-diff, rect.y+rect.height-3-caption_offset, 90) + else: + dc.DrawText(draw_text, rect.x+3+caption_offset, rect.y+(rect.height/2)-(h/2)-diff) + + + def DrawCaptionBackground(self, dc, rect, pane): + """ + Draws the text caption background in the pane. + + :param `dc`: a `wx.DC` device context; + :param `rect`: the text caption rectangle; + :param `pane`: the pane for which we are drawing the caption background. + """ + + dc.SetBrush(self._background_brush) + dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) + + active = ((pane.state & optionActive) and [True] or [False])[0] + + if self.usingTheme: + + rectangle = wx.Rect() + + rc = RECT(rectangle.x, rectangle.y, rectangle.width, rectangle.height) + + # If rect x/y values are negative rc.right/bottom values will overflow and winxptheme.DrawThemeBackground + # will raise a TypeError. Ensure they are never negative. + rect.x = max(0, rect.x) + rect.y = max(0, rect.y) + + rc.top = rect.x + rc.left = rect.y + rc.right = rect.x + rect.width + rc.bottom = rect.y + rect.height + + if active: + winxptheme.DrawThemeBackground(self.hTheme1, dc.GetHDC(), 5, 1, (rc.top, rc.left, rc.right, rc.bottom), None) + else: + winxptheme.DrawThemeBackground(self.hTheme1, dc.GetHDC(), 5, 2, (rc.top, rc.left, rc.right, rc.bottom), None) + + else: + + AuiDefaultDockArt.DrawCaptionBackground(self, dc, rect, pane) + + + def RequestUserAttention(self, dc, window, text, rect, pane): + """ + Requests the user attention by intermittently highlighting the pane caption. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `text`: the text to be displayed; + :param `rect`: the pane caption rectangle; + :param `pane`: the pane for which the text is drawn. + """ + + state = pane.state + pane.state &= ~optionActive + + for indx in xrange(6): + active = (indx%2 == 0 and [True] or [False])[0] + if active: + pane.state |= optionActive + else: + pane.state &= ~optionActive + + self.DrawCaptionBackground(dc, rect, pane) + self.DrawCaption(dc, window, text, rect, pane) + wx.SafeYield() + wx.MilliSleep(350) + + pane.state = state + + + def DrawPaneButton(self, dc, window, button, button_state, rect, pane): + """ + Draws a pane button in the pane caption area. + + :param `dc`: a `wx.DC` device context; + :param `window`: an instance of `wx.Window`; + :param `button`: the button to be drawn; + :param `button_state`: the pane button state; + :param `rect`: the pane caption rectangle; + :param `pane`: the pane for which the button is drawn. + """ + + if self.usingTheme: + + hTheme = self.hTheme1 + + # Get the real button position (compensating for borders) + drect = wx.Rect(rect.x, rect.y, self._button_size, self._button_size) + + # Draw the themed close button + rc = RECT(0, 0, 0, 0) + if pane.HasCaptionLeft(): + rc.top = rect.x + self._button_border_size + rc.left = int(rect.y + 1.5*self._button_border_size) + rc.right = rect.x + self._button_size + self._button_border_size + rc.bottom = int(rect.y + self._button_size + 1.5*self._button_border_size) + else: + rc.top = rect.x - self._button_border_size + rc.left = int(rect.y + 1.5*self._button_border_size) + rc.right = rect.x + self._button_size- self._button_border_size + rc.bottom = int(rect.y + self._button_size + 1.5*self._button_border_size) + + if button == AUI_BUTTON_CLOSE: + btntype = 19 + + elif button == AUI_BUTTON_PIN: + btntype = 23 + + elif button == AUI_BUTTON_MAXIMIZE_RESTORE: + if not pane.IsMaximized(): + btntype = 17 + else: + btntype = 21 + else: + btntype = 15 + + state = 4 # CBS_DISABLED + + if pane.state & optionActive: + + if button_state == AUI_BUTTON_STATE_NORMAL: + state = 1 # CBS_NORMAL + + elif button_state == AUI_BUTTON_STATE_HOVER: + state = 2 # CBS_HOT + + elif button_state == AUI_BUTTON_STATE_PRESSED: + state = 3 # CBS_PUSHED + + else: + raise Exception("ERROR: Unknown State.") + + else: # inactive pane + + if button_state == AUI_BUTTON_STATE_NORMAL: + state = 5 # CBS_NORMAL + + elif button_state == AUI_BUTTON_STATE_HOVER: + state = 6 # CBS_HOT + + elif button_state == AUI_BUTTON_STATE_PRESSED: + state = 7 # CBS_PUSHED + + else: + raise Exception("ERROR: Unknown State.") + + try: + winxptheme.DrawThemeBackground(hTheme, dc.GetHDC(), btntype, state, (rc.top, rc.left, rc.right, rc.bottom), None) + except TypeError: + return + + else: + + # Fallback to default closebutton if themes are not enabled + rect2 = wx.Rect(rect.x-4, rect.y+2, rect.width, rect.height) + AuiDefaultDockArt.DrawPaneButton(self, dc, window, button, button_state, rect2, pane) + diff --git a/autres/aui/framemanager.py b/autres/aui/framemanager.py new file mode 100644 index 0000000..9b277bf --- /dev/null +++ b/autres/aui/framemanager.py @@ -0,0 +1,10385 @@ +# --------------------------------------------------------------------------- # +# AUI Library wxPython IMPLEMENTATION +# +# Original C++ Code From Kirix (wxAUI). You Can Find It At: +# +# License: wxWidgets license +# +# http:#www.kirix.com/en/community/opensource/wxaui/about_wxaui.html +# +# Current wxAUI Version Tracked: wxWidgets 2.9.0 SVN HEAD +# +# +# Python Code By: +# +# Andrea Gavana, @ 23 Dec 2005 +# Latest Revision: 10 Mar 2011, 15.00 GMT +# +# For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please +# Write To Me At: +# +# andrea.gavana@gmail.com +# gavana@kpo.kz +# +# Or, Obviously, To The wxPython Mailing List!!! +# +# End Of Comments +# --------------------------------------------------------------------------- # + +""" +Description +=========== + +framemanager is the central module of the AUI class framework. + +L{AuiManager} manages the panes associated with it for a particular `wx.Frame`, using +a pane's L{AuiPaneInfo} information to determine each pane's docking and floating +behavior. AuiManager uses wxPython' sizer mechanism to plan the layout of each frame. +It uses a replaceable dock art class to do all drawing, so all drawing is localized +in one area, and may be customized depending on an application's specific needs. + +AuiManager works as follows: the programmer adds panes to the class, or makes +changes to existing pane properties (dock position, floating state, show state, etc...). +To apply these changes, AuiManager's L{AuiManager.Update} function is called. This batch +processing can be used to avoid flicker, by modifying more than one pane at a time, +and then "committing" all of the changes at once by calling `Update()`. + +Panes can be added quite easily:: + + text1 = wx.TextCtrl(self, -1) + text2 = wx.TextCtrl(self, -1) + self._mgr.AddPane(text1, AuiPaneInfo().Left().Caption("Pane Number One")) + self._mgr.AddPane(text2, AuiPaneInfo().Bottom().Caption("Pane Number Two")) + + self._mgr.Update() + + +Later on, the positions can be modified easily. The following will float an +existing pane in a tool window:: + + self._mgr.GetPane(text1).Float() + + +Layers, Rows and Directions, Positions +====================================== + +Inside AUI, the docking layout is figured out by checking several pane parameters. +Four of these are important for determining where a pane will end up. + +**Direction** - Each docked pane has a direction, `Top`, `Bottom`, `Left`, `Right`, or `Center`. +This is fairly self-explanatory. The pane will be placed in the location specified +by this variable. + +**Position** - More than one pane can be placed inside of a "dock". Imagine two panes +being docked on the left side of a window. One pane can be placed over another. +In proportionally managed docks, the pane position indicates it's sequential position, +starting with zero. So, in our scenario with two panes docked on the left side, the +top pane in the dock would have position 0, and the second one would occupy position 1. + +**Row** - A row can allow for two docks to be placed next to each other. One of the most +common places for this to happen is in the toolbar. Multiple toolbar rows are allowed, +the first row being in row 0, and the second in row 1. Rows can also be used on +vertically docked panes. + +**Layer** - A layer is akin to an onion. Layer 0 is the very center of the managed pane. +Thus, if a pane is in layer 0, it will be closest to the center window (also sometimes +known as the "content window"). Increasing layers "swallow up" all layers of a lower +value. This can look very similar to multiple rows, but is different because all panes +in a lower level yield to panes in higher levels. The best way to understand layers +is by running the AUI sample (`AUI.py`). +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx +import time +import types +import warnings + +import auibar +import auibook +import tabmdi +import dockart +import tabart + +from aui_utilities import Clip, PaneCreateStippleBitmap, GetDockingImage, GetSlidingPoints + +from aui_constants import * + +# Define this as a translation function +_ = wx.GetTranslation + +_winxptheme = False +if wx.Platform == "__WXMSW__": + try: + import winxptheme + _winxptheme = True + except ImportError: + pass + +# wxPython version string +_VERSION_STRING = wx.VERSION_STRING + +# AUI Events +wxEVT_AUI_PANE_BUTTON = wx.NewEventType() +wxEVT_AUI_PANE_CLOSE = wx.NewEventType() +wxEVT_AUI_PANE_MAXIMIZE = wx.NewEventType() +wxEVT_AUI_PANE_RESTORE = wx.NewEventType() +wxEVT_AUI_RENDER = wx.NewEventType() +wxEVT_AUI_FIND_MANAGER = wx.NewEventType() +wxEVT_AUI_PANE_MINIMIZE = wx.NewEventType() +wxEVT_AUI_PANE_MIN_RESTORE = wx.NewEventType() +wxEVT_AUI_PANE_FLOATING = wx.NewEventType() +wxEVT_AUI_PANE_FLOATED = wx.NewEventType() +wxEVT_AUI_PANE_DOCKING = wx.NewEventType() +wxEVT_AUI_PANE_DOCKED = wx.NewEventType() +wxEVT_AUI_PANE_ACTIVATED = wx.NewEventType() +wxEVT_AUI_PERSPECTIVE_CHANGED = wx.NewEventType() + +EVT_AUI_PANE_BUTTON = wx.PyEventBinder(wxEVT_AUI_PANE_BUTTON, 0) +""" Fires an event when the user left-clicks on a pane button. """ +EVT_AUI_PANE_CLOSE = wx.PyEventBinder(wxEVT_AUI_PANE_CLOSE, 0) +""" A pane in `AuiManager` has been closed. """ +EVT_AUI_PANE_MAXIMIZE = wx.PyEventBinder(wxEVT_AUI_PANE_MAXIMIZE, 0) +""" A pane in `AuiManager` has been maximized. """ +EVT_AUI_PANE_RESTORE = wx.PyEventBinder(wxEVT_AUI_PANE_RESTORE, 0) +""" A pane in `AuiManager` has been restored from a maximized state. """ +EVT_AUI_RENDER = wx.PyEventBinder(wxEVT_AUI_RENDER, 0) +""" Fires an event every time the AUI frame is being repainted. """ +EVT_AUI_FIND_MANAGER = wx.PyEventBinder(wxEVT_AUI_FIND_MANAGER, 0) +""" Used to find which AUI manager is controlling a certain pane. """ +EVT_AUI_PANE_MINIMIZE = wx.PyEventBinder(wxEVT_AUI_PANE_MINIMIZE, 0) +""" A pane in `AuiManager` has been minimized. """ +EVT_AUI_PANE_MIN_RESTORE = wx.PyEventBinder(wxEVT_AUI_PANE_MIN_RESTORE, 0) +""" A pane in `AuiManager` has been restored from a minimized state. """ +EVT_AUI_PANE_FLOATING = wx.PyEventBinder(wxEVT_AUI_PANE_FLOATING, 0) +""" A pane in `AuiManager` is about to be floated. """ +EVT_AUI_PANE_FLOATED = wx.PyEventBinder(wxEVT_AUI_PANE_FLOATED, 0) +""" A pane in `AuiManager` has been floated. """ +EVT_AUI_PANE_DOCKING = wx.PyEventBinder(wxEVT_AUI_PANE_DOCKING, 0) +""" A pane in `AuiManager` is about to be docked. """ +EVT_AUI_PANE_DOCKED = wx.PyEventBinder(wxEVT_AUI_PANE_DOCKED, 0) +""" A pane in `AuiManager` has been docked. """ +EVT_AUI_PANE_ACTIVATED = wx.PyEventBinder(wxEVT_AUI_PANE_ACTIVATED, 0) +""" A pane in `AuiManager` has been activated. """ +EVT_AUI_PERSPECTIVE_CHANGED = wx.PyEventBinder(wxEVT_AUI_PERSPECTIVE_CHANGED, 0) +""" The layout in `AuiManager` has been changed. """ + +# ---------------------------------------------------------------------------- # + +class AuiDockInfo(object): + """ A class to store all properties of a dock. """ + + def __init__(self): + """ + Default class constructor. + Used internally, do not call it in your code! + """ + + object.__init__(self) + + self.dock_direction = 0 + self.dock_layer = 0 + self.dock_row = 0 + self.size = 0 + self.min_size = 0 + self.resizable = True + self.fixed = False + self.toolbar = False + self.rect = wx.Rect() + self.panes = [] + + + def IsOk(self): + """ + Returns whether a dock is valid or not. + + In order to be valid, a dock needs to have a non-zero `dock_direction`. + """ + + return self.dock_direction != 0 + + + def IsHorizontal(self): + """ Returns whether the dock is horizontal or not. """ + + return self.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM] + + + def IsVertical(self): + """ Returns whether the dock is vertical or not. """ + + return self.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT, AUI_DOCK_CENTER] + + +# ---------------------------------------------------------------------------- # + +class AuiDockingGuideInfo(object): + """ A class which holds information about VS2005 docking guide windows. """ + + def __init__(self, other=None): + """ + Default class constructor. + Used internally, do not call it in your code! + + :param `other`: another instance of L{AuiDockingGuideInfo}. + """ + + if other: + self.Assign(other) + else: + # window representing the docking target + self.host = None + # dock direction (top, bottom, left, right, center) + self.dock_direction = AUI_DOCK_NONE + + + def Assign(self, other): + """ + Assigns the properties of the `other` L{AuiDockingGuideInfo} to `self`. + + :param `other`: another instance of L{AuiDockingGuideInfo}. + """ + + self.host = other.host + self.dock_direction = other.dock_direction + + + def Host(self, h): + """ + Hosts a docking guide window. + + :param `h`: an instance of L{AuiSingleDockingGuide} or L{AuiCenterDockingGuide}. + """ + + self.host = h + return self + + + def Left(self): + """ Sets the guide window to left docking. """ + + self.dock_direction = AUI_DOCK_LEFT + return self + + + def Right(self): + """ Sets the guide window to right docking. """ + + self.dock_direction = AUI_DOCK_RIGHT + return self + + + def Top(self): + """ Sets the guide window to top docking. """ + + self.dock_direction = AUI_DOCK_TOP + return self + + + def Bottom(self): + """ Sets the guide window to bottom docking. """ + + self.dock_direction = AUI_DOCK_BOTTOM + return self + + + def Center(self): + """ Sets the guide window to center docking. """ + + self.dock_direction = AUI_DOCK_CENTER + return self + + + def Centre(self): + """ Sets the guide window to centre docking. """ + + self.dock_direction = AUI_DOCK_CENTRE + return self + + +# ---------------------------------------------------------------------------- # + +class AuiDockUIPart(object): + """ A class which holds attributes for a UI part in the interface. """ + + typeCaption = 0 + typeGripper = 1 + typeDock = 2 + typeDockSizer = 3 + typePane = 4 + typePaneSizer = 5 + typeBackground = 6 + typePaneBorder = 7 + typePaneButton = 8 + + def __init__(self): + """ + Default class constructor. + Used internally, do not call it in your code! + """ + + self.orientation = wx.VERTICAL + self.type = 0 + self.rect = wx.Rect() + + +# ---------------------------------------------------------------------------- # + +class AuiPaneButton(object): + """ A simple class which describes the caption pane button attributes. """ + + def __init__(self, button_id): + """ + Default class constructor. + Used internally, do not call it in your code! + + :param `button_id`: the pane button identifier. + """ + + self.button_id = button_id + + +# ---------------------------------------------------------------------------- # + +# event declarations/classes + +class AuiManagerEvent(wx.PyCommandEvent): + """ A specialized command event class for events sent by L{AuiManager}. """ + + def __init__(self, eventType, id=1): + """ + Default class constructor. + + :param `eventType`: the event kind; + :param `id`: the event identification number. + """ + + wx.PyCommandEvent.__init__(self, eventType, id) + + self.manager = None + self.pane = None + self.button = 0 + self.veto_flag = False + self.canveto_flag = True + self.dc = None + + + def SetManager(self, mgr): + """ + Associates a L{AuiManager} to the current event. + + :param `mgr`: an instance of L{AuiManager}. + """ + + self.manager = mgr + + + def SetDC(self, pdc): + """ + Associates a `wx.DC` device context to this event. + + :param `pdc`: a `wx.DC` device context object. + """ + + self.dc = pdc + + + def SetPane(self, p): + """ + Associates a L{AuiPaneInfo} instance to this event. + + :param `p`: a L{AuiPaneInfo} instance. + """ + + self.pane = p + + + def SetButton(self, b): + """ + Associates a L{AuiPaneButton} instance to this event. + + :param `b`: a L{AuiPaneButton} instance. + """ + + self.button = b + + + def GetManager(self): + """ Returns the associated L{AuiManager} (if any). """ + + return self.manager + + + def GetDC(self): + """ Returns the associated `wx.DC` device context (if any). """ + + return self.dc + + + def GetPane(self): + """ Returns the associated L{AuiPaneInfo} structure (if any). """ + + return self.pane + + + def GetButton(self): + """ Returns the associated L{AuiPaneButton} instance (if any). """ + + return self.button + + + def Veto(self, veto=True): + """ + Prevents the change announced by this event from happening. + + It is in general a good idea to notify the user about the reasons for + vetoing the change because otherwise the applications behaviour (which + just refuses to do what the user wants) might be quite surprising. + + :param `veto`: ``True`` to veto the event, ``False`` otherwise. + """ + + self.veto_flag = veto + + + def GetVeto(self): + """ Returns whether the event has been vetoed or not. """ + + return self.veto_flag + + + def SetCanVeto(self, can_veto): + """ + Sets whether the event can be vetoed or not. + + :param `can_veto`: a bool flag. ``True`` if the event can be vetoed, ``False`` otherwise. + """ + + self.canveto_flag = can_veto + + + def CanVeto(self): + """ Returns whether the event can be vetoed and has been vetoed. """ + + return self.canveto_flag and self.veto_flag + + +# ---------------------------------------------------------------------------- # + +class AuiPaneInfo(object): + """ + AuiPaneInfo specifies all the parameters for a pane. These parameters specify where + the pane is on the screen, whether it is docked or floating, or hidden. In addition, + these parameters specify the pane's docked position, floating position, preferred + size, minimum size, caption text among many other parameters. + """ + + optionFloating = 2**0 + optionHidden = 2**1 + optionLeftDockable = 2**2 + optionRightDockable = 2**3 + optionTopDockable = 2**4 + optionBottomDockable = 2**5 + optionFloatable = 2**6 + optionMovable = 2**7 + optionResizable = 2**8 + optionPaneBorder = 2**9 + optionCaption = 2**10 + optionGripper = 2**11 + optionDestroyOnClose = 2**12 + optionToolbar = 2**13 + optionActive = 2**14 + optionGripperTop = 2**15 + optionMaximized = 2**16 + optionDockFixed = 2**17 + optionNotebookDockable = 2**18 + optionMinimized = 2**19 + optionLeftSnapped = 2**20 + optionRightSnapped = 2**21 + optionTopSnapped = 2**22 + optionBottomSnapped = 2**23 + optionFlyOut = 2**24 + optionCaptionLeft = 2**25 + + buttonClose = 2**26 + buttonMaximize = 2**27 + buttonMinimize = 2**28 + buttonPin = 2**29 + + buttonCustom1 = 2**30 + buttonCustom2 = 2**31 + buttonCustom3 = 2**32 + + savedHiddenState = 2**33 # used internally + actionPane = 2**34 # used internally + wasMaximized = 2**35 # used internally + needsRestore = 2**36 # used internally + + + def __init__(self): + """ Default class constructor. """ + + self.window = None + self.frame = None + self.state = 0 + self.dock_direction = AUI_DOCK_LEFT + self.dock_layer = 0 + self.dock_row = 0 + self.dock_pos = 0 + self.minimize_mode = AUI_MINIMIZE_POS_SMART + self.floating_pos = wx.Point(-1, -1) + self.floating_size = wx.Size(-1, -1) + self.best_size = wx.Size(-1, -1) + self.min_size = wx.Size(-1, -1) + self.max_size = wx.Size(-1, -1) + self.dock_proportion = 0 + self.caption = "" + self.buttons = [] + self.name = "" + self.icon = wx.NullIcon + self.rect = wx.Rect() + self.notebook_id = -1 + self.transparent = 255 + self.needsTransparency = False + self.previousDockPos = None + self.previousDockSize = 0 + self.snapped = 0 + + self.DefaultPane() + + + def dock_direction_get(self): + """ + Getter for the `dock_direction`. + + :see: L{dock_direction_set} for a set of valid docking directions. + """ + + if self.IsMaximized(): + return AUI_DOCK_CENTER + else: + return self._dock_direction + + + def dock_direction_set(self, value): + """ + Setter for the `dock_direction`. + + :param `value`: the docking direction. This cab ne one of the following bits: + + ============================ ======= ============================================= + Dock Flag Value Description + ============================ ======= ============================================= + ``AUI_DOCK_NONE`` 0 No docking direction. + ``AUI_DOCK_TOP`` 1 Top docking direction. + ``AUI_DOCK_RIGHT`` 2 Right docking direction. + ``AUI_DOCK_BOTTOM`` 3 Bottom docking direction. + ``AUI_DOCK_LEFT`` 4 Left docking direction. + ``AUI_DOCK_CENTER`` 5 Center docking direction. + ``AUI_DOCK_CENTRE`` 5 Centre docking direction. + ``AUI_DOCK_NOTEBOOK_PAGE`` 6 Automatic AuiNotebooks docking style. + ============================ ======= ============================================= + + """ + + self._dock_direction = value + + dock_direction = property(dock_direction_get, dock_direction_set) + + def IsOk(self): + """ + Returns ``True`` if the L{AuiPaneInfo} structure is valid. + + :note: A pane structure is valid if it has an associated window. + """ + + return self.window != None + + + def IsMaximized(self): + """ Returns ``True`` if the pane is maximized. """ + + return self.HasFlag(self.optionMaximized) + + + def IsMinimized(self): + """ Returns ``True`` if the pane is minimized. """ + + return self.HasFlag(self.optionMinimized) + + + def IsFixed(self): + """ Returns ``True`` if the pane cannot be resized. """ + + return not self.HasFlag(self.optionResizable) + + + def IsResizeable(self): + """ Returns ``True`` if the pane can be resized. """ + + return self.HasFlag(self.optionResizable) + + + def IsShown(self): + """ Returns ``True`` if the pane is currently shown. """ + + return not self.HasFlag(self.optionHidden) + + + def IsFloating(self): + """ Returns ``True`` if the pane is floating. """ + + return self.HasFlag(self.optionFloating) + + + def IsDocked(self): + """ Returns ``True`` if the pane is docked. """ + + return not self.HasFlag(self.optionFloating) + + + def IsToolbar(self): + """ Returns ``True`` if the pane contains a toolbar. """ + + return self.HasFlag(self.optionToolbar) + + + def IsTopDockable(self): + """ + Returns ``True`` if the pane can be docked at the top + of the managed frame. + """ + + return self.HasFlag(self.optionTopDockable) + + + def IsBottomDockable(self): + """ + Returns ``True`` if the pane can be docked at the bottom + of the managed frame. + """ + + return self.HasFlag(self.optionBottomDockable) + + + def IsLeftDockable(self): + """ + Returns ``True`` if the pane can be docked at the left + of the managed frame. + """ + + return self.HasFlag(self.optionLeftDockable) + + + def IsRightDockable(self): + """ + Returns ``True`` if the pane can be docked at the right + of the managed frame. + """ + + return self.HasFlag(self.optionRightDockable) + + + def IsDockable(self): + """ Returns ``True`` if the pane can be docked. """ + + return self.IsTopDockable() or self.IsBottomDockable() or self.IsLeftDockable() or \ + self.IsRightDockable() or self.IsNotebookDockable() + + + def IsFloatable(self): + """ + Returns ``True`` if the pane can be undocked and displayed as a + floating window. + """ + + return self.HasFlag(self.optionFloatable) + + + def IsMovable(self): + """ + Returns ``True`` if the docked frame can be undocked or moved to + another dock position. + """ + + return self.HasFlag(self.optionMovable) + + + def IsDestroyOnClose(self): + """ + Returns ``True`` if the pane should be destroyed when it is closed. + + Normally a pane is simply hidden when the close button is clicked. Calling L{DestroyOnClose} + with a ``True`` input parameter will cause the window to be destroyed when the user clicks + the pane's close button. + """ + + return self.HasFlag(self.optionDestroyOnClose) + + + def IsNotebookDockable(self): + """ + Returns ``True`` if a pane can be docked on top to another to create a + L{AuiNotebook}. + """ + + return self.HasFlag(self.optionNotebookDockable) + + + def IsTopSnappable(self): + """ Returns ``True`` if the pane can be snapped at the top of the managed frame. """ + + return self.HasFlag(self.optionTopSnapped) + + + def IsBottomSnappable(self): + """ Returns ``True`` if the pane can be snapped at the bottom of the managed frame. """ + + return self.HasFlag(self.optionBottomSnapped) + + + def IsLeftSnappable(self): + """ Returns ``True`` if the pane can be snapped on the left of the managed frame. """ + + return self.HasFlag(self.optionLeftSnapped) + + + def IsRightSnappable(self): + """ Returns ``True`` if the pane can be snapped on the right of the managed frame. """ + + return self.HasFlag(self.optionRightSnapped) + + + def IsSnappable(self): + """ Returns ``True`` if the pane can be snapped. """ + + return self.IsTopSnappable() or self.IsBottomSnappable() or self.IsLeftSnappable() or \ + self.IsRightSnappable() + + + def IsFlyOut(self): + """ Returns ``True`` if the floating pane has a "fly-out" effect. """ + + return self.HasFlag(self.optionFlyOut) + + + def HasCaption(self): + """ Returns ``True`` if the pane displays a caption. """ + + return self.HasFlag(self.optionCaption) + + + def HasCaptionLeft(self): + """ Returns ``True`` if the pane displays a caption on the left (rotated by 90 degrees). """ + + return self.HasFlag(self.optionCaptionLeft) + + + def HasGripper(self): + """ Returns ``True`` if the pane displays a gripper. """ + + return self.HasFlag(self.optionGripper) + + + def HasBorder(self): + """ Returns ``True`` if the pane displays a border. """ + + return self.HasFlag(self.optionPaneBorder) + + + def HasCloseButton(self): + """ Returns ``True`` if the pane displays a button to close the pane. """ + + return self.HasFlag(self.buttonClose) + + + def HasMaximizeButton(self): + """ Returns ``True`` if the pane displays a button to maximize the pane. """ + + return self.HasFlag(self.buttonMaximize) + + + def HasMinimizeButton(self): + """ Returns ``True`` if the pane displays a button to minimize the pane. """ + + return self.HasFlag(self.buttonMinimize) + + + def GetMinimizeMode(self): + """ + Returns the minimization style for this pane. + + Possible return values are: + + ============================== ========= ============================== + Minimize Mode Flag Hex Value Description + ============================== ========= ============================== + ``AUI_MINIMIZE_POS_SMART`` 0x01 Minimizes the pane on the closest tool bar + ``AUI_MINIMIZE_POS_TOP`` 0x02 Minimizes the pane on the top tool bar + ``AUI_MINIMIZE_POS_LEFT`` 0x03 Minimizes the pane on its left tool bar + ``AUI_MINIMIZE_POS_RIGHT`` 0x04 Minimizes the pane on its right tool bar + ``AUI_MINIMIZE_POS_BOTTOM`` 0x05 Minimizes the pane on its bottom tool bar + ``AUI_MINIMIZE_POS_MASK`` 0x07 Mask to filter the position flags + ``AUI_MINIMIZE_CAPT_HIDE`` 0x0 Hides the caption of the minimized pane + ``AUI_MINIMIZE_CAPT_SMART`` 0x08 Displays the caption in the best rotation (horizontal or clockwise) + ``AUI_MINIMIZE_CAPT_HORZ`` 0x10 Displays the caption horizontally + ``AUI_MINIMIZE_CAPT_MASK`` 0x18 Mask to filter the caption flags + ============================== ========= ============================== + + The flags can be filtered with the following masks: + + ============================== ========= ============================== + Minimize Mask Flag Hex Value Description + ============================== ========= ============================== + ``AUI_MINIMIZE_POS_MASK`` 0x07 Filters the position flags + ``AUI_MINIMIZE_CAPT_MASK`` 0x18 Filters the caption flags + ============================== ========= ============================== + + """ + + return self.minimize_mode + + + def HasPinButton(self): + """ Returns ``True`` if the pane displays a button to float the pane. """ + + return self.HasFlag(self.buttonPin) + + + def HasGripperTop(self): + """ Returns ``True`` if the pane displays a gripper at the top. """ + + return self.HasFlag(self.optionGripperTop) + + + def Window(self, w): + """ + Associate a `wx.Window` derived window to this pane. + + This normally does not need to be specified, as the window pointer is + automatically assigned to the L{AuiPaneInfo} structure as soon as it is + added to the manager. + + :param `w`: a `wx.Window` derived window. + """ + + self.window = w + return self + + + def Name(self, name): + """ + Sets the name of the pane so it can be referenced in lookup functions. + + If a name is not specified by the user, a random name is assigned to the pane + when it is added to the manager. + + :param `name`: a string specifying the pane name. + + :warning: If you are using L{AuiManager.SavePerspective} and L{AuiManager.LoadPerspective}, you will have + to specify a name for your pane using L{Name}, as randomly generated names can + not be properly restored. + """ + + self.name = name + return self + + + def Caption(self, caption): + """ + Sets the caption of the pane. + + :param `caption`: a string specifying the pane caption. + """ + + self.caption = caption + return self + + + def Left(self): + """ + Sets the pane dock position to the left side of the frame. + + :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_LEFT`` as + parameter. + """ + + self.dock_direction = AUI_DOCK_LEFT + return self + + + def Right(self): + """ + Sets the pane dock position to the right side of the frame. + + :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_RIGHT`` as + parameter. + """ + + self.dock_direction = AUI_DOCK_RIGHT + return self + + + def Top(self): + """ + Sets the pane dock position to the top of the frame. + + :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_TOP`` as + parameter. + """ + + self.dock_direction = AUI_DOCK_TOP + return self + + + def Bottom(self): + """ + Sets the pane dock position to the bottom of the frame. + + :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_BOTTOM`` as + parameter. + """ + + self.dock_direction = AUI_DOCK_BOTTOM + return self + + + def Center(self): + """ + Sets the pane to the center position of the frame. + + The centre pane is the space in the middle after all border panes (left, top, + right, bottom) are subtracted from the layout. + + :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_CENTER`` as + parameter. + """ + + self.dock_direction = AUI_DOCK_CENTER + return self + + + def Centre(self): + """ + Sets the pane to the center position of the frame. + + The centre pane is the space in the middle after all border panes (left, top, + right, bottom) are subtracted from the layout. + + :note: This is the same thing as calling L{Direction} with ``AUI_DOCK_CENTRE`` as + parameter. + """ + + self.dock_direction = AUI_DOCK_CENTRE + return self + + + def Direction(self, direction): + """ + Determines the direction of the docked pane. It is functionally the + same as calling L{Left}, L{Right}, L{Top} or L{Bottom}, except that docking direction + may be specified programmatically via the parameter `direction`. + + :param `direction`: the direction of the docked pane. + + :see: L{dock_direction_set} for a list of valid docking directions. + """ + + self.dock_direction = direction + return self + + + def Layer(self, layer): + """ + Determines the layer of the docked pane. + + The dock layer is similar to an onion, the inner-most layer being layer 0. Each + shell moving in the outward direction has a higher layer number. This allows for + more complex docking layout formation. + + :param `layer`: the layer of the docked pane. + """ + + self.dock_layer = layer + return self + + + def Row(self, row): + """ + Determines the row of the docked pane. + + :param `row`: the row of the docked pane. + """ + + self.dock_row = row + return self + + + def Position(self, pos): + """ + Determines the position of the docked pane. + + :param `pos`: the position of the docked pane. + """ + + self.dock_pos = pos + return self + + + def MinSize(self, arg1=None, arg2=None): + """ + Sets the minimum size of the pane. + + This method is split in 2 versions depending on the input type. If `arg1` is + a `wx.Size` object, then L{MinSize1} is called. Otherwise, L{MinSize2} is called. + + :param `arg1`: a `wx.Size` object, a (x, y) tuple or or a `x` coordinate. + :param `arg2`: a `y` coordinate (only if `arg1` is a `x` coordinate, otherwise unused). + """ + + if isinstance(arg1, wx.Size): + ret = self.MinSize1(arg1) + elif isinstance(arg1, types.TupleType): + ret = self.MinSize1(wx.Size(*arg1)) + else: + ret = self.MinSize2(arg1, arg2) + + return ret + + + def MinSize1(self, size): + """ + Sets the minimum size of the pane. + + :see: L{MinSize} for an explanation of input parameters. + """ + self.min_size = size + return self + + + def MinSize2(self, x, y): + """ + Sets the minimum size of the pane. + + :see: L{MinSize} for an explanation of input parameters. + """ + + self.min_size = wx.Size(x, y) + return self + + + def MaxSize(self, arg1=None, arg2=None): + """ + Sets the maximum size of the pane. + + This method is split in 2 versions depending on the input type. If `arg1` is + a `wx.Size` object, then L{MaxSize1} is called. Otherwise, L{MaxSize2} is called. + + :param `arg1`: a `wx.Size` object, a (x, y) tuple or a `x` coordinate. + :param `arg2`: a `y` coordinate (only if `arg1` is a `x` coordinate, otherwise unused). + """ + + if isinstance(arg1, wx.Size): + ret = self.MaxSize1(arg1) + elif isinstance(arg1, types.TupleType): + ret = self.MaxSize1(wx.Size(*arg1)) + else: + ret = self.MaxSize2(arg1, arg2) + + return ret + + + def MaxSize1(self, size): + """ + Sets the maximum size of the pane. + + :see: L{MaxSize} for an explanation of input parameters. + """ + + self.max_size = size + return self + + + def MaxSize2(self, x, y): + """ + Sets the maximum size of the pane. + + :see: L{MaxSize} for an explanation of input parameters. + """ + + self.max_size.Set(x,y) + return self + + + def BestSize(self, arg1=None, arg2=None): + """ + Sets the ideal size for the pane. The docking manager will attempt to use + this size as much as possible when docking or floating the pane. + + This method is split in 2 versions depending on the input type. If `arg1` is + a `wx.Size` object, then L{BestSize1} is called. Otherwise, L{BestSize2} is called. + + :param `arg1`: a `wx.Size` object, a (x, y) tuple or a `x` coordinate. + :param `arg2`: a `y` coordinate (only if `arg1` is a `x` coordinate, otherwise unused). + """ + + if isinstance(arg1, wx.Size): + ret = self.BestSize1(arg1) + elif isinstance(arg1, types.TupleType): + ret = self.BestSize1(wx.Size(*arg1)) + else: + ret = self.BestSize2(arg1, arg2) + + return ret + + + def BestSize1(self, size): + """ + Sets the best size of the pane. + + :see: L{BestSize} for an explanation of input parameters. + """ + + self.best_size = size + return self + + + def BestSize2(self, x, y): + """ + Sets the best size of the pane. + + :see: L{BestSize} for an explanation of input parameters. + """ + + self.best_size.Set(x,y) + return self + + + def FloatingPosition(self, pos): + """ + Sets the position of the floating pane. + + :param `pos`: a `wx.Point` or a tuple indicating the pane floating position. + """ + + self.floating_pos = wx.Point(*pos) + return self + + + def FloatingSize(self, size): + """ + Sets the size of the floating pane. + + :param `size`: a `wx.Size` or a tuple indicating the pane floating size. + """ + + self.floating_size = wx.Size(*size) + return self + + + def Maximize(self): + """ Makes the pane take up the full area.""" + + return self.SetFlag(self.optionMaximized, True) + + + def Minimize(self): + """ + Makes the pane minimized in a L{AuiToolBar}. + + Clicking on the minimize button causes a new L{AuiToolBar} to be created + and added to the frame manager, (currently the implementation is such that + panes at West will have a toolbar at the right, panes at South will have + toolbars at the bottom etc...) and the pane is hidden in the manager. + + Clicking on the restore button on the newly created toolbar will result in the + toolbar being removed and the original pane being restored. + """ + + return self.SetFlag(self.optionMinimized, True) + + + def MinimizeMode(self, mode): + """ + Sets the expected minimized mode if the MinimizeButton() is visible. + + The minimized pane can have a specific position in the work space: + + ============================== ========= ============================== + Minimize Mode Flag Hex Value Description + ============================== ========= ============================== + ``AUI_MINIMIZE_POS_SMART`` 0x01 Minimizes the pane on the closest tool bar + ``AUI_MINIMIZE_POS_TOP`` 0x02 Minimizes the pane on the top tool bar + ``AUI_MINIMIZE_POS_LEFT`` 0x03 Minimizes the pane on its left tool bar + ``AUI_MINIMIZE_POS_RIGHT`` 0x04 Minimizes the pane on its right tool bar + ``AUI_MINIMIZE_POS_BOTTOM`` 0x05 Minimizes the pane on its bottom tool bar + ============================== ========= ============================== + + The caption of the minimized pane can be displayed in different modes: + + ============================== ========= ============================== + Caption Mode Flag Hex Value Description + ============================== ========= ============================== + ``AUI_MINIMIZE_CAPT_HIDE`` 0x0 Hides the caption of the minimized pane + ``AUI_MINIMIZE_CAPT_SMART`` 0x08 Displays the caption in the best rotation (horizontal in the top and in the bottom tool bar or clockwise in the right and in the left tool bar) + ``AUI_MINIMIZE_CAPT_HORZ`` 0x10 Displays the caption horizontally + ============================== ========= ============================== + + """ + + self.minimize_mode = mode + return self + + + def Restore(self): + """ Is the reverse of L{Maximize} and L{Minimize}.""" + + return self.SetFlag(self.optionMaximized or self.optionMinimized, False) + + + def Fixed(self): + """ + Forces a pane to be fixed size so that it cannot be resized. + After calling L{Fixed}, L{IsFixed} will return ``True``. + """ + + return self.SetFlag(self.optionResizable, False) + + + def Resizable(self, resizable=True): + """ + Allows a pane to be resizable if `resizable` is ``True``, and forces + it to be a fixed size if `resizeable` is ``False``. + + If `resizable` is ``False``, this is simply an antonym for L{Fixed}. + + :param `resizable`: whether the pane will be resizeable or not. + """ + + return self.SetFlag(self.optionResizable, resizable) + + + def Transparent(self, alpha): + """ + Makes the pane transparent when floating. + + :param `alpha`: an integer value between 0 and 255 for pane transparency. + """ + + if alpha < 0 or alpha > 255: + raise Exception("Invalid transparency value (%s)"%repr(alpha)) + + self.transparent = alpha + self.needsTransparency = True + + + def Dock(self): + """ + Indicates that a pane should be docked. It is the opposite of L{Float}. + """ + + if self.IsNotebookPage(): + self.notebook_id = -1 + self.dock_direction = AUI_DOCK_NONE + + return self.SetFlag(self.optionFloating, False) + + + def Float(self): + """ + Indicates that a pane should be floated. It is the opposite of L{Dock}. + """ + + if self.IsNotebookPage(): + self.notebook_id = -1 + self.dock_direction = AUI_DOCK_NONE + + return self.SetFlag(self.optionFloating, True) + + + def Hide(self): + """ + Indicates that a pane should be hidden. + + Calling L{Show} (``False``) achieve the same effect. + """ + + return self.SetFlag(self.optionHidden, True) + + + def Show(self, show=True): + """ + Indicates that a pane should be shown. + + :param `show`: whether the pane should be shown or not. + """ + + return self.SetFlag(self.optionHidden, not show) + + + # By defaulting to 1000, the tab will get placed at the end + def NotebookPage(self, id, tab_position=1000): + """ + Forces a pane to be a notebook page, so that the pane can be + docked on top to another to create a L{AuiNotebook}. + + :param `id`: the notebook id; + :param `tab_position`: the tab number of the pane once docked in a notebook. + """ + + # Remove any floating frame + self.Dock() + self.notebook_id = id + self.dock_pos = tab_position + self.dock_row = 0 + self.dock_layer = 0 + self.dock_direction = AUI_DOCK_NOTEBOOK_PAGE + + return self + + + def NotebookControl(self, id): + """ + Forces a pane to be a notebook control (L{AuiNotebook}). + + :param `id`: the notebook id. + """ + + self.notebook_id = id + self.window = None + self.buttons = [] + + if self.dock_direction == AUI_DOCK_NOTEBOOK_PAGE: + self.dock_direction = AUI_DOCK_NONE + + return self + + + def HasNotebook(self): + """ Returns whether a pane has a L{AuiNotebook} or not. """ + + return self.notebook_id >= 0 + + + def IsNotebookPage(self): + """ Returns whether the pane is a notebook page in a L{AuiNotebook}. """ + + return self.notebook_id >= 0 and self.dock_direction == AUI_DOCK_NOTEBOOK_PAGE + + + def IsNotebookControl(self): + """ Returns whether the pane is a notebook control (L{AuiNotebook}). """ + + return not self.IsNotebookPage() and self.HasNotebook() + + + def SetNameFromNotebookId(self): + """ Sets the pane name once docked in a L{AuiNotebook} using the notebook id. """ + + if self.notebook_id >= 0: + self.name = "__notebook_%d"%self.notebook_id + + return self + + + def CaptionVisible(self, visible=True, left=False): + """ + Indicates that a pane caption should be visible. If `visible` is ``False``, no pane + caption is drawn. + + :param `visible`: whether the caption should be visible or not; + :param `left`: whether the caption should be drawn on the left (rotated by 90 degrees) or not. + """ + + if left: + self.SetFlag(self.optionCaption, False) + return self.SetFlag(self.optionCaptionLeft, visible) + + self.SetFlag(self.optionCaptionLeft, False) + return self.SetFlag(self.optionCaption, visible) + + + def PaneBorder(self, visible=True): + """ + Indicates that a border should be drawn for the pane. + + :param `visible`: whether the pane border should be visible or not. + """ + + return self.SetFlag(self.optionPaneBorder, visible) + + + def Gripper(self, visible=True): + """ + Indicates that a gripper should be drawn for the pane. + + :param `visible`: whether the gripper should be visible or not. + """ + + return self.SetFlag(self.optionGripper, visible) + + + def GripperTop(self, attop=True): + """ + Indicates that a gripper should be drawn at the top of the pane. + + :param `attop`: whether the gripper should be drawn at the top or not. + """ + + return self.SetFlag(self.optionGripperTop, attop) + + + def CloseButton(self, visible=True): + """ + Indicates that a close button should be drawn for the pane. + + :param `visible`: whether the close button should be visible or not. + """ + + return self.SetFlag(self.buttonClose, visible) + + + def MaximizeButton(self, visible=True): + """ + Indicates that a maximize button should be drawn for the pane. + + :param `visible`: whether the maximize button should be visible or not. + """ + + return self.SetFlag(self.buttonMaximize, visible) + + + def MinimizeButton(self, visible=True): + """ + Indicates that a minimize button should be drawn for the pane. + + :param `visible`: whether the minimize button should be visible or not. + """ + + return self.SetFlag(self.buttonMinimize, visible) + + + def PinButton(self, visible=True): + """ + Indicates that a pin button should be drawn for the pane. + + :param `visible`: whether the pin button should be visible or not. + """ + + return self.SetFlag(self.buttonPin, visible) + + + def DestroyOnClose(self, b=True): + """ + Indicates whether a pane should be destroyed when it is closed. + + Normally a pane is simply hidden when the close button is clicked. Setting + `b` to ``True`` will cause the window to be destroyed when the user clicks + the pane's close button. + + :param `b`: whether the pane should be destroyed when it is closed or not. + """ + + return self.SetFlag(self.optionDestroyOnClose, b) + + + def TopDockable(self, b=True): + """ + Indicates whether a pane can be docked at the top of the frame. + + :param `b`: whether the pane can be docked at the top or not. + """ + + return self.SetFlag(self.optionTopDockable, b) + + + def BottomDockable(self, b=True): + """ + Indicates whether a pane can be docked at the bottom of the frame. + + :param `b`: whether the pane can be docked at the bottom or not. + """ + + return self.SetFlag(self.optionBottomDockable, b) + + + def LeftDockable(self, b=True): + """ + Indicates whether a pane can be docked on the left of the frame. + + :param `b`: whether the pane can be docked at the left or not. + """ + + return self.SetFlag(self.optionLeftDockable, b) + + + def RightDockable(self, b=True): + """ + Indicates whether a pane can be docked on the right of the frame. + + :param `b`: whether the pane can be docked at the right or not. + """ + + return self.SetFlag(self.optionRightDockable, b) + + + def Floatable(self, b=True): + """ + Sets whether the user will be able to undock a pane and turn it + into a floating window. + + :param `b`: whether the pane can be floated or not. + """ + + return self.SetFlag(self.optionFloatable, b) + + + def Movable(self, b=True): + """ + Indicates whether a pane can be moved. + + :param `b`: whether the pane can be moved or not. + """ + + return self.SetFlag(self.optionMovable, b) + + + def NotebookDockable(self, b=True): + """ + Indicates whether a pane can be docked in an automatic L{AuiNotebook}. + + :param `b`: whether the pane can be docked in a notebook or not. + """ + + return self.SetFlag(self.optionNotebookDockable, b) + + + def DockFixed(self, b=True): + """ + Causes the containing dock to have no resize sash. This is useful + for creating panes that span the entire width or height of a dock, but should + not be resizable in the other direction. + + :param `b`: whether the pane will have a resize sash or not. + """ + + return self.SetFlag(self.optionDockFixed, b) + + + def Dockable(self, b=True): + """ + Specifies whether a frame can be docked or not. It is the same as specifying + L{TopDockable} . L{BottomDockable} . L{LeftDockable} . L{RightDockable} . + + :param `b`: whether the frame can be docked or not. + """ + + return self.TopDockable(b).BottomDockable(b).LeftDockable(b).RightDockable(b) + + + def TopSnappable(self, b=True): + """ + Indicates whether a pane can be snapped at the top of the main frame. + + :param `b`: whether the pane can be snapped at the top of the main frame or not. + """ + + return self.SetFlag(self.optionTopSnapped, b) + + + def BottomSnappable(self, b=True): + """ + Indicates whether a pane can be snapped at the bottom of the main frame. + + :param `b`: whether the pane can be snapped at the bottom of the main frame or not. + """ + + return self.SetFlag(self.optionBottomSnapped, b) + + + def LeftSnappable(self, b=True): + """ + Indicates whether a pane can be snapped on the left of the main frame. + + :param `b`: whether the pane can be snapped at the left of the main frame or not. + """ + + return self.SetFlag(self.optionLeftSnapped, b) + + + def RightSnappable(self, b=True): + """ + Indicates whether a pane can be snapped on the right of the main frame. + + :param `b`: whether the pane can be snapped at the right of the main frame or not. + """ + + return self.SetFlag(self.optionRightSnapped, b) + + + def Snappable(self, b=True): + """ + Indicates whether a pane can be snapped on the main frame. This is + equivalent as calling L{TopSnappable} . L{BottomSnappable} . L{LeftSnappable} . L{RightSnappable} . + + :param `b`: whether the pane can be snapped on the main frame or not. + """ + + return self.TopSnappable(b).BottomSnappable(b).LeftSnappable(b).RightSnappable(b) + + + def FlyOut(self, b=True): + """ + Indicates whether a pane, when floating, has a "fly-out" effect + (i.e., floating panes which only show themselves when moused over). + + :param `b`: whether the pane can be snapped on the main frame or not. + """ + + return self.SetFlag(self.optionFlyOut, b) + + + # Copy over the members that pertain to docking position + def SetDockPos(self, source): + """ + Copies the `source` pane members that pertain to docking position to `self`. + + :param `source`: the source pane from where to copy the attributes. + """ + + self.dock_direction = source.dock_direction + self.dock_layer = source.dock_layer + self.dock_row = source.dock_row + self.dock_pos = source.dock_pos + self.dock_proportion = source.dock_proportion + self.floating_pos = wx.Point(*source.floating_pos) + self.floating_size = wx.Size(*source.floating_size) + self.rect = wx.Rect(*source.rect) + + return self + + + def DefaultPane(self): + """ Specifies that the pane should adopt the default pane settings. """ + + state = self.state + state |= self.optionTopDockable | self.optionBottomDockable | \ + self.optionLeftDockable | self.optionRightDockable | \ + self.optionNotebookDockable | \ + self.optionFloatable | self.optionMovable | self.optionResizable | \ + self.optionCaption | self.optionPaneBorder | self.buttonClose + + self.state = state + + return self + + + def CentrePane(self): + """ + Specifies that the pane should adopt the default center pane settings. + + Centre panes usually do not have caption bars. This function provides an easy way of + preparing a pane to be displayed in the center dock position. + """ + + return self.CenterPane() + + + def CenterPane(self): + """ + Specifies that the pane should adopt the default center pane settings. + + Centre panes usually do not have caption bars. This function provides an easy way of + preparing a pane to be displayed in the center dock position. + """ + + self.state = 0 + return self.Center().PaneBorder().Resizable() + + + def ToolbarPane(self): + """ Specifies that the pane should adopt the default toolbar pane settings. """ + + self.DefaultPane() + state = self.state + + state |= (self.optionToolbar | self.optionGripper) + state &= ~(self.optionResizable | self.optionCaption | self.optionCaptionLeft) + + if self.dock_layer == 0: + self.dock_layer = 10 + + self.state = state + + return self + + + def Icon(self, icon): + """ + Specifies whether an icon is drawn on the left of the caption text when + the pane is docked. If `icon` is ``None`` or `wx.NullIcon`, no icon is drawn on + the caption space. + + :param icon: an icon to draw on the caption space, or ``None``. + """ + + if icon is None: + icon = wx.NullIcon + + self.icon = icon + return self + + + def SetFlag(self, flag, option_state): + """ + Turns the property given by `flag` on or off with the `option_state` + parameter. + + :param `flag`: the property to set; + :param `option_state`: either ``True`` or ``False``. + """ + + state = self.state + + if option_state: + state |= flag + else: + state &= ~flag + + self.state = state + + if flag in [self.buttonClose, self.buttonMaximize, self.buttonMinimize, self.buttonPin]: + self.ResetButtons() + + return self + + + def HasFlag(self, flag): + """ + Returns ``True`` if the the property specified by flag is active for the pane. + + :param `flag`: the property to check for activity. + """ + + return (self.state & flag and [True] or [False])[0] + + + def ResetButtons(self): + """ + Resets all the buttons and recreates them from scratch depending on the + L{AuiPaneInfo} flags. + """ + + floating = self.HasFlag(self.optionFloating) + self.buttons = [] + + if not floating and self.HasMinimizeButton(): + button = AuiPaneButton(AUI_BUTTON_MINIMIZE) + self.buttons.append(button) + + if not floating and self.HasMaximizeButton(): + button = AuiPaneButton(AUI_BUTTON_MAXIMIZE_RESTORE) + self.buttons.append(button) + + if not floating and self.HasPinButton(): + button = AuiPaneButton(AUI_BUTTON_PIN) + self.buttons.append(button) + + if self.HasCloseButton(): + button = AuiPaneButton(AUI_BUTTON_CLOSE) + self.buttons.append(button) + + + def CountButtons(self): + """ Returns the number of visible buttons in the docked pane. """ + + n = 0 + + if self.HasCaption() or self.HasCaptionLeft(): + if isinstance(wx.GetTopLevelParent(self.window), AuiFloatingFrame): + return 1 + + if self.HasCloseButton(): + n += 1 + if self.HasMaximizeButton(): + n += 1 + if self.HasMinimizeButton(): + n += 1 + if self.HasPinButton(): + n += 1 + + return n + + + def IsHorizontal(self): + """ Returns ``True`` if the pane `dock_direction` is horizontal. """ + + return self.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM] + + def IsVertical(self): + """ Returns ``True`` if the pane `dock_direction` is vertical. """ + + return self.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT] + + +# Null AuiPaneInfo reference +NonePaneInfo = AuiPaneInfo() + + +# ---------------------------------------------------------------------------- # + +class AuiDockingGuide(wx.Frame): + """ Base class for L{AuiCenterDockingGuide} and L{AuiSingleDockingGuide}.""" + + def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, + size=wx.DefaultSize, style=wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | + wx.FRAME_NO_TASKBAR | wx.NO_BORDER, name="AuiDockingGuide"): + """ + Default class constructor. Used internally, do not call it in your code! + + :param `parent`: the L{AuiDockingGuide} parent; + :param `id`: the window identifier. It may take a value of -1 to indicate a default value. + :param `title`: the caption to be displayed on the frame's title bar. + :param `pos`: the window position. A value of (-1, -1) indicates a default position, + chosen by either the windowing system or wxPython, depending on platform. + :param `size`: the window size. A value of (-1, -1) indicates a default size, chosen by + either the windowing system or wxPython, depending on platform. + :param `style`: the window style. + :param `name`: the name of the window. This parameter is used to associate a name with the + item, allowing the application user to set Motif resource values for individual windows. + """ + + wx.Frame.__init__(self, parent, id, title, pos, size, style, name=name) + + + def HitTest(self, x, y): + """ + To be overridden by parent classes. + + :param `x`: the `x` mouse position; + :param `y`: the `y` mouse position. + """ + + return 0 + + + def ValidateNotebookDocking(self, valid): + """ + To be overridden by parent classes. + + :param `valid`: whether a pane can be docked on top to another to form an automatic + L{AuiNotebook}. + """ + + return 0 + +# ============================================================================ +# implementation +# ============================================================================ + +# --------------------------------------------------------------------------- +# AuiDockingGuideWindow +# --------------------------------------------------------------------------- + +class AuiDockingGuideWindow(wx.Window): + """ Target class for L{AuiSingleDockingGuide} and L{AuiCenterDockingGuide}. """ + + def __init__(self, parent, rect, direction=0, center=False, useAero=False): + """ + Default class constructor. Used internally, do not call it in your code! + + :param `parent`: the L{AuiDockingGuideWindow} parent; + :param `rect`: the window rect; + :param `direction`: one of ``wx.TOP``, ``wx.BOTTOM``, ``wx.LEFT``, ``wx.RIGHT``, + ``wx.CENTER``; + :param `center`: whether the calling class is a L{AuiCenterDockingGuide}; + :param `useAero`: whether to use the new Aero-style bitmaps or Whidbey-style bitmaps + for the docking guide. + """ + + wx.Window.__init__(self, parent, -1, rect.GetPosition(), rect.GetSize(), wx.NO_BORDER) + + self._direction = direction + self._center = center + self._valid = True + self._useAero = useAero + + self._bmp_unfocus, self._bmp_focus = GetDockingImage(direction, useAero, center) + + self._currentImage = self._bmp_unfocus + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_PAINT, self.OnPaint) + + + def SetValid(self, valid): + """ + Sets the docking direction as valid or invalid. + + :param `valid`: whether the docking direction is allowed or not. + """ + + self._valid = valid + + + def IsValid(self): + """ Returns whether the docking direction is valid. """ + + return self._valid + + + def OnEraseBackground(self, event): + """ + Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiDockingGuideWindow}. + + :param `event`: a `wx.EraseEvent` to be processed. + + :note: This is intentionally empty to reduce flickering while drawing. + """ + + pass + + + def DrawBackground(self, dc): + """ + Draws the docking guide background. + + :param `dc`: a `wx.DC` device context object. + """ + + rect = self.GetClientRect() + + dc.SetPen(wx.TRANSPARENT_PEN) + dc.SetBrush(wx.Brush(colourTargetBackground)) + dc.DrawRectangleRect(rect) + + dc.SetPen(wx.Pen(colourTargetBorder)) + + left = rect.GetLeft() + top = rect.GetTop() + right = rect.GetRight() + bottom = rect.GetBottom() + + if self._direction != wx.CENTER: + + if not self._center or self._direction != wx.BOTTOM: + dc.DrawLine(left, top, right+1, top) + if not self._center or self._direction != wx.RIGHT: + dc.DrawLine(left, top, left, bottom+1) + if not self._center or self._direction != wx.LEFT: + dc.DrawLine(right, top, right, bottom+1) + if not self._center or self._direction != wx.TOP: + dc.DrawLine(left, bottom, right+1, bottom) + + dc.SetPen(wx.Pen(colourTargetShade)) + + if self._direction != wx.RIGHT: + dc.DrawLine(left + 1, top + 1, left + 1, bottom) + if self._direction != wx.BOTTOM: + dc.DrawLine(left + 1, top + 1, right, top + 1) + + + def DrawDottedLine(self, dc, point, length, vertical): + """ + Draws a dotted line (not used if the docking guide images are ok). + + :param `dc`: a `wx.DC` device context object; + :param `point`: a `wx.Point` where to start drawing the dotted line; + :param `length`: the length of the dotted line; + :param `vertical`: whether it is a vertical docking guide window or not. + """ + + for i in xrange(0, length, 2): + dc.DrawPoint(point.x, point.y) + if vertical: + point.y += 2 + else: + point.x += 2 + + + def DrawIcon(self, dc): + """ + Draws the docking guide icon (not used if the docking guide images are ok). + + :param `dc`: a `wx.DC` device context object. + """ + + rect = wx.Rect(*self.GetClientRect()) + point = wx.Point() + length = 0 + + rect.Deflate(4, 4) + dc.SetPen(wx.Pen(colourIconBorder)) + dc.SetBrush(wx.Brush(colourIconBackground)) + dc.DrawRectangleRect(rect) + + right1 = rect.GetRight() + 1 + bottom1 = rect.GetBottom() + 1 + + dc.SetPen(wx.Pen(colourIconShadow)) + dc.DrawLine(rect.x + 1, bottom1, right1 + 1, bottom1) + dc.DrawLine(right1, rect.y + 1, right1, bottom1 + 1) + + rect.Deflate(1, 1) + + if self._direction == wx.TOP: + rect.height -= rect.height / 2 + point = rect.GetBottomLeft() + length = rect.width + + elif self._direction == wx.LEFT: + rect.width -= rect.width / 2 + point = rect.GetTopRight() + length = rect.height + + elif self._direction == wx.RIGHT: + rect.x += rect.width / 2 + rect.width -= rect.width / 2 + point = rect.GetTopLeft() + length = rect.height + + elif self._direction == wx.BOTTOM: + rect.y += rect.height / 2 + rect.height -= rect.height / 2 + point = rect.GetTopLeft() + length = rect.width + + elif self._direction == wx.CENTER: + rect.Deflate(1, 1) + point = rect.GetTopLeft() + length = rect.width + + dc.GradientFillLinear(rect, colourIconDockingPart1, + colourIconDockingPart2, self._direction) + + dc.SetPen(wx.Pen(colourIconBorder)) + + if self._direction == wx.CENTER: + self.DrawDottedLine(dc, rect.GetTopLeft(), rect.width, False) + self.DrawDottedLine(dc, rect.GetTopLeft(), rect.height, True) + self.DrawDottedLine(dc, rect.GetBottomLeft(), rect.width, False) + self.DrawDottedLine(dc, rect.GetTopRight(), rect.height, True) + + elif self._direction in [wx.TOP, wx.BOTTOM]: + self.DrawDottedLine(dc, point, length, False) + + else: + self.DrawDottedLine(dc, point, length, True) + + + def DrawArrow(self, dc): + """ + Draws the docking guide arrow icon (not used if the docking guide images are ok). + + :param `dc`: a `wx.DC` device context object. + """ + + rect = self.GetClientRect() + point = wx.Point() + + point.x = (rect.GetLeft() + rect.GetRight()) / 2 + point.y = (rect.GetTop() + rect.GetBottom()) / 2 + rx, ry = wx.Size(), wx.Size() + + if self._direction == wx.TOP: + rx = wx.Size(1, 0) + ry = wx.Size(0, 1) + + elif self._direction == wx.LEFT: + rx = wx.Size(0, -1) + ry = wx.Size(1, 0) + + elif self._direction == wx.RIGHT: + rx = wx.Size(0, 1) + ry = wx.Size(-1, 0) + + elif self._direction == wx.BOTTOM: + rx = wx.Size(-1, 0) + ry = wx.Size(0, -1) + + point.x += ry.x*3 + point.y += ry.y*3 + + dc.SetPen(wx.Pen(colourIconArrow)) + + for i in xrange(4): + pt1 = wx.Point(point.x - rx.x*i, point.y - rx.y*i) + pt2 = wx.Point(point.x + rx.x*(i+1), point.y + rx.y*(i+1)) + dc.DrawLinePoint(pt1, pt2) + point.x += ry.x + point.y += ry.y + + + def OnPaint(self, event): + """ + Handles the ``wx.EVT_PAINT`` event for L{AuiDockingGuideWindow}. + + :param `event`: a `wx.PaintEvent` to be processed. + """ + + dc = wx.AutoBufferedPaintDC(self) + if self._currentImage.IsOk() and self._valid: + dc.DrawBitmap(self._currentImage, 0, 0, True) + else: + self.Draw(dc) + + + def Draw(self, dc): + """ + Draws the whole docking guide window (not used if the docking guide images are ok). + + :param `dc`: a `wx.DC` device context object. + """ + + self.DrawBackground(dc) + + if self._valid: + self.DrawIcon(dc) + self.DrawArrow(dc) + + + def UpdateDockGuide(self, pos): + """ + Updates the docking guide images depending on the mouse position, using focused + images if the mouse is inside the docking guide or unfocused images if it is + outside. + + :param `pos`: a `wx.Point` mouse position. + """ + + inside = self.GetScreenRect().Contains(pos) + + if inside: + image = self._bmp_focus + else: + image = self._bmp_unfocus + + if image != self._currentImage: + self._currentImage = image + self.Refresh() + self.Update() + + +# --------------------------------------------------------------------------- +# AuiSingleDockingGuide +# --------------------------------------------------------------------------- + +class AuiSingleDockingGuide(AuiDockingGuide): + """ A docking guide window for single docking hint (not diamond-shaped HUD). """ + + def __init__(self, parent, direction=0): + """ + Default class constructor. Used internally, do not call it in your code! + + :param `parent`: the L{AuiSingleDockingGuide} parent; + :param `direction`: one of ``wx.TOP``, ``wx.BOTTOM``, ``wx.LEFT``, ``wx.RIGHT``. + """ + + self._direction = direction + + style = wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | \ + wx.FRAME_NO_TASKBAR | wx.NO_BORDER + + # Use of FRAME_SHAPED on wxMac causes the frame to be visible + # breaking the docking hints. + if wx.Platform != '__WXMAC__': + style |= wx.FRAME_SHAPED + + AuiDockingGuide.__init__(self, parent, style=style, name="auiSingleDockTarget") + + self.Hide() + + useAero = GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_AERO_DOCKING_GUIDES + useWhidbey = GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_WHIDBEY_DOCKING_GUIDES + + self._useAero = useAero or useWhidbey + self._valid = True + + if useAero: + sizeX, sizeY = aeroguideSizeX, aeroguideSizeY + elif useWhidbey: + sizeX, sizeY = whidbeySizeX, whidbeySizeY + else: + sizeX, sizeY = guideSizeX, guideSizeY + + if direction not in [wx.TOP, wx.BOTTOM]: + sizeX, sizeY = sizeY, sizeX + + if self._useAero: + self.CreateShapesWithStyle(useWhidbey) + + if wx.Platform == "__WXGTK__": + self.Bind(wx.EVT_WINDOW_CREATE, self.SetGuideShape) + else: + self.SetGuideShape() + + self.SetSize(self.region.GetBox().GetSize()) + else: + self.SetSize((sizeX, sizeY)) + + self.rect = wx.Rect(0, 0, sizeX, sizeY) + + if self._useAero: + useAero = (useWhidbey and [2] or [1])[0] + else: + useAero = 0 + + self.target = AuiDockingGuideWindow(self, self.rect, direction, False, useAero) + + + def CreateShapesWithStyle(self, useWhidbey): + """ + Creates the docking guide window shape based on which docking bitmaps are used. + + :param `useWhidbey`: if ``True``, use Whidbey-style bitmaps; if ``False``, use the + Aero-style bitmaps. + """ + + sizeX, sizeY = aeroguideSizeX, aeroguideSizeY + if useWhidbey: + sizeX, sizeY = whidbeySizeX, whidbeySizeY + + if self._direction not in [wx.TOP, wx.BOTTOM]: + sizeX, sizeY = sizeY, sizeX + + useAero = (useWhidbey and [2] or [1])[0] + bmp, dummy = GetDockingImage(self._direction, useAero, False) + region = wx.RegionFromBitmap(bmp) + + self.region = region + + + def AeroMove(self, pos): + """ + Moves the docking window to the new position. Overridden in children classes. + + :param `pos`: the new docking guide position. + """ + + pass + + + def SetGuideShape(self, event=None): + """ + Sets the correct shape for the docking guide window. + + :param `event`: on wxGTK, a `wx.WindowCreateEvent` event to process. + """ + + self.SetShape(self.region) + + if event is not None: + # Skip the event on wxGTK + event.Skip() + wx.CallAfter(wx.SafeYield, self, True) + + + def SetShape(self, region): + """ + If the platform supports it, sets the shape of the window to that depicted by `region`. + The system will not display or respond to any mouse event for the pixels that lie + outside of the region. To reset the window to the normal rectangular shape simply call + L{SetShape} again with an empty region. + + :param `region`: the shape of the frame. + + :note: Overridden for wxMac. + """ + + if wx.Platform == '__WXMAC__': + # HACK so we don't crash when SetShape is called + return + else: + super(AuiSingleDockingGuide, self).SetShape(region) + + + def SetValid(self, valid): + """ + Sets the docking direction as valid or invalid. + + :param `valid`: whether the docking direction is allowed or not. + """ + + self._valid = valid + + + def IsValid(self): + """ Returns whether the docking direction is valid. """ + + return self._valid + + + def UpdateDockGuide(self, pos): + """ + Updates the docking guide images depending on the mouse position, using focused + images if the mouse is inside the docking guide or unfocused images if it is + outside. + + :param `pos`: a `wx.Point` mouse position. + """ + + self.target.UpdateDockGuide(pos) + + + def HitTest(self, x, y): + """ + Checks if the mouse position is inside the target window rect. + + :param `x`: the `x` mouse position; + :param `y`: the `y` mouse position. + """ + + if self.target.GetScreenRect().Contains((x, y)): + return wx.ALL + + return -1 + + +# --------------------------------------------------------------------------- +# AuiCenterDockingGuide +# --------------------------------------------------------------------------- + +class AuiCenterDockingGuide(AuiDockingGuide): + """ A docking guide window for multiple docking hint (diamond-shaped HUD). """ + + def __init__(self, parent): + """ + Default class constructor. + Used internally, do not call it in your code! + + :param `parent`: the L{AuiCenterDockingGuide} parent. + """ + + AuiDockingGuide.__init__(self, parent, style=wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | + wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.FRAME_SHAPED, + name="auiCenterDockTarget") + + self.Hide() + + self.CreateShapesWithStyle() + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + + if wx.Platform == "__WXGTK__": + self.Bind(wx.EVT_WINDOW_CREATE, self.SetGuideShape) + else: + self.SetGuideShape() + + self.SetSize(self.region.GetBox().GetSize()) + + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_PAINT, self.OnPaint) + + + def CreateShapesWithStyle(self): + """ Creates the docking guide window shape based on which docking bitmaps are used. """ + + useAero = (GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_AERO_DOCKING_GUIDES) != 0 + useWhidbey = (GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_WHIDBEY_DOCKING_GUIDES) != 0 + + self._useAero = 0 + if useAero: + self._useAero = 1 + elif useWhidbey: + self._useAero = 2 + + if useAero: + sizeX, sizeY = aeroguideSizeX, aeroguideSizeY + elif useWhidbey: + sizeX, sizeY = whidbeySizeX, whidbeySizeY + else: + sizeX, sizeY = guideSizeX, guideSizeY + + rectLeft = wx.Rect(0, sizeY, sizeY, sizeX) + rectTop = wx.Rect(sizeY, 0, sizeX, sizeY) + rectRight = wx.Rect(sizeY+sizeX, sizeY, sizeY, sizeX) + rectBottom = wx.Rect(sizeY, sizeX + sizeY, sizeX, sizeY) + rectCenter = wx.Rect(sizeY, sizeY, sizeX, sizeX) + + if not self._useAero: + + self.targetLeft = AuiDockingGuideWindow(self, rectLeft, wx.LEFT, True, useAero) + self.targetTop = AuiDockingGuideWindow(self, rectTop, wx.TOP, True, useAero) + self.targetRight = AuiDockingGuideWindow(self, rectRight, wx.RIGHT, True, useAero) + self.targetBottom = AuiDockingGuideWindow(self, rectBottom, wx.BOTTOM, True, useAero) + self.targetCenter = AuiDockingGuideWindow(self, rectCenter, wx.CENTER, True, useAero) + + + # top-left diamond + tld = [wx.Point(rectTop.x, rectTop.y+rectTop.height-8), + wx.Point(rectLeft.x+rectLeft.width-8, rectLeft.y), + rectTop.GetBottomLeft()] + # bottom-left diamond + bld = [wx.Point(rectLeft.x+rectLeft.width-8, rectLeft.y+rectLeft.height), + wx.Point(rectBottom.x, rectBottom.y+8), + rectBottom.GetTopLeft()] + # top-right diamond + trd = [wx.Point(rectTop.x+rectTop.width, rectTop.y+rectTop.height-8), + wx.Point(rectRight.x+8, rectRight.y), + rectRight.GetTopLeft()] + # bottom-right diamond + brd = [wx.Point(rectRight.x+8, rectRight.y+rectRight.height), + wx.Point(rectBottom.x+rectBottom.width, rectBottom.y+8), + rectBottom.GetTopRight()] + + self._triangles = [tld[0:2], bld[0:2], + [wx.Point(rectTop.x+rectTop.width-1, rectTop.y+rectTop.height-8), + wx.Point(rectRight.x+7, rectRight.y)], + [wx.Point(rectRight.x+7, rectRight.y+rectRight.height), + wx.Point(rectBottom.x+rectBottom.width-1, rectBottom.y+8)]] + + region = wx.Region() + region.UnionRect(rectLeft) + region.UnionRect(rectTop) + region.UnionRect(rectRight) + region.UnionRect(rectBottom) + region.UnionRect(rectCenter) + region.UnionRegion(wx.RegionFromPoints(tld)) + region.UnionRegion(wx.RegionFromPoints(bld)) + region.UnionRegion(wx.RegionFromPoints(trd)) + region.UnionRegion(wx.RegionFromPoints(brd)) + + elif useAero: + + self._aeroBmp = aero_dock_pane.GetBitmap() + region = wx.RegionFromBitmap(self._aeroBmp) + + self._allAeroBmps = [aero_dock_pane_left.GetBitmap(), aero_dock_pane_top.GetBitmap(), + aero_dock_pane_right.GetBitmap(), aero_dock_pane_bottom.GetBitmap(), + aero_dock_pane_center.GetBitmap(), aero_dock_pane.GetBitmap()] + self._deniedBitmap = aero_denied.GetBitmap() + self._aeroRects = [rectLeft, rectTop, rectRight, rectBottom, rectCenter] + self._valid = True + + elif useWhidbey: + + self._aeroBmp = whidbey_dock_pane.GetBitmap() + region = wx.RegionFromBitmap(self._aeroBmp) + + self._allAeroBmps = [whidbey_dock_pane_left.GetBitmap(), whidbey_dock_pane_top.GetBitmap(), + whidbey_dock_pane_right.GetBitmap(), whidbey_dock_pane_bottom.GetBitmap(), + whidbey_dock_pane_center.GetBitmap(), whidbey_dock_pane.GetBitmap()] + self._deniedBitmap = whidbey_denied.GetBitmap() + self._aeroRects = [rectLeft, rectTop, rectRight, rectBottom, rectCenter] + self._valid = True + + + self.region = region + + + def SetGuideShape(self, event=None): + """ + Sets the correct shape for the docking guide window. + + :param `event`: on wxGTK, a `wx.WindowCreateEvent` event to process. + """ + + self.SetShape(self.region) + + if event is not None: + # Skip the event on wxGTK + event.Skip() + wx.CallAfter(wx.SafeYield, self, True) + + + def UpdateDockGuide(self, pos): + """ + Updates the docking guides images depending on the mouse position, using focused + images if the mouse is inside the docking guide or unfocused images if it is + outside. + + :param `pos`: a `wx.Point` mouse position. + """ + + if not self._useAero: + for target in self.GetChildren(): + target.UpdateDockGuide(pos) + else: + lenRects = len(self._aeroRects) + for indx, rect in enumerate(self._aeroRects): + if rect.Contains(pos): + if self._allAeroBmps[indx] != self._aeroBmp: + if indx < lenRects - 1 or (indx == lenRects - 1 and self._valid): + self._aeroBmp = self._allAeroBmps[indx] + self.Refresh() + else: + self._aeroBmp = self._allAeroBmps[-1] + self.Refresh() + + return + + if self._aeroBmp != self._allAeroBmps[-1]: + self._aeroBmp = self._allAeroBmps[-1] + self.Refresh() + + + def HitTest(self, x, y): + """ + Checks if the mouse position is inside the target windows rect. + + :param `x`: the `x` mouse position; + :param `y`: the `y` mouse position. + """ + + if not self._useAero: + if self.targetLeft.GetScreenRect().Contains((x, y)): + return wx.LEFT + if self.targetTop.GetScreenRect().Contains((x, y)): + return wx.UP + if self.targetRight.GetScreenRect().Contains((x, y)): + return wx.RIGHT + if self.targetBottom.GetScreenRect().Contains((x, y)): + return wx.DOWN + if self.targetCenter.IsValid() and self.targetCenter.GetScreenRect().Contains((x, y)): + return wx.CENTER + else: + constants = [wx.LEFT, wx.UP, wx.RIGHT, wx.DOWN, wx.CENTER] + lenRects = len(self._aeroRects) + for indx, rect in enumerate(self._aeroRects): + if rect.Contains((x, y)): + if indx < lenRects or (indx == lenRects-1 and self._valid): + return constants[indx] + + return -1 + + + def ValidateNotebookDocking(self, valid): + """ + Sets whether a pane can be docked on top of another to create an automatic + L{AuiNotebook}. + + :param `valid`: whether a pane can be docked on top to another to form an automatic + L{AuiNotebook}. + """ + + if not self._useAero: + if self.targetCenter.IsValid() != valid: + self.targetCenter.SetValid(valid) + self.targetCenter.Refresh() + else: + if self._valid != valid: + self._valid = valid + self.Refresh() + + + def AeroMove(self, pos): + """ + Moves the docking guide window to the new position. + + :param `pos`: the new docking guide position. + """ + + if not self._useAero: + return + + useWhidbey = (GetManager(self.GetParent()).GetAGWFlags() & AUI_MGR_WHIDBEY_DOCKING_GUIDES) != 0 + + if useWhidbey: + sizeX, sizeY = whidbeySizeX, whidbeySizeY + else: + sizeX, sizeY = aeroguideSizeX, aeroguideSizeY + + size = self.GetSize() + + leftRect, topRect, rightRect, bottomRect, centerRect = self._aeroRects + thePos = pos + wx.Point((size.x-sizeY)/2, (size.y-sizeX)/2) + + centerRect.SetPosition(thePos) + + leftRect.SetPosition(thePos + wx.Point(-sizeY, 0)) + topRect.SetPosition(thePos + wx.Point(0, -sizeY)) + rightRect.SetPosition(thePos + wx.Point(sizeX, 0)) + bottomRect.SetPosition(thePos + wx.Point(0, sizeX)) + + + def OnEraseBackground(self, event): + """ + Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiCenterDockingGuide}. + + :param `event`: `wx.EraseEvent` to be processed. + + :note: This is intentionally empty to reduce flickering while drawing. + """ + + pass + + + def OnPaint(self, event): + """ + Handles the ``wx.EVT_PAINT`` event for L{AuiCenterDockingGuide}. + + :param `event`: a `wx.PaintEvent` to be processed. + """ + + dc = wx.AutoBufferedPaintDC(self) + + if self._useAero: + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.SetPen(wx.TRANSPARENT_PEN) + else: + dc.SetBrush(wx.Brush(colourTargetBackground)) + dc.SetPen(wx.Pen(colourTargetBorder)) + + rect = self.GetClientRect() + dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) + + if self._useAero: + dc.DrawBitmap(self._aeroBmp, 0, 0, True) + if not self._valid: + diff = (self._useAero == 2 and [1] or [0])[0] + bmpX, bmpY = self._deniedBitmap.GetWidth(), self._deniedBitmap.GetHeight() + xPos, yPos = (rect.x + (rect.width)/2 - bmpX/2), (rect.y + (rect.height)/2 - bmpY/2) + dc.DrawBitmap(self._deniedBitmap, xPos+1, yPos+diff, True) + + return + + dc.SetPen(wx.Pen(colourTargetBorder, 2)) + for pts in self._triangles: + dc.DrawLinePoint(pts[0], pts[1]) + + +# ---------------------------------------------------------------------------- +# AuiDockingHintWindow +# ---------------------------------------------------------------------------- + +class AuiDockingHintWindow(wx.Frame): + """ The original wxAUI docking window hint. """ + + def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, + size=wx.Size(1, 1), style=wx.FRAME_TOOL_WINDOW | wx.FRAME_FLOAT_ON_PARENT | + wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.FRAME_SHAPED, + name="auiHintWindow"): + """ + Default class constructor. Used internally, do not call it in your code! + + :param `parent`: the L{AuiDockingGuide} parent; + :param `id`: the window identifier. It may take a value of -1 to indicate a default value. + :param `title`: the caption to be displayed on the frame's title bar; + :param `pos`: the window position. A value of (-1, -1) indicates a default position, + chosen by either the windowing system or wxPython, depending on platform; + :param `size`: the window size. A value of (-1, -1) indicates a default size, chosen by + either the windowing system or wxPython, depending on platform; + :param `style`: the window style; + :param `name`: the name of the window. This parameter is used to associate a name with the + item, allowing the application user to set Motif resource values for individual windows. + """ + if wx.Platform == '__WXMAC__' and style & wx.FRAME_SHAPED: + # Having the shaped frame causes the frame to not be visible + # with the transparent style hints. + style -= wx.FRAME_SHAPED + + wx.Frame.__init__(self, parent, id, title, pos, size, style, name=name) + + self._blindMode = False + self.SetBackgroundColour(colourHintBackground) + + # Can't set background colour on a frame on wxMac + # so add a panel to set the colour on. + if wx.Platform == '__WXMAC__': + sizer = wx.BoxSizer(wx.HORIZONTAL) + self.panel = wx.Panel(self) + sizer.Add(self.panel, 1, wx.EXPAND) + self.SetSizer(sizer) + self.panel.SetBackgroundColour(colourHintBackground) + + self.Bind(wx.EVT_SIZE, self.OnSize) + + + def MakeVenetianBlinds(self): + """ + Creates the "venetian blind" effect if L{AuiManager} has the ``AUI_MGR_VENETIAN_BLINDS_HINT`` + flag set. + """ + + amount = 128 + size = self.GetClientSize() + region = wx.Region(0, 0, size.x, 1) + + for y in xrange(size.y): + + # Reverse the order of the bottom 4 bits + j = (y & 8 and [1] or [0])[0] | (y & 4 and [2] or [0])[0] | \ + (y & 2 and [4] or [0])[0] | (y & 1 and [8] or [0])[0] + + if 16*j+8 < amount: + region.Union(0, y, size.x, 1) + + self.SetShape(region) + + + def SetBlindMode(self, agwFlags): + """ + Sets whether venetian blinds or transparent hints will be shown as docking hint. + This depends on the L{AuiManager} flags. + + :param `agwFlags`: the L{AuiManager} flags. + """ + + self._blindMode = (agwFlags & AUI_MGR_VENETIAN_BLINDS_HINT) != 0 + + if self._blindMode or not self.CanSetTransparent(): + self.MakeVenetianBlinds() + self.SetTransparent(255) + + else: + self.SetShape(wx.Region()) + if agwFlags & AUI_MGR_HINT_FADE == 0: + self.SetTransparent(80) + else: + self.SetTransparent(0) + + + def SetShape(self, region): + """ + If the platform supports it, sets the shape of the window to that depicted by `region`. + The system will not display or respond to any mouse event for the pixels that lie + outside of the region. To reset the window to the normal rectangular shape simply call + L{SetShape} again with an empty region. + + :param `region`: the shape of the frame (an instance of `wx.Region`). + + :note: Overridden for wxMac. + """ + + if wx.Platform == '__WXMAC__': + # HACK so we don't crash when SetShape is called + return + else: + super(AuiDockingHintWindow, self).SetShape(region) + + + def Show(self, show=True): + """ + Show the hint window. + + :param `show`: whether to show or hide the hint docking window. + """ + + super(AuiDockingHintWindow, self).Show(show) + if wx.Platform == '__WXMAC__': + # Need to manually do layout since its a borderless frame. + self.Layout() + + + def OnSize(self, event): + """ + Handles the ``wx.EVT_SIZE`` event for L{AuiDockingHintWindow}. + + :param `event`: a `wx.SizeEvent` to be processed. + """ + + if self._blindMode or not self.CanSetTransparent(): + self.MakeVenetianBlinds() + + +# ---------------------------------------------------------------------------- # + +# -- AuiFloatingFrame class implementation -- + +class AuiFloatingFrame(wx.MiniFrame): + """ AuiFloatingFrame is the frame class that holds floating panes. """ + + def __init__(self, parent, owner_mgr, pane=None, id=wx.ID_ANY, title="", + style=wx.FRAME_TOOL_WINDOW | wx.FRAME_FLOAT_ON_PARENT | + wx.FRAME_NO_TASKBAR | wx.CLIP_CHILDREN): + """ + Default class constructor. Used internally, do not call it in your code! + + :param `parent`: the L{AuiFloatingFrame} parent; + :param `owner_mgr`: the L{AuiManager} that manages the floating pane; + :param `pane`: the L{AuiPaneInfo} pane that is about to float; + :param `id`: the window identifier. It may take a value of -1 to indicate a default value. + :param `title`: the caption to be displayed on the frame's title bar. + :param `style`: the window style. + """ + + if pane and pane.IsResizeable(): + style += wx.RESIZE_BORDER + if pane: + self._is_toolbar = pane.IsToolbar() + + self._useNativeMiniframes = False + if AuiManager_UseNativeMiniframes(owner_mgr): + # On wxMac we always use native miniframes + self._useNativeMiniframes = True + style += wx.CAPTION + wx.SYSTEM_MENU + if pane.HasCloseButton(): + style += wx.CLOSE_BOX + if pane.HasMaximizeButton(): + style += wx.MAXIMIZE_BOX + if pane.HasMinimizeButton(): + style += wx.MINIMIZE_BOX + + wx.MiniFrame.__init__(self, parent, id, title, pos=pane.floating_pos, + size=pane.floating_size, style=style, name="auiFloatingFrame") + + self._fly_timer = wx.Timer(self, wx.ID_ANY) + self._check_fly_timer = wx.Timer(self, wx.ID_ANY) + + self.Bind(wx.EVT_CLOSE, self.OnClose) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_ACTIVATE, self.OnActivate) + self.Bind(wx.EVT_TIMER, self.OnCheckFlyTimer, self._check_fly_timer) + self.Bind(wx.EVT_TIMER, self.OnFlyTimer, self._fly_timer) + self.Bind(EVT_AUI_FIND_MANAGER, self.OnFindManager) + + if self._useNativeMiniframes: + self.Bind(wx.EVT_MOVE, self.OnMoveEvent) + self.Bind(wx.EVT_MOVING, self.OnMoveEvent) + self.Bind(wx.EVT_IDLE, self.OnIdle) + self._useNativeMiniframes = True + self.SetExtraStyle(wx.WS_EX_PROCESS_IDLE) + else: + self.Bind(wx.EVT_MOVE, self.OnMove) + + self._fly = False + self._send_size = True + self._alpha_amount = 255 + + self._owner_mgr = owner_mgr + self._moving = False + self._lastDirection = None + self._transparent = 255 + + self._last_rect = wx.Rect() + self._last2_rect = wx.Rect() + self._last3_rect = wx.Rect() + + self._mgr = AuiManager() + self._mgr.SetManagedWindow(self) + self._mgr.SetArtProvider(owner_mgr.GetArtProvider()) + self._mgr.SetAGWFlags(owner_mgr.GetAGWFlags()) + + + def CopyAttributes(self, pane): + """ + Copies all the attributes of the input `pane` into another L{AuiPaneInfo}. + + :param `pane`: the source L{AuiPaneInfo} from where to copy attributes. + """ + + contained_pane = AuiPaneInfo() + + contained_pane.name = pane.name + contained_pane.caption = pane.caption + contained_pane.window = pane.window + contained_pane.frame = pane.frame + contained_pane.state = pane.state + contained_pane.dock_direction = pane.dock_direction + contained_pane.dock_layer = pane.dock_layer + contained_pane.dock_row = pane.dock_row + contained_pane.dock_pos = pane.dock_pos + contained_pane.best_size = wx.Size(*pane.best_size) + contained_pane.min_size = wx.Size(*pane.min_size) + contained_pane.max_size = wx.Size(*pane.max_size) + contained_pane.floating_pos = wx.Point(*pane.floating_pos) + contained_pane.floating_size = wx.Size(*pane.floating_size) + contained_pane.dock_proportion = pane.dock_proportion + contained_pane.buttons = pane.buttons + contained_pane.rect = wx.Rect(*pane.rect) + contained_pane.icon = pane.icon + contained_pane.notebook_id = pane.notebook_id + contained_pane.transparent = pane.transparent + contained_pane.snapped = pane.snapped + contained_pane.minimize_mode = pane.minimize_mode + + return contained_pane + + + def SetPaneWindow(self, pane): + """ + Sets all the properties of a pane. + + :param `pane`: the L{AuiPaneInfo} to analyze. + """ + + self._is_toolbar = pane.IsToolbar() + self._pane_window = pane.window + + if isinstance(pane.window, auibar.AuiToolBar): + pane.window.SetAuiManager(self._mgr) + + self._pane_window.Reparent(self) + + contained_pane = self.CopyAttributes(pane) + + contained_pane.Dock().Center().Show(). \ + CaptionVisible(False). \ + PaneBorder(False). \ + Layer(0).Row(0).Position(0) + + if not contained_pane.HasGripper() and not self._useNativeMiniframes: + contained_pane.CaptionVisible(True) + + indx = self._owner_mgr._panes.index(pane) + + # Carry over the minimum size + pane_min_size = pane.window.GetMinSize() + + # if the best size is smaller than the min size + # then set the min size to the best size as well + pane_best_size = contained_pane.best_size + if pane_best_size.IsFullySpecified() and (pane_best_size.x < pane_min_size.x or \ + pane_best_size.y < pane_min_size.y): + + pane_min_size = pane_best_size + self._pane_window.SetMinSize(pane_min_size) + + # if the frame window's max size is greater than the min size + # then set the max size to the min size as well + cur_max_size = self.GetMaxSize() + if cur_max_size.IsFullySpecified() and (cur_max_size.x < pane_min_size.x or \ + cur_max_size.y < pane_min_size.y): + self.SetMaxSize(pane_min_size) + + art_provider = self._mgr.GetArtProvider() + caption_size = art_provider.GetMetric(AUI_DOCKART_CAPTION_SIZE) + button_size = art_provider.GetMetric(AUI_DOCKART_PANE_BUTTON_SIZE) + \ + 4*art_provider.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) + + min_size = pane.window.GetMinSize() + + if min_size.y < caption_size or min_size.x < button_size: + new_x, new_y = min_size.x, min_size.y + if min_size.y < caption_size: + new_y = (pane.IsResizeable() and [2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)+caption_size] or [1])[0] + if min_size.x < button_size: + new_x = (pane.IsResizeable() and [2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_X)+button_size] or [1])[0] + + self.SetMinSize((new_x, new_y)) + else: + self.SetMinSize(min_size) + + self._mgr.AddPane(self._pane_window, contained_pane) + self._mgr.Update() + + if pane.min_size.IsFullySpecified(): + # because SetSizeHints() calls Fit() too (which sets the window + # size to its minimum allowed), we keep the size before calling + # SetSizeHints() and reset it afterwards... + tmp = self.GetSize() + self.GetSizer().SetSizeHints(self) + self.SetSize(tmp) + + self.SetTitle(pane.caption) + + if pane.floating_size != wx.Size(-1, -1): + self.SetSize(pane.floating_size) + else: + size = pane.best_size + if size == wx.Size(-1, -1): + size = pane.min_size + if size == wx.Size(-1, -1): + size = self._pane_window.GetSize() + if self._owner_mgr and pane.HasGripper(): + if pane.HasGripperTop(): + size.y += self._owner_mgr._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) + else: + size.x += self._owner_mgr._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) + + if not self._useNativeMiniframes: + size.y += self._owner_mgr._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + + pane.floating_size = size + + self.SetClientSize(size) + + self._owner_mgr._panes[indx] = pane + + self._fly_step = abs(pane.floating_size.y - \ + (caption_size + 2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y)))/10 + + self._floating_size = wx.Size(*self.GetSize()) + + if pane.IsFlyOut(): + self._check_fly_timer.Start(50) + + + def GetOwnerManager(self): + """ Returns the L{AuiManager} that manages the pane. """ + + return self._owner_mgr + + + def OnSize(self, event): + """ + Handles the ``wx.EVT_SIZE`` event for L{AuiFloatingFrame}. + + :param `event`: a `wx.SizeEvent` to be processed. + """ + + if self._owner_mgr and self._send_size: + self._owner_mgr.OnFloatingPaneResized(self._pane_window, event.GetSize()) + + + def OnClose(self, event): + """ + Handles the ``wx.EVT_CLOSE`` event for L{AuiFloatingFrame}. + + :param `event`: a `wx.CloseEvent` to be processed. + """ + + if self._owner_mgr: + self._owner_mgr.OnFloatingPaneClosed(self._pane_window, event) + + if not event.GetVeto(): + self._mgr.DetachPane(self._pane_window) + + if isinstance(self._pane_window, auibar.AuiToolBar): + self._pane_window.SetAuiManager(self._owner_mgr) + + # if we do not do this, then we can crash... + if self._owner_mgr and self._owner_mgr._action_window == self: + self._owner_mgr._action_window = None + + self.Destroy() + + + def OnActivate(self, event): + """ + Handles the ``wx.EVT_ACTIVATE`` event for L{AuiFloatingFrame}. + + :param `event`: a `wx.ActivateEvent` to be processed. + """ + + if self._owner_mgr and event.GetActive(): + self._owner_mgr.OnFloatingPaneActivated(self._pane_window) + + + def OnMove(self, event): + """ + Handles the ``wx.EVT_MOVE`` event for L{AuiFloatingFrame}. + + :param `event`: a `wx.MoveEvent` to be processed. + + :note: This event is not processed on wxMAC or if L{AuiManager} is not using the + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. + """ + + if self._owner_mgr: + self._owner_mgr.OnFloatingPaneMoved(self._pane_window, event) + + + def OnMoveEvent(self, event): + """ + Handles the ``wx.EVT_MOVE`` and ``wx.EVT_MOVING`` events for L{AuiFloatingFrame}. + + :param `event`: a `wx.MoveEvent` to be processed. + + :note: This event is only processed on wxMAC or if L{AuiManager} is using the + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. + """ + + win_rect = self.GetRect() + + if win_rect == self._last_rect: + return + + # skip the first move event + if self._last_rect.IsEmpty(): + self._last_rect = wx.Rect(*win_rect) + return + + # skip if moving too fast to avoid massive redraws and + # jumping hint windows + if abs(win_rect.x - self._last_rect.x) > 3 or abs(win_rect.y - self._last_rect.y) > 3: + self._last3_rect = wx.Rect(*self._last2_rect) + self._last2_rect = wx.Rect(*self._last_rect) + self._last_rect = wx.Rect(*win_rect) + return + + # prevent frame redocking during resize + if self._last_rect.GetSize() != win_rect.GetSize(): + self._last3_rect = wx.Rect(*self._last2_rect) + self._last2_rect = wx.Rect(*self._last_rect) + self._last_rect = wx.Rect(*win_rect) + return + + self._last3_rect = wx.Rect(*self._last2_rect) + self._last2_rect = wx.Rect(*self._last_rect) + self._last_rect = wx.Rect(*win_rect) + + if _VERSION_STRING < "2.9": + leftDown = wx.GetMouseState().LeftDown() + else: + leftDown = wx.GetMouseState().LeftIsDown() + + if not leftDown: + return + + if not self._moving: + self.OnMoveStart(event) + self._moving = True + + if self._last3_rect.IsEmpty(): + return + + self.OnMoving(event) + + + def OnIdle(self, event): + """ + Handles the ``wx.EVT_IDLE`` event for L{AuiFloatingFrame}. + + :param `event`: a `wx.IdleEvent` event to be processed. + + :note: This event is only processed on wxMAC or if L{AuiManager} is using the + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. + """ + + if self._moving: + if _VERSION_STRING < "2.9": + leftDown = wx.GetMouseState().LeftDown() + else: + leftDown = wx.GetMouseState().LeftIsDown() + + if not leftDown: + self._moving = False + self.OnMoveFinished() + else: + event.RequestMore() + + + def OnMoveStart(self, event): + """ + The user has just started moving the floating pane. + + :param `event`: an instance of `wx.MouseEvent`. + + :note: This method is used only on wxMAC or if L{AuiManager} is using the + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. + """ + + # notify the owner manager that the pane has started to move + if self._owner_mgr: + if self._owner_mgr._from_move: + return + self._owner_mgr._action_window = self._pane_window + point = wx.GetMousePosition() + action_offset = point - self.GetPosition() + + if self._is_toolbar: + self._owner_mgr._toolbar_action_offset = action_offset + self._owner_mgr.OnMotion_DragToolbarPane(point) + else: + self._owner_mgr._action_offset = action_offset + self._owner_mgr.OnMotion_DragFloatingPane(point) + + + def OnMoving(self, event): + """ + The user is moving the floating pane. + + :param `event`: an instance of `wx.MouseEvent`. + + :note: This method is used only on wxMAC or if L{AuiManager} is using the + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. + """ + + # notify the owner manager that the pane is moving + self.OnMoveStart(event) + + + def OnMoveFinished(self): + """ + The user has just finished moving the floating pane. + + :note: This method is used only on wxMAC or if L{AuiManager} is using the + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` style. + """ + + # notify the owner manager that the pane has finished moving + if self._owner_mgr: + self._owner_mgr._action_window = self._pane_window + point = wx.GetMousePosition() + if self._is_toolbar: + self._owner_mgr.OnLeftUp_DragToolbarPane(point) + else: + self._owner_mgr.OnLeftUp_DragFloatingPane(point) + + self._owner_mgr.OnFloatingPaneMoved(self._pane_window, point) + + + def OnCheckFlyTimer(self, event): + """ + Handles the ``wx.EVT_TIMER`` event for L{AuiFloatingFrame}. + + :param `event`: a `wx.TimerEvent` to be processed. + + :note: This is used solely for "fly-out" panes. + """ + + if self._owner_mgr: + pane = self._mgr.GetPane(self._pane_window) + if pane.IsFlyOut(): + if self.IsShownOnScreen(): + self.FlyOut() + + + def OnFindManager(self, event): + """ + Handles the ``EVT_AUI_FIND_MANAGER`` event for L{AuiFloatingFrame}. + + :param `event`: a L{AuiManagerEvent} event to be processed. + """ + + event.SetManager(self._owner_mgr) + + + def FlyOut(self): + """ Starts the flying in and out of a floating pane. """ + + if self._fly_timer.IsRunning(): + return + + if _VERSION_STRING < "2.9": + leftDown = wx.GetMouseState().LeftDown() + else: + leftDown = wx.GetMouseState().LeftIsDown() + + if leftDown: + return + + rect = wx.Rect(*self.GetScreenRect()) + rect.Inflate(10, 10) + + if rect.Contains(wx.GetMousePosition()): + if not self._fly: + return + self._send_size = False + self._fly_timer.Start(5) + else: + if self._fly: + return + self._send_size = False + self._fly_timer.Start(5) + + + def OnFlyTimer(self, event): + """ + Handles the ``wx.EVT_TIMER`` event for L{AuiFloatingFrame}. + + :param `event`: a `wx.TimerEvent` to be processed. + """ + + current_size = self.GetClientSize() + floating_size = wx.Size(*self._owner_mgr.GetPane(self._pane_window).floating_size) + + if floating_size.y == -1: + floating_size = self._floating_size + + if not self._fly: + min_size = self._mgr.GetArtProvider().GetMetric(AUI_DOCKART_CAPTION_SIZE) + + if wx.Platform != "__WXMSW__": + min_size += 2*wx.SystemSettings.GetMetric(wx.SYS_EDGE_Y) + + if current_size.y - self._fly_step <= min_size: + self.SetClientSize((current_size.x, min_size)) + self._fly = True + self._fly_timer.Stop() + self._send_size = True + else: + self.SetClientSize((current_size.x, current_size.y-self._fly_step)) + + else: + if current_size.y + self._fly_step >= floating_size.y: + self.SetClientSize((current_size.x, floating_size.y)) + self._fly = False + self._fly_timer.Stop() + self._send_size = True + else: + self.SetClientSize((current_size.x, current_size.y+self._fly_step)) + + self.Update() + self.Refresh() + + + def FadeOut(self): + """ Actually starts the fading out of the floating pane. """ + + while 1: + self._alpha_amount -= 10 + if self._alpha_amount <= 0: + self._alpha_amount = 255 + return + + self.SetTransparent(self._alpha_amount) + wx.SafeYield() + wx.MilliSleep(15) + + +# -- static utility functions -- + +def DrawResizeHint(dc, rect): + """ + Draws a resize hint while a sash is dragged. + + :param `rect`: a `wx.Rect` rectangle which specifies the sash dimensions. + """ + + if wx.Platform == "__WXMSW__" and wx.App.GetComCtl32Version() >= 600: + if wx.GetOsVersion()[1] > 5: + # Windows Vista + dc.SetPen(wx.Pen("black", 2, wx.SOLID)) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + else: + # Draw the nice XP style splitter + dc.SetPen(wx.TRANSPARENT_PEN) + dc.SetBrush(wx.BLACK_BRUSH) + dc.SetLogicalFunction(wx.INVERT) + dc.DrawRectangleRect(rect) + dc.SetLogicalFunction(wx.COPY) + else: + stipple = PaneCreateStippleBitmap() + brush = wx.BrushFromBitmap(stipple) + dc.SetBrush(brush) + dc.SetPen(wx.TRANSPARENT_PEN) + + dc.SetLogicalFunction(wx.XOR) + dc.DrawRectangleRect(rect) + + +def CopyDocksAndPanes(src_docks, src_panes): + """ + This utility function creates shallow copies of + the dock and pane info. L{AuiDockInfo} usually contain pointers + to L{AuiPaneInfo} classes, thus this function is necessary to reliably + reconstruct that relationship in the new dock info and pane info arrays. + + :param `src_docks`: a list of L{AuiDockInfo} classes; + :param `src_panes`: a list of L{AuiPaneInfo} classes. + """ + + dest_docks = src_docks + dest_panes = src_panes + + for ii in xrange(len(dest_docks)): + dock = dest_docks[ii] + for jj in xrange(len(dock.panes)): + for kk in xrange(len(src_panes)): + if dock.panes[jj] == src_panes[kk]: + dock.panes[jj] = dest_panes[kk] + + return dest_docks, dest_panes + + +def CopyDocksAndPanes2(src_docks, src_panes): + """ + This utility function creates full copies of + the dock and pane info. L{AuiDockInfo} usually contain pointers + to L{AuiPaneInfo} classes, thus this function is necessary to reliably + reconstruct that relationship in the new dock info and pane info arrays. + + :param `src_docks`: a list of L{AuiDockInfo} classes; + :param `src_panes`: a list of L{AuiPaneInfo} classes. + """ + + dest_docks = [] + + for ii in xrange(len(src_docks)): + dest_docks.append(AuiDockInfo()) + dest_docks[ii].dock_direction = src_docks[ii].dock_direction + dest_docks[ii].dock_layer = src_docks[ii].dock_layer + dest_docks[ii].dock_row = src_docks[ii].dock_row + dest_docks[ii].size = src_docks[ii].size + dest_docks[ii].min_size = src_docks[ii].min_size + dest_docks[ii].resizable = src_docks[ii].resizable + dest_docks[ii].fixed = src_docks[ii].fixed + dest_docks[ii].toolbar = src_docks[ii].toolbar + dest_docks[ii].panes = src_docks[ii].panes + dest_docks[ii].rect = wx.Rect(*src_docks[ii].rect) + + dest_panes = [] + + for ii in xrange(len(src_panes)): + dest_panes.append(AuiPaneInfo()) + dest_panes[ii].name = src_panes[ii].name + dest_panes[ii].caption = src_panes[ii].caption + dest_panes[ii].window = src_panes[ii].window + dest_panes[ii].frame = src_panes[ii].frame + dest_panes[ii].state = src_panes[ii].state + dest_panes[ii].dock_direction = src_panes[ii].dock_direction + dest_panes[ii].dock_layer = src_panes[ii].dock_layer + dest_panes[ii].dock_row = src_panes[ii].dock_row + dest_panes[ii].dock_pos = src_panes[ii].dock_pos + dest_panes[ii].best_size = wx.Size(*src_panes[ii].best_size) + dest_panes[ii].min_size = wx.Size(*src_panes[ii].min_size) + dest_panes[ii].max_size = wx.Size(*src_panes[ii].max_size) + dest_panes[ii].floating_pos = wx.Point(*src_panes[ii].floating_pos) + dest_panes[ii].floating_size = wx.Size(*src_panes[ii].floating_size) + dest_panes[ii].dock_proportion = src_panes[ii].dock_proportion + dest_panes[ii].buttons = src_panes[ii].buttons + dest_panes[ii].rect = wx.Rect(*src_panes[ii].rect) + dest_panes[ii].icon = src_panes[ii].icon + dest_panes[ii].notebook_id = src_panes[ii].notebook_id + dest_panes[ii].transparent = src_panes[ii].transparent + dest_panes[ii].snapped = src_panes[ii].snapped + dest_panes[ii].minimize_mode = src_panes[ii].minimize_mode + + for ii in xrange(len(dest_docks)): + dock = dest_docks[ii] + for jj in xrange(len(dock.panes)): + for kk in xrange(len(src_panes)): + if dock.panes[jj] == src_panes[kk]: + dock.panes[jj] = dest_panes[kk] + + dest_docks[ii] = dock + + return dest_docks, dest_panes + + +def GetMaxLayer(docks, dock_direction): + """ + This is an internal function which returns + the highest layer inside the specified dock. + + :param `docks`: a list of L{AuiDockInfo}; + :param `dock_direction`: the L{AuiDockInfo} docking direction to analyze. + """ + + max_layer = 0 + + for dock in docks: + if dock.dock_direction == dock_direction and dock.dock_layer > max_layer and not dock.fixed: + max_layer = dock.dock_layer + + return max_layer + + +def GetMaxRow(panes, dock_direction, dock_layer): + """ + This is an internal function which returns + the highest layer inside the specified dock. + + :param `panes`: a list of L{AuiPaneInfo}; + :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; + :param `dock_layer`: the L{AuiPaneInfo} layer to analyze. + """ + + max_row = 0 + + for pane in panes: + if pane.dock_direction == dock_direction and pane.dock_layer == dock_layer and \ + pane.dock_row > max_row: + max_row = pane.dock_row + + return max_row + + +def DoInsertDockLayer(panes, dock_direction, dock_layer): + """ + This is an internal function that inserts a new dock + layer by incrementing all existing dock layer values by one. + + :param `panes`: a list of L{AuiPaneInfo}; + :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; + :param `dock_layer`: the L{AuiPaneInfo} layer to analyze. + """ + + for ii in xrange(len(panes)): + pane = panes[ii] + if not pane.IsFloating() and pane.dock_direction == dock_direction and pane.dock_layer >= dock_layer: + pane.dock_layer = pane.dock_layer + 1 + + panes[ii] = pane + + return panes + + +def DoInsertDockRow(panes, dock_direction, dock_layer, dock_row): + """ + This is an internal function that inserts a new dock + row by incrementing all existing dock row values by one. + + :param `panes`: a list of L{AuiPaneInfo}; + :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; + :param `dock_layer`: the L{AuiPaneInfo} layer to analyze; + :param `dock_row`: the L{AuiPaneInfo} row to analyze. + """ + + for pane in panes: + if not pane.IsFloating() and pane.dock_direction == dock_direction and \ + pane.dock_layer == dock_layer and pane.dock_row >= dock_row: + pane.dock_row += 1 + + return panes + + +def DoInsertPane(panes, dock_direction, dock_layer, dock_row, dock_pos): + """ + This is an internal function that inserts a new pane + by incrementing all existing dock position values by one. + + :param `panes`: a list of L{AuiPaneInfo}; + :param `dock_direction`: the L{AuiPaneInfo} docking direction to analyze; + :param `dock_layer`: the L{AuiPaneInfo} layer to analyze; + :param `dock_row`: the L{AuiPaneInfo} row to analyze; + :param `dock_pos`: the L{AuiPaneInfo} row to analyze. + """ + + for ii in xrange(len(panes)): + pane = panes[ii] + if not pane.IsFloating() and pane.dock_direction == dock_direction and \ + pane.dock_layer == dock_layer and pane.dock_row == dock_row and \ + pane.dock_pos >= dock_pos: + pane.dock_pos = pane.dock_pos + 1 + + panes[ii] = pane + + return panes + + +def FindDocks(docks, dock_direction, dock_layer=-1, dock_row=-1, reverse=False): + """ + This is an internal function that returns a list of docks which meet + the specified conditions in the parameters and returns a sorted array + (sorted by layer and then row). + + :param `docks`: a list of L{AuiDockInfo}; + :param `dock_direction`: the L{AuiDockInfo} docking direction to analyze; + :param `dock_layer`: the L{AuiDockInfo} layer to analyze; + :param `dock_row`: the L{AuiDockInfo} row to analyze; + """ + + matchDocks = [(d.dock_layer, d.dock_row, d.dock_direction, d) for d in docks if \ + (dock_direction == -1 or dock_direction == d.dock_direction) and \ + ((dock_layer == -1 or dock_layer == d.dock_layer) and \ + (dock_row == -1 or dock_row == d.dock_row))] + + arr = [x[-1] for x in sorted(matchDocks, reverse=reverse)] + + return arr + + +def FindOppositeDocks(docks, dock_direction): + """ + This is an internal function that returns a list of docks + which is related to the opposite direction. + + :param `docks`: a list of L{AuiDockInfo}; + :param `dock_direction`: the L{AuiDockInfo} docking direction to analyze; + """ + + if dock_direction == AUI_DOCK_LEFT: + arr = FindDocks(docks, AUI_DOCK_RIGHT, -1, -1) + elif dock_direction == AUI_DOCK_TOP: + arr = FindDocks(docks, AUI_DOCK_BOTTOM, -1, -1) + elif dock_direction == AUI_DOCK_RIGHT: + arr = FindDocks(docks, AUI_DOCK_LEFT, -1, -1) + elif dock_direction == AUI_DOCK_BOTTOM: + arr = FindDocks(docks, AUI_DOCK_TOP, -1, -1) + + return arr + + +def FindPaneInDock(dock, window): + """ + This method looks up a specified window pointer inside a dock. + If found, the corresponding L{AuiPaneInfo} pointer is returned, otherwise ``None``. + + :param `dock`: a L{AuiDockInfo} structure; + :param `window`: a `wx.Window` derived window (associated to a pane). + """ + + for p in dock.panes: + if p.window == window: + return p + + return None + + +def GetToolBarDockOffsets(docks): + """ + Returns the toolbar dock offsets (top-left and bottom-right). + + :param `docks`: a list of L{AuiDockInfo} to analyze. + """ + + top_left = wx.Size(0, 0) + bottom_right = wx.Size(0, 0) + + for dock in docks: + if dock.toolbar: + dock_direction = dock.dock_direction + if dock_direction == AUI_DOCK_LEFT: + top_left.x += dock.rect.width + bottom_right.x += dock.rect.width + + elif dock_direction == AUI_DOCK_TOP: + top_left.y += dock.rect.height + bottom_right.y += dock.rect.height + + elif dock_direction == AUI_DOCK_RIGHT: + bottom_right.x += dock.rect.width + + elif dock_direction == AUI_DOCK_BOTTOM: + bottom_right.y += dock.rect.height + + return top_left, bottom_right + + +def GetInternalFrameRect(window, docks): + """ + Returns the window rectangle excluding toolbars. + + :param `window`: a `wx.Window` derived window; + :param `docks`: a list of L{AuiDockInfo} structures. + """ + + frameRect = wx.Rect() + + frameRect.SetTopLeft(window.ClientToScreen(window.GetClientAreaOrigin())) + frameRect.SetSize(window.GetClientSize()) + + top_left, bottom_right = GetToolBarDockOffsets(docks) + + # make adjustments for toolbars + frameRect.x += top_left.x + frameRect.y += top_left.y + frameRect.width -= bottom_right.x + frameRect.height -= bottom_right.y + + return frameRect + + +def CheckOutOfWindow(window, pt): + """ + Checks if a point is outside the window rectangle. + + :param `window`: a `wx.Window` derived window; + :param `pt`: a `wx.Point` object. + """ + + auiWindowMargin = 30 + marginRect = wx.Rect(*window.GetClientRect()) + marginRect.Inflate(auiWindowMargin, auiWindowMargin) + + return not marginRect.Contains(pt) + + +def CheckEdgeDrop(window, docks, pt): + """ + Checks on which edge of a window the drop action has taken place. + + :param `window`: a `wx.Window` derived window; + :param `docks`: a list of L{AuiDockInfo} structures; + :param `pt`: a `wx.Point` object. + """ + + screenPt = window.ClientToScreen(pt) + clientSize = window.GetClientSize() + frameRect = GetInternalFrameRect(window, docks) + + if screenPt.y >= frameRect.GetTop() and screenPt.y < frameRect.GetBottom(): + if pt.x < auiLayerInsertOffset and pt.x > auiLayerInsertOffset - auiLayerInsertPixels: + return wx.LEFT + + if pt.x >= clientSize.x - auiLayerInsertOffset and \ + pt.x < clientSize.x - auiLayerInsertOffset + auiLayerInsertPixels: + return wx.RIGHT + + if screenPt.x >= frameRect.GetLeft() and screenPt.x < frameRect.GetRight(): + if pt.y < auiLayerInsertOffset and pt.y > auiLayerInsertOffset - auiLayerInsertPixels: + return wx.TOP + + if pt.y >= clientSize.y - auiLayerInsertOffset and \ + pt.y < clientSize.y - auiLayerInsertOffset + auiLayerInsertPixels: + return wx.BOTTOM + + return -1 + + +def RemovePaneFromDocks(docks, pane, exc=None): + """ + Removes a pane window from all docks + with a possible exception specified by parameter `exc`. + + :param `docks`: a list of L{AuiDockInfo} structures; + :param `pane`: the L{AuiPaneInfo} pane to be removed; + :param `exc`: the possible pane exception. + """ + + for ii in xrange(len(docks)): + d = docks[ii] + if d == exc: + continue + pi = FindPaneInDock(d, pane.window) + if pi: + d.panes.remove(pi) + + docks[ii] = d + + return docks + + +def RenumberDockRows(docks): + """ + Takes a dock and assigns sequential numbers + to existing rows. Basically it takes out the gaps so if a + dock has rows with numbers 0, 2, 5, they will become 0, 1, 2. + + :param `docks`: a list of L{AuiDockInfo} structures. + """ + + for ii in xrange(len(docks)): + dock = docks[ii] + dock.dock_row = ii + for jj in xrange(len(dock.panes)): + dock.panes[jj].dock_row = ii + + docks[ii] = dock + + return docks + + +def SetActivePane(panes, active_pane): + """ + Sets the active pane, as well as cycles through + every other pane and makes sure that all others' active flags + are turned off. + + :param `panes`: a list of L{AuiPaneInfo} structures; + :param `active_pane`: the pane to be made active (if found). + """ + + for pane in panes: + pane.state &= ~AuiPaneInfo.optionActive + + for pane in panes: + if pane.window == active_pane and not pane.IsNotebookPage(): + pane.state |= AuiPaneInfo.optionActive + return True, panes + + return False, panes + + +def ShowDockingGuides(guides, show): + """ + Shows or hide the docking guide windows. + + :param `guides`: a list of L{AuiDockingGuideInfo} classes; + :param `show`: whether to show or hide the docking guide windows. + """ + + for target in guides: + + if show and not target.host.IsShown(): + target.host.Show() + target.host.Update() + + elif not show and target.host.IsShown(): + target.host.Hide() + + +def RefreshDockingGuides(guides): + """ + Refreshes the docking guide windows. + + :param `guides`: a list of L{AuiDockingGuideInfo} classes; + """ + + for target in guides: + if target.host.IsShown(): + target.host.Refresh() + + +def PaneSortFunc(p1, p2): + """ + This function is used to sort panes by dock position. + + :param `p1`: a L{AuiPaneInfo} instance; + :param `p2`: another L{AuiPaneInfo} instance. + """ + + return (p1.dock_pos < p2.dock_pos and [-1] or [1])[0] + + +def GetNotebookRoot(panes, notebook_id): + """ + Returns the L{AuiPaneInfo} which has the specified `notebook_id`. + + :param `panes`: a list of L{AuiPaneInfo} instances; + :param `notebook_id`: the target notebook id. + """ + + for paneInfo in panes: + if paneInfo.IsNotebookControl() and paneInfo.notebook_id == notebook_id: + return paneInfo + + return None + + +def EscapeDelimiters(s): + """ + Changes ``;`` into ``\`` and ``|`` into ``\|`` in the input string. + + :param `s`: the string to be analyzed. + + :note: This is an internal functions which is used for saving perspectives. + """ + + result = s.replace(";", "\\") + result = result.replace("|", "|\\") + + return result + + +def IsDifferentDockingPosition(pane1, pane2): + """ + Returns whether `pane1` and `pane2` are in a different docking position + based on pane status, docking direction, docking layer and docking row. + + :param `pane1`: a L{AuiPaneInfo} instance; + :param `pane2`: another L{AuiPaneInfo} instance. + """ + + return pane1.IsFloating() != pane2.IsFloating() or \ + pane1.dock_direction != pane2.dock_direction or \ + pane1.dock_layer != pane2.dock_layer or \ + pane1.dock_row != pane2.dock_row + + +# Convenience function +def AuiManager_HasLiveResize(manager): + """ + Static function which returns if the input `manager` should have "live resize" + behaviour. + + :param `manager`: an instance of L{AuiManager}. + + :note: This method always returns ``True`` on wxMac as this platform doesn't have + the ability to use `wx.ScreenDC` to draw sashes. + """ + + # With Core Graphics on Mac, it's not possible to show sash feedback, + # so we'll always use live update instead. + + if wx.Platform == "__WXMAC__": + return True + else: + return (manager.GetAGWFlags() & AUI_MGR_LIVE_RESIZE) == AUI_MGR_LIVE_RESIZE + + +# Convenience function +def AuiManager_UseNativeMiniframes(manager): + """ + Static function which returns if the input `manager` should use native `wx.MiniFrame` as + floating panes. + + :param `manager`: an instance of L{AuiManager}. + + :note: This method always returns ``True`` on wxMac as this platform doesn't have + the ability to use custom drawn miniframes. + """ + + # With Core Graphics on Mac, it's not possible to show sash feedback, + # so we'll always use live update instead. + + if wx.Platform == "__WXMAC__": + return True + else: + return (manager.GetAGWFlags() & AUI_MGR_USE_NATIVE_MINIFRAMES) == AUI_MGR_USE_NATIVE_MINIFRAMES + + +def GetManager(window): + """ + This function will return the aui manager for a given window. + + :param `window`: this parameter should be any child window or grand-child + window (and so on) of the frame/window managed by L{AuiManager}. The window + does not need to be managed by the manager itself, nor does it even need + to be a child or sub-child of a managed window. It must however be inside + the window hierarchy underneath the managed window. + """ + + if not isinstance(wx.GetTopLevelParent(window), AuiFloatingFrame): + if isinstance(window, auibar.AuiToolBar): + return window.GetAuiManager() + + evt = AuiManagerEvent(wxEVT_AUI_FIND_MANAGER) + evt.SetManager(None) + evt.ResumePropagation(wx.EVENT_PROPAGATE_MAX) + + if not window.GetEventHandler().ProcessEvent(evt): + return None + + return evt.GetManager() + + +# ---------------------------------------------------------------------------- # + +class AuiManager(wx.EvtHandler): + """ + AuiManager manages the panes associated with it for a particular `wx.Frame`, + using a pane's L{AuiPaneInfo} information to determine each pane's docking and + floating behavior. L{AuiManager} uses wxPython's sizer mechanism to plan the + layout of each frame. It uses a replaceable dock art class to do all drawing, + so all drawing is localized in one area, and may be customized depending on an + applications' specific needs. + + L{AuiManager} works as follows: the programmer adds panes to the class, or makes + changes to existing pane properties (dock position, floating state, show state, etc...). + To apply these changes, the L{AuiManager.Update} function is called. This batch + processing can be used to avoid flicker, by modifying more than one pane at a time, + and then "committing" all of the changes at once by calling `Update()`. + + Panes can be added quite easily:: + + text1 = wx.TextCtrl(self, -1) + text2 = wx.TextCtrl(self, -1) + self._mgr.AddPane(text1, AuiPaneInfo().Left().Caption("Pane Number One")) + self._mgr.AddPane(text2, AuiPaneInfo().Bottom().Caption("Pane Number Two")) + + self._mgr.Update() + + + Later on, the positions can be modified easily. The following will float an + existing pane in a tool window:: + + self._mgr.GetPane(text1).Float() + + + **Layers, Rows and Directions, Positions:** + + Inside AUI, the docking layout is figured out by checking several pane parameters. + Four of these are important for determining where a pane will end up. + + **Direction** - Each docked pane has a direction, `Top`, `Bottom`, `Left`, `Right`, or `Center`. + This is fairly self-explanatory. The pane will be placed in the location specified + by this variable. + + **Position** - More than one pane can be placed inside of a "dock". Imagine two panes + being docked on the left side of a window. One pane can be placed over another. + In proportionally managed docks, the pane position indicates it's sequential position, + starting with zero. So, in our scenario with two panes docked on the left side, the + top pane in the dock would have position 0, and the second one would occupy position 1. + + **Row** - A row can allow for two docks to be placed next to each other. One of the most + common places for this to happen is in the toolbar. Multiple toolbar rows are allowed, + the first row being in row 0, and the second in row 1. Rows can also be used on + vertically docked panes. + + **Layer** - A layer is akin to an onion. Layer 0 is the very center of the managed pane. + Thus, if a pane is in layer 0, it will be closest to the center window (also sometimes + known as the "content window"). Increasing layers "swallow up" all layers of a lower + value. This can look very similar to multiple rows, but is different because all panes + in a lower level yield to panes in higher levels. The best way to understand layers + is by running the AUI sample (`AUI.py`). + """ + + def __init__(self, managed_window=None, agwFlags=None): + """ + Default class constructor. + + :param `managed_window`: specifies the window which should be managed; + :param `agwFlags`: specifies options which allow the frame management behavior to be + modified. `agwFlags` can be a combination of the following style bits: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_MGR_ALLOW_FLOATING`` Allow floating of panes + ``AUI_MGR_ALLOW_ACTIVE_PANE`` If a pane becomes active, "highlight" it in the interface + ``AUI_MGR_TRANSPARENT_DRAG`` If the platform supports it, set transparency on a floating pane while it is dragged by the user + ``AUI_MGR_TRANSPARENT_HINT`` If the platform supports it, show a transparent hint window when the user is about to dock a floating pane + ``AUI_MGR_VENETIAN_BLINDS_HINT`` Show a "venetian blind" effect when the user is about to dock a floating pane + ``AUI_MGR_RECTANGLE_HINT`` Show a rectangle hint effect when the user is about to dock a floating pane + ``AUI_MGR_HINT_FADE`` If the platform supports it, the hint window will fade in and out + ``AUI_MGR_NO_VENETIAN_BLINDS_FADE`` Disables the "venetian blind" fade in and out + ``AUI_MGR_LIVE_RESIZE`` Live resize when the user drag a sash + ``AUI_MGR_ANIMATE_FRAMES`` Fade-out floating panes when they are closed (all platforms which support frames transparency) and show a moving rectangle when they are docked (Windows < Vista and GTK only) + ``AUI_MGR_AERO_DOCKING_GUIDES`` Use the new Aero-style bitmaps as docking guides + ``AUI_MGR_PREVIEW_MINIMIZED_PANES`` Slide in and out minimized panes to preview them + ``AUI_MGR_WHIDBEY_DOCKING_GUIDES`` Use the new Whidbey-style bitmaps as docking guides + ``AUI_MGR_SMOOTH_DOCKING`` Performs a "smooth" docking of panes (a la PyQT) + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` Use miniframes with native caption bar as floating panes instead or custom drawn caption bars (forced on wxMac) + ``AUI_MGR_AUTONB_NO_CAPTION`` Panes that merge into an automatic notebook will not have the pane caption visible + ==================================== ================================== + + Default value for `agwFlags` is: + ``AUI_MGR_DEFAULT`` = ``AUI_MGR_ALLOW_FLOATING`` | ``AUI_MGR_TRANSPARENT_HINT`` | ``AUI_MGR_HINT_FADE`` | ``AUI_MGR_NO_VENETIAN_BLINDS_FADE`` + + :note: If using the ``AUI_MGR_USE_NATIVE_MINIFRAMES``, double-clicking on a + floating pane caption will not re-dock the pane, but simply maximize it (if + L{AuiPaneInfo.MaximizeButton} has been set to ``True``) or do nothing. + """ + + wx.EvtHandler.__init__(self) + + self._action = actionNone + self._action_window = None + self._hover_button = None + self._art = dockart.AuiDefaultDockArt() + self._hint_window = None + self._active_pane = None + self._has_maximized = False + self._has_minimized = False + + self._frame = None + self._dock_constraint_x = 0.3 + self._dock_constraint_y = 0.3 + self._reserved = None + + self._panes = [] + self._docks = [] + self._uiparts = [] + + self._guides = [] + self._notebooks = [] + + self._masterManager = None + self._currentDragItem = -1 + self._lastknowndocks = {} + + self._hint_fadetimer = wx.Timer(self, wx.ID_ANY) + self._hint_fademax = 50 + self._last_hint = wx.Rect() + + self._from_move = False + self._last_rect = wx.Rect() + + if agwFlags is None: + agwFlags = AUI_MGR_DEFAULT + + self._agwFlags = agwFlags + self._is_docked = (False, wx.RIGHT, wx.TOP, 0) + self._snap_limits = (15, 15) + + if wx.Platform == "__WXMSW__": + self._animation_step = 30.0 + else: + self._animation_step = 5.0 + + self._hint_rect = wx.Rect() + + self._preview_timer = wx.Timer(self, wx.ID_ANY) + self._sliding_frame = None + + self._autoNBTabArt = tabart.AuiDefaultTabArt() + self._autoNBStyle = AUI_NB_DEFAULT_STYLE | AUI_NB_BOTTOM | \ + AUI_NB_SUB_NOTEBOOK | AUI_NB_TAB_EXTERNAL_MOVE + self._autoNBStyle -= AUI_NB_DRAW_DND_TAB + + if managed_window: + self.SetManagedWindow(managed_window) + + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_SET_CURSOR, self.OnSetCursor) + self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) + self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick) + self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) + self.Bind(wx.EVT_MOTION, self.OnMotion) + self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) + self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocus) + self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnCaptureLost) + self.Bind(wx.EVT_TIMER, self.OnHintFadeTimer, self._hint_fadetimer) + self.Bind(wx.EVT_TIMER, self.SlideIn, self._preview_timer) + + self.Bind(wx.EVT_MOVE, self.OnMove) + self.Bind(wx.EVT_SYS_COLOUR_CHANGED, self.OnSysColourChanged) + + self.Bind(EVT_AUI_PANE_BUTTON, self.OnPaneButton) + self.Bind(EVT_AUI_RENDER, self.OnRender) + self.Bind(EVT_AUI_FIND_MANAGER, self.OnFindManager) + self.Bind(EVT_AUI_PANE_MIN_RESTORE, self.OnRestoreMinimizedPane) + self.Bind(EVT_AUI_PANE_DOCKED, self.OnPaneDocked) + + self.Bind(auibook.EVT_AUINOTEBOOK_BEGIN_DRAG, self.OnTabBeginDrag) + self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnTabPageClose) + self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnTabSelected) + + + def CreateFloatingFrame(self, parent, pane_info): + """ + Creates a floating frame for the windows. + + :param `parent`: the floating frame parent; + :param `pane_info`: the L{AuiPaneInfo} class with all the pane's information. + """ + + return AuiFloatingFrame(parent, self, pane_info) + + + def CanDockPanel(self, p): + """ + Returns whether a pane can be docked or not. + + :param `p`: the L{AuiPaneInfo} class with all the pane's information. + """ + + # is the pane dockable? + if not p.IsDockable(): + return False + + # if a key modifier is pressed while dragging the frame, + # don't dock the window + return not (wx.GetKeyState(wx.WXK_CONTROL) or wx.GetKeyState(wx.WXK_ALT)) + + + def GetPaneByWidget(self, window): + """ + This version of L{GetPane} looks up a pane based on a + 'pane window'. + + :param `window`: a `wx.Window` derived window. + + :see: L{GetPane} + """ + + for p in self._panes: + if p.window == window: + return p + + return NonePaneInfo + + + def GetPaneByName(self, name): + """ + This version of L{GetPane} looks up a pane based on a + 'pane name'. + + :param `name`: the pane name. + + :see: L{GetPane} + """ + + for p in self._panes: + if p.name == name: + return p + + return NonePaneInfo + + + def GetPane(self, item): + """ + Looks up a L{AuiPaneInfo} structure based + on the supplied window pointer. Upon failure, L{GetPane} + returns an empty L{AuiPaneInfo}, a condition which can be checked + by calling L{AuiPaneInfo.IsOk}. + + The pane info's structure may then be modified. Once a pane's + info is modified, L{Update} must be called to + realize the changes in the UI. + + :param `item`: either a pane name or a `wx.Window`. + """ + + if isinstance(item, basestring): + return self.GetPaneByName(item) + else: + return self.GetPaneByWidget(item) + + + def GetAllPanes(self): + """ Returns a reference to all the pane info structures. """ + + return self._panes + + + def ShowPane(self, window, show): + """ + Shows or hides a pane based on the window passed as input. + + :param `window`: a `wx.Window` derived window; + :param `show`: ``True`` to show the pane, ``False`` otherwise. + """ + + p = self.GetPane(window) + + if p.IsOk(): + if p.IsNotebookPage(): + if show: + + notebook = self._notebooks[p.notebook_id] + id = notebook.GetPageIndex(p.window) + if id >= 0: + notebook.SetSelection(id) + self.ShowPane(notebook, True) + + else: + p.Show(show) + + if p.frame: + p.frame.Raise() + + self.Update() + + + def HitTest(self, x, y): + """ + This is an internal function which determines + which UI item the specified coordinates are over. + + :param `x`: specifies a x position in client coordinates; + :param `y`: specifies a y position in client coordinates. + """ + + result = None + + for item in self._uiparts: + # we are not interested in typeDock, because this space + # isn't used to draw anything, just for measurements + # besides, the entire dock area is covered with other + # rectangles, which we are interested in. + if item.type == AuiDockUIPart.typeDock: + continue + + # if we already have a hit on a more specific item, we are not + # interested in a pane hit. If, however, we don't already have + # a hit, returning a pane hit is necessary for some operations + if item.type in [AuiDockUIPart.typePane, AuiDockUIPart.typePaneBorder] and result: + continue + + # if the point is inside the rectangle, we have a hit + if item.rect.Contains((x, y)): + result = item + + return result + + + def PaneHitTest(self, panes, pt): + """ + Similar to L{HitTest}, but it checks in which L{AuiPaneInfo} rectangle the + input point belongs to. + + :param `panes`: a list of L{AuiPaneInfo} instances; + :param `pt`: a `wx.Point` object. + """ + + for paneInfo in panes: + if paneInfo.IsDocked() and paneInfo.IsShown() and paneInfo.rect.Contains(pt): + return paneInfo + + return NonePaneInfo + + + # SetAGWFlags() and GetAGWFlags() allow the owner to set various + # options which are global to AuiManager + + def SetAGWFlags(self, agwFlags): + """ + This method is used to specify L{AuiManager}'s settings flags. + + :param `agwFlags`: specifies options which allow the frame management behavior + to be modified. `agwFlags` can be one of the following style bits: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_MGR_ALLOW_FLOATING`` Allow floating of panes + ``AUI_MGR_ALLOW_ACTIVE_PANE`` If a pane becomes active, "highlight" it in the interface + ``AUI_MGR_TRANSPARENT_DRAG`` If the platform supports it, set transparency on a floating pane while it is dragged by the user + ``AUI_MGR_TRANSPARENT_HINT`` If the platform supports it, show a transparent hint window when the user is about to dock a floating pane + ``AUI_MGR_VENETIAN_BLINDS_HINT`` Show a "venetian blind" effect when the user is about to dock a floating pane + ``AUI_MGR_RECTANGLE_HINT`` Show a rectangle hint effect when the user is about to dock a floating pane + ``AUI_MGR_HINT_FADE`` If the platform supports it, the hint window will fade in and out + ``AUI_MGR_NO_VENETIAN_BLINDS_FADE`` Disables the "venetian blind" fade in and out + ``AUI_MGR_LIVE_RESIZE`` Live resize when the user drag a sash + ``AUI_MGR_ANIMATE_FRAMES`` Fade-out floating panes when they are closed (all platforms which support frames transparency) and show a moving rectangle when they are docked (Windows < Vista and GTK only) + ``AUI_MGR_AERO_DOCKING_GUIDES`` Use the new Aero-style bitmaps as docking guides + ``AUI_MGR_PREVIEW_MINIMIZED_PANES`` Slide in and out minimized panes to preview them + ``AUI_MGR_WHIDBEY_DOCKING_GUIDES`` Use the new Whidbey-style bitmaps as docking guides + ``AUI_MGR_SMOOTH_DOCKING`` Performs a "smooth" docking of panes (a la PyQT) + ``AUI_MGR_USE_NATIVE_MINIFRAMES`` Use miniframes with native caption bar as floating panes instead or custom drawn caption bars (forced on wxMac) + ``AUI_MGR_AUTONB_NO_CAPTION`` Panes that merge into an automatic notebook will not have the pane caption visible + ==================================== ================================== + + :note: If using the ``AUI_MGR_USE_NATIVE_MINIFRAMES``, double-clicking on a + floating pane caption will not re-dock the pane, but simply maximize it (if + L{AuiPaneInfo.MaximizeButton} has been set to ``True``) or do nothing. + + """ + + self._agwFlags = agwFlags + + if len(self._guides) > 0: + self.CreateGuideWindows() + + if self._hint_window and agwFlags & AUI_MGR_RECTANGLE_HINT == 0: + self.CreateHintWindow() + + + def GetAGWFlags(self): + """ + Returns the current manager's flags. + + :see: L{SetAGWFlags} for a list of possible L{AuiManager} flags. + """ + + return self._agwFlags + + + def SetManagedWindow(self, managed_window): + """ + Called to specify the frame or window which is to be managed by L{AuiManager}. + Frame management is not restricted to just frames. Child windows or custom + controls are also allowed. + + :param `managed_window`: specifies the window which should be managed by + the AUI manager. + """ + + if not managed_window: + raise Exception("Specified managed window must be non-null. ") + + self._frame = managed_window + self._frame.PushEventHandler(self) + + # if the owner is going to manage an MDI parent frame, + # we need to add the MDI client window as the default + # center pane + + if isinstance(self._frame, wx.MDIParentFrame): + mdi_frame = self._frame + client_window = mdi_frame.GetClientWindow() + + if not client_window: + raise Exception("Client window is None!") + + self.AddPane(client_window, AuiPaneInfo().Name("mdiclient"). + CenterPane().PaneBorder(False)) + + elif isinstance(self._frame, tabmdi.AuiMDIParentFrame): + + mdi_frame = self._frame + client_window = mdi_frame.GetClientWindow() + + if not client_window: + raise Exception("Client window is None!") + + self.AddPane(client_window, AuiPaneInfo().Name("mdiclient"). + CenterPane().PaneBorder(False)) + + + def GetManagedWindow(self): + """ Returns the window being managed by L{AuiManager}. """ + + return self._frame + + + def SetFrame(self, managed_window): + """ + Called to specify the frame or window which is to be managed by L{AuiManager}. + Frame management is not restricted to just frames. Child windows or custom + controls are also allowed. + + :param `managed_window`: specifies the window which should be managed by + the AUI manager. + + :warning: This method is now deprecated, use L{SetManagedWindow} instead. + """ + + DeprecationWarning("This method is deprecated, use SetManagedWindow instead.") + return self.SetManagedWindow(managed_window) + + + def GetFrame(self): + """ + Returns the window being managed by L{AuiManager}. + + :warning: This method is now deprecated, use L{GetManagedWindow} instead. + """ + + DeprecationWarning("This method is deprecated, use GetManagedWindow instead.") + return self._frame + + + def CreateGuideWindows(self): + """ Creates the VS2005 HUD guide windows. """ + + self.DestroyGuideWindows() + + self._guides.append(AuiDockingGuideInfo().Left(). + Host(AuiSingleDockingGuide(self._frame, wx.LEFT))) + self._guides.append(AuiDockingGuideInfo().Top(). + Host(AuiSingleDockingGuide(self._frame, wx.TOP))) + self._guides.append(AuiDockingGuideInfo().Right(). + Host(AuiSingleDockingGuide(self._frame, wx.RIGHT))) + self._guides.append(AuiDockingGuideInfo().Bottom(). + Host(AuiSingleDockingGuide(self._frame, wx.BOTTOM))) + self._guides.append(AuiDockingGuideInfo().Centre(). + Host(AuiCenterDockingGuide(self._frame))) + + + def DestroyGuideWindows(self): + """ Destroys the VS2005 HUD guide windows. """ + + for guide in self._guides: + if guide.host: + guide.host.Destroy() + + self._guides = [] + + + def CreateHintWindow(self): + """ Creates the standard wxAUI hint window. """ + + self.DestroyHintWindow() + + self._hint_window = AuiDockingHintWindow(self._frame) + self._hint_window.SetBlindMode(self._agwFlags) + + + def DestroyHintWindow(self): + """ Destroys the standard wxAUI hint window. """ + + if self._hint_window: + + self._hint_window.Destroy() + self._hint_window = None + + + def UnInit(self): + """ + Uninitializes the framework and should be called before a managed frame or + window is destroyed. L{UnInit} is usually called in the managed `wx.Frame`/`wx.Window` + destructor. + + It is necessary to call this function before the managed frame or window is + destroyed, otherwise the manager cannot remove its custom event handlers + from a window. + """ + + if self._frame: + self._frame.RemoveEventHandler(self) + + + def GetArtProvider(self): + """ Returns the current art provider being used. """ + + return self._art + + + def ProcessMgrEvent(self, event): + """ + Process the AUI events sent to the manager. + + :param `event`: the event to process, an instance of L{AuiManagerEvent}. + """ + + # first, give the owner frame a chance to override + if self._frame: + if self._frame.GetEventHandler().ProcessEvent(event): + return + + self.ProcessEvent(event) + + + def FireEvent(self, evtType, pane, canVeto=False): + """ + Fires one of the ``EVT_AUI_PANE_FLOATED``/``FLOATING``/``DOCKING``/``DOCKED``/``ACTIVATED`` event. + + :param `evtType`: one of the aforementioned events; + :param `pane`: the L{AuiPaneInfo} instance associated to this event; + :param `canVeto`: whether the event can be vetoed or not. + """ + + event = AuiManagerEvent(evtType) + event.SetPane(pane) + event.SetCanVeto(canVeto) + self.ProcessMgrEvent(event) + + return event + + + def CanUseModernDockArt(self): + """ + Returns whether L{ModernDockArt} can be used (Windows XP / Vista / 7 only, + requires Mark Hammonds's `pywin32` package). + """ + + if not _winxptheme: + return False + + # Get the size of a small close button (themed) + hwnd = self._frame.GetHandle() + hTheme = winxptheme.OpenThemeData(hwnd, "Window") + + if not hTheme: + return False + + return True + + + def SetArtProvider(self, art_provider): + """ + Instructs L{AuiManager} to use art provider specified by the parameter + `art_provider` for all drawing calls. This allows plugable look-and-feel + features. + + :param `art_provider`: a AUI dock art provider. + + :note: The previous art provider object, if any, will be deleted by L{AuiManager}. + """ + + # delete the last art provider, if any + del self._art + + # assign the new art provider + self._art = art_provider + + for pane in self.GetAllPanes(): + if pane.IsFloating() and pane.frame: + pane.frame._mgr.SetArtProvider(art_provider) + pane.frame._mgr.Update() + + + def AddPane(self, window, arg1=None, arg2=None, target=None): + """ + Tells the frame manager to start managing a child window. There + are four versions of this function. The first verison allows the full spectrum + of pane parameter possibilities (L{AddPane1}). The second version is used for + simpler user interfaces which do not require as much configuration (L{AddPane2}). + The L{AddPane3} version allows a drop position to be specified, which will determine + where the pane will be added. The L{AddPane4} version allows to turn the target + L{AuiPaneInfo} pane into a notebook and the added pane into a page. + + In wxPython, simply call L{AddPane}. + + :param `window`: the child window to manage; + :param `arg1`: a L{AuiPaneInfo} or an integer value (direction); + :param `arg2`: a L{AuiPaneInfo} or a `wx.Point` (drop position); + :param `target`: a L{AuiPaneInfo} to be turned into a notebook + and new pane added to it as a page. (additionally, target can be any pane in + an existing notebook) + """ + + if target in self._panes: + return self.AddPane4(window, arg1, target) + + if type(arg1) == type(1): + # This Is Addpane2 + if arg1 is None: + arg1 = wx.LEFT + if arg2 is None: + arg2 = "" + return self.AddPane2(window, arg1, arg2) + else: + if isinstance(arg2, wx.Point): + return self.AddPane3(window, arg1, arg2) + else: + return self.AddPane1(window, arg1) + + + def AddPane1(self, window, pane_info): + """ See comments on L{AddPane}. """ + + # check if the pane has a valid window + if not window: + return False + + # check if the pane already exists + if self.GetPane(pane_info.window).IsOk(): + return False + + # check if the pane name already exists, this could reveal a + # bug in the library user's application + already_exists = False + if pane_info.name != "" and self.GetPane(pane_info.name).IsOk(): + warnings.warn("A pane with the name '%s' already exists in the manager!"%pane_info.name) + already_exists = True + + # if the new pane is docked then we should undo maximize + if pane_info.IsDocked(): + self.RestoreMaximizedPane() + + self._panes.append(pane_info) + pinfo = self._panes[-1] + + # set the pane window + pinfo.window = window + + # if the pane's name identifier is blank, create a random string + if pinfo.name == "" or already_exists: + pinfo.name = ("%s%08x%08x%08x")%(pinfo.window.GetName(), time.time(), + time.clock(), len(self._panes)) + + # set initial proportion (if not already set) + if pinfo.dock_proportion == 0: + pinfo.dock_proportion = 100000 + + floating = isinstance(self._frame, AuiFloatingFrame) + + pinfo.buttons = [] + + if not floating and pinfo.HasMinimizeButton(): + button = AuiPaneButton(AUI_BUTTON_MINIMIZE) + pinfo.buttons.append(button) + + if not floating and pinfo.HasMaximizeButton(): + button = AuiPaneButton(AUI_BUTTON_MAXIMIZE_RESTORE) + pinfo.buttons.append(button) + + if not floating and pinfo.HasPinButton(): + button = AuiPaneButton(AUI_BUTTON_PIN) + pinfo.buttons.append(button) + + if pinfo.HasCloseButton(): + button = AuiPaneButton(AUI_BUTTON_CLOSE) + pinfo.buttons.append(button) + + if pinfo.HasGripper(): + if isinstance(pinfo.window, auibar.AuiToolBar): + # prevent duplicate gripper -- both AuiManager and AuiToolBar + # have a gripper control. The toolbar's built-in gripper + # meshes better with the look and feel of the control than ours, + # so turn AuiManager's gripper off, and the toolbar's on. + + tb = pinfo.window + pinfo.SetFlag(AuiPaneInfo.optionGripper, False) + tb.SetGripperVisible(True) + + if pinfo.window: + if pinfo.best_size == wx.Size(-1, -1): + pinfo.best_size = pinfo.window.GetClientSize() + + if isinstance(pinfo.window, wx.ToolBar): + # GetClientSize() doesn't get the best size for + # a toolbar under some newer versions of wxWidgets, + # so use GetBestSize() + pinfo.best_size = pinfo.window.GetBestSize() + + # this is needed for Win2000 to correctly fill toolbar backround + # it should probably be repeated once system colour change happens + if wx.Platform == "__WXMSW__" and pinfo.window.UseBgCol(): + pinfo.window.SetBackgroundColour(self.GetArtProvider().GetColour(AUI_DOCKART_BACKGROUND_COLOUR)) + + if pinfo.min_size != wx.Size(-1, -1): + if pinfo.best_size.x < pinfo.min_size.x: + pinfo.best_size.x = pinfo.min_size.x + if pinfo.best_size.y < pinfo.min_size.y: + pinfo.best_size.y = pinfo.min_size.y + + self._panes[-1] = pinfo + if isinstance(window, auibar.AuiToolBar): + window.SetAuiManager(self) + + return True + + + def AddPane2(self, window, direction, caption): + """ See comments on L{AddPane}. """ + + pinfo = AuiPaneInfo() + pinfo.Caption(caption) + + if direction == wx.TOP: + pinfo.Top() + elif direction == wx.BOTTOM: + pinfo.Bottom() + elif direction == wx.LEFT: + pinfo.Left() + elif direction == wx.RIGHT: + pinfo.Right() + elif direction == wx.CENTER: + pinfo.CenterPane() + + return self.AddPane(window, pinfo) + + + def AddPane3(self, window, pane_info, drop_pos): + """ See comments on L{AddPane}. """ + + if not self.AddPane(window, pane_info): + return False + + pane = self.GetPane(window) + indx = self._panes.index(pane) + + ret, pane = self.DoDrop(self._docks, self._panes, pane, drop_pos, wx.Point(0, 0)) + self._panes[indx] = pane + + return True + + + def AddPane4(self, window, pane_info, target): + """ See comments on L{AddPane}. """ + + if not self.AddPane(window, pane_info): + return False + + paneInfo = self.GetPane(window) + + if not paneInfo.IsNotebookDockable(): + return self.AddPane1(window, pane_info) + if not target.IsNotebookDockable() and not target.IsNotebookControl(): + return self.AddPane1(window, pane_info) + + if not target.HasNotebook(): + self.CreateNotebookBase(self._panes, target) + + # Add new item to notebook + paneInfo.NotebookPage(target.notebook_id) + + # we also want to remove our captions sometimes + self.RemoveAutoNBCaption(paneInfo) + self.UpdateNotebook() + + return True + + + def InsertPane(self, window, pane_info, insert_level=AUI_INSERT_PANE): + """ + This method is used to insert either a previously unmanaged pane window + into the frame manager, or to insert a currently managed pane somewhere else. + L{InsertPane} will push all panes, rows, or docks aside and insert the window + into the position specified by `pane_info`. + + Because `pane_info` can specify either a pane, dock row, or dock layer, the + `insert_level` parameter is used to disambiguate this. The parameter `insert_level` + can take a value of ``AUI_INSERT_PANE``, ``AUI_INSERT_ROW`` or ``AUI_INSERT_DOCK``. + + :param `window`: the window to be inserted and managed; + :param `pane_info`: the insert location for the new window; + :param `insert_level`: the insertion level of the new pane. + """ + + if not window: + raise Exception("Invalid window passed to InsertPane.") + + # shift the panes around, depending on the insert level + if insert_level == AUI_INSERT_PANE: + self._panes = DoInsertPane(self._panes, pane_info.dock_direction, + pane_info.dock_layer, pane_info.dock_row, + pane_info.dock_pos) + + elif insert_level == AUI_INSERT_ROW: + self._panes = DoInsertDockRow(self._panes, pane_info.dock_direction, + pane_info.dock_layer, pane_info.dock_row) + + elif insert_level == AUI_INSERT_DOCK: + self._panes = DoInsertDockLayer(self._panes, pane_info.dock_direction, + pane_info.dock_layer) + + # if the window already exists, we are basically just moving/inserting the + # existing window. If it doesn't exist, we need to add it and insert it + existing_pane = self.GetPane(window) + indx = self._panes.index(existing_pane) + + if not existing_pane.IsOk(): + + return self.AddPane(window, pane_info) + + else: + + if pane_info.IsFloating(): + existing_pane.Float() + if pane_info.floating_pos != wx.Point(-1, -1): + existing_pane.FloatingPosition(pane_info.floating_pos) + if pane_info.floating_size != wx.Size(-1, -1): + existing_pane.FloatingSize(pane_info.floating_size) + else: + # if the new pane is docked then we should undo maximize + self.RestoreMaximizedPane() + + existing_pane.Direction(pane_info.dock_direction) + existing_pane.Layer(pane_info.dock_layer) + existing_pane.Row(pane_info.dock_row) + existing_pane.Position(pane_info.dock_pos) + + self._panes[indx] = existing_pane + + return True + + + def DetachPane(self, window): + """ + Tells the L{AuiManager} to stop managing the pane specified + by `window`. The window, if in a floated frame, is reparented to the frame + managed by L{AuiManager}. + + :param `window`: the window to be un-managed. + """ + + for p in self._panes: + if p.window == window: + if p.frame: + # we have a floating frame which is being detached. We need to + # reparent it to self._frame and destroy the floating frame + + # reduce flicker + p.window.SetSize((1, 1)) + if p.frame.IsShown(): + p.frame.Show(False) + + if self._action_window == p.frame: + self._action_window = None + + # reparent to self._frame and destroy the pane + p.window.Reparent(self._frame) + p.frame.SetSizer(None) + p.frame.Destroy() + p.frame = None + + elif p.IsNotebookPage(): + notebook = self._notebooks[p.notebook_id] + id = notebook.GetPageIndex(p.window) + notebook.RemovePage(id) + + # make sure there are no references to this pane in our uiparts, + # just in case the caller doesn't call Update() immediately after + # the DetachPane() call. This prevets obscure crashes which would + # happen at window repaint if the caller forgets to call Update() + counter = 0 + for pi in xrange(len(self._uiparts)): + part = self._uiparts[counter] + if part.pane == p: + self._uiparts.pop(counter) + counter -= 1 + + counter += 1 + + self._panes.remove(p) + return True + + return False + + + def ClosePane(self, pane_info): + """ + Destroys or hides the pane depending on its flags. + + :param `pane_info`: a L{AuiPaneInfo} instance. + """ + + # if we were maximized, restore + if pane_info.IsMaximized(): + self.RestorePane(pane_info) + + if pane_info.frame: + if self._agwFlags & AUI_MGR_ANIMATE_FRAMES: + pane_info.frame.FadeOut() + + # first, hide the window + if pane_info.window and pane_info.window.IsShown(): + pane_info.window.Show(False) + + # make sure that we are the parent of this window + if pane_info.window and pane_info.window.GetParent() != self._frame: + pane_info.window.Reparent(self._frame) + + # if we have a frame, destroy it + if pane_info.frame: + pane_info.frame.Destroy() + pane_info.frame = None + + elif pane_info.IsNotebookPage(): + # if we are a notebook page, remove ourselves... + # the code would index out of bounds + # if the last page of a sub-notebook was closed + # because the notebook would be deleted, before this + # code is executed. + # This code just prevents an out-of bounds error. + if self._notebooks: + nid = pane_info.notebook_id + if nid >= 0 and nid < len(self._notebooks): + notebook = self._notebooks[nid] + page_idx = notebook.GetPageIndex(pane_info.window) + if page_idx >= 0: + notebook.RemovePage(page_idx) + + # now we need to either destroy or hide the pane + to_destroy = 0 + if pane_info.IsDestroyOnClose(): + to_destroy = pane_info.window + self.DetachPane(to_destroy) + else: + if isinstance(pane_info.window, auibar.AuiToolBar) and pane_info.IsFloating(): + tb = pane_info.window + if pane_info.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT]: + tb.SetAGWWindowStyleFlag(tb.GetAGWWindowStyleFlag() | AUI_TB_VERTICAL) + + pane_info.Dock().Hide() + + if pane_info.IsNotebookControl(): + + notebook = self._notebooks[pane_info.notebook_id] + while notebook.GetPageCount(): + window = notebook.GetPage(0) + notebook.RemovePage(0) + info = self.GetPane(window) + if info.IsOk(): + info.notebook_id = -1 + info.dock_direction = AUI_DOCK_NONE + # Note: this could change our paneInfo reference ... + self.ClosePane(info) + + if to_destroy: + to_destroy.Destroy() + + + def MaximizePane(self, pane_info, savesizes=True): + """ + Maximizes the input pane. + + :param `pane_info`: a L{AuiPaneInfo} instance. + :param `savesizes`: whether to save previous dock sizes. + """ + + if savesizes: + self.SavePreviousDockSizes(pane_info) + + for p in self._panes: + + # save hidden state + p.SetFlag(p.savedHiddenState, p.HasFlag(p.optionHidden)) + + if not p.IsToolbar() and not p.IsFloating(): + p.Restore() + + # hide the pane, because only the newly + # maximized pane should show + p.Hide() + + pane_info.previousDockPos = pane_info.dock_pos + + # mark ourselves maximized + pane_info.Maximize() + pane_info.Show() + self._has_maximized = True + + # last, show the window + if pane_info.window and not pane_info.window.IsShown(): + pane_info.window.Show(True) + + + def SavePreviousDockSizes(self, pane_info): + """ + Stores the previous dock sizes, to be used in a "restore" action later. + + :param `pane_info`: a L{AuiPaneInfo} instance. + """ + + for d in self._docks: + if not d.toolbar: + for p in d.panes: + p.previousDockSize = d.size + if pane_info is not p: + p.SetFlag(p.needsRestore, True) + + + def RestorePane(self, pane_info): + """ + Restores the input pane from a previous maximized or minimized state. + + :param `pane_info`: a L{AuiPaneInfo} instance. + """ + + # restore all the panes + for p in self._panes: + if not p.IsToolbar(): + p.SetFlag(p.optionHidden, p.HasFlag(p.savedHiddenState)) + + pane_info.SetFlag(pane_info.needsRestore, True) + + # mark ourselves non-maximized + pane_info.Restore() + self._has_maximized = False + self._has_minimized = False + + # last, show the window + if pane_info.window and not pane_info.window.IsShown(): + pane_info.window.Show(True) + + + def RestoreMaximizedPane(self): + """ Restores the current maximized pane (if any). """ + + # restore all the panes + for p in self._panes: + if p.IsMaximized(): + self.RestorePane(p) + break + + + def ActivatePane(self, window): + """ + Activates the pane to which `window` is associated. + + :param `window`: a `wx.Window` derived window. + """ + + if self.GetAGWFlags() & AUI_MGR_ALLOW_ACTIVE_PANE: + while window: + ret, self._panes = SetActivePane(self._panes, window) + if ret: + break + + window = window.GetParent() + + self.RefreshCaptions() + self.FireEvent(wxEVT_AUI_PANE_ACTIVATED, window, canVeto=False) + + + def CreateNotebook(self): + """ + Creates an automatic L{AuiNotebook} when a pane is docked on + top of another pane. + """ + + notebook = auibook.AuiNotebook(self._frame, -1, wx.Point(0, 0), wx.Size(0, 0), agwStyle=self._autoNBStyle) + + # This is so we can get the tab-drag event. + notebook.GetAuiManager().SetMasterManager(self) + notebook.SetArtProvider(self._autoNBTabArt.Clone()) + self._notebooks.append(notebook) + + return notebook + + + def SetAutoNotebookTabArt(self, art): + """ + Sets the default tab art provider for automatic notebooks. + + :param `art`: a tab art provider. + """ + + for nb in self._notebooks: + nb.SetArtProvider(art.Clone()) + nb.Refresh() + nb.Update() + + self._autoNBTabArt = art + + + def GetAutoNotebookTabArt(self): + """ Returns the default tab art provider for automatic notebooks. """ + + return self._autoNBTabArt + + + def SetAutoNotebookStyle(self, agwStyle): + """ + Sets the default AGW-specific window style for automatic notebooks. + + :param `agwStyle`: the underlying L{AuiNotebook} window style. + This can be a combination of the following bits: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook + ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. + ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. + ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook + ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab + ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging + ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control + ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width + ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed + ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available + ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar + ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab + ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs + ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click + ``AUI_NB_SUB_NOTEBOOK`` This style is used by {AuiManager} to create automatic AuiNotebooks + ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present + ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows + ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items + ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) + ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages + ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) + ==================================== ================================== + + """ + + for nb in self._notebooks: + nb.SetAGWWindowStyleFlag(agwStyle) + nb.Refresh() + nb.Update() + + self._autoNBStyle = agwStyle + + + def GetAutoNotebookStyle(self): + """ + Returns the default AGW-specific window style for automatic notebooks. + + :see: L{SetAutoNotebookStyle} method for a list of possible styles. + """ + + return self._autoNBStyle + + + def SavePaneInfo(self, pane): + """ + This method is similar to L{SavePerspective}, with the exception + that it only saves information about a single pane. It is used in + combination with L{LoadPaneInfo}. + + :param `pane`: a L{AuiPaneInfo} instance to save. + """ + + result = "name=" + EscapeDelimiters(pane.name) + ";" + result += "caption=" + EscapeDelimiters(pane.caption) + ";" + + result += "state=%u;"%pane.state + result += "dir=%d;"%pane.dock_direction + result += "layer=%d;"%pane.dock_layer + result += "row=%d;"%pane.dock_row + result += "pos=%d;"%pane.dock_pos + result += "prop=%d;"%pane.dock_proportion + result += "bestw=%d;"%pane.best_size.x + result += "besth=%d;"%pane.best_size.y + result += "minw=%d;"%pane.min_size.x + result += "minh=%d;"%pane.min_size.y + result += "maxw=%d;"%pane.max_size.x + result += "maxh=%d;"%pane.max_size.y + result += "floatx=%d;"%pane.floating_pos.x + result += "floaty=%d;"%pane.floating_pos.y + result += "floatw=%d;"%pane.floating_size.x + result += "floath=%d;"%pane.floating_size.y + result += "notebookid=%d;"%pane.notebook_id + result += "transparent=%d"%pane.transparent + + return result + + + def LoadPaneInfo(self, pane_part, pane): + """ + This method is similar to to L{LoadPerspective}, with the exception that + it only loads information about a single pane. It is used in combination + with L{SavePaneInfo}. + + :param `pane_part`: the string to analyze; + :param `pane`: the L{AuiPaneInfo} structure in which to load `pane_part`. + """ + + # replace escaped characters so we can + # split up the string easily + pane_part = pane_part.replace("\\|", "\a") + pane_part = pane_part.replace("\\;", "\b") + + options = pane_part.split(";") + for items in options: + + val_name, value = items.split("=") + val_name = val_name.strip() + + if val_name == "name": + pane.name = value + elif val_name == "caption": + pane.caption = value + elif val_name == "state": + pane.state = int(value) + elif val_name == "dir": + pane.dock_direction = int(value) + elif val_name == "layer": + pane.dock_layer = int(value) + elif val_name == "row": + pane.dock_row = int(value) + elif val_name == "pos": + pane.dock_pos = int(value) + elif val_name == "prop": + pane.dock_proportion = int(value) + elif val_name == "bestw": + pane.best_size.x = int(value) + elif val_name == "besth": + pane.best_size.y = int(value) + pane.best_size = wx.Size(pane.best_size.x, pane.best_size.y) + elif val_name == "minw": + pane.min_size.x = int(value) + elif val_name == "minh": + pane.min_size.y = int(value) + pane.min_size = wx.Size(pane.min_size.x, pane.min_size.y) + elif val_name == "maxw": + pane.max_size.x = int(value) + elif val_name == "maxh": + pane.max_size.y = int(value) + pane.max_size = wx.Size(pane.max_size.x, pane.max_size.y) + elif val_name == "floatx": + pane.floating_pos.x = int(value) + elif val_name == "floaty": + pane.floating_pos.y = int(value) + pane.floating_pos = wx.Point(pane.floating_pos.x, pane.floating_pos.y) + elif val_name == "floatw": + pane.floating_size.x = int(value) + elif val_name == "floath": + pane.floating_size.y = int(value) + pane.floating_size = wx.Size(pane.floating_size.x, pane.floating_size.y) + elif val_name == "notebookid": + pane.notebook_id = int(value) + elif val_name == "transparent": + pane.transparent = int(value) + else: + raise Exception("Bad perspective string") + + # replace escaped characters so we can + # split up the string easily + pane.name = pane.name.replace("\a", "|") + pane.name = pane.name.replace("\b", ";") + pane.caption = pane.caption.replace("\a", "|") + pane.caption = pane.caption.replace("\b", ";") + pane_part = pane_part.replace("\a", "|") + pane_part = pane_part.replace("\b", ";") + + return pane + + + def SavePerspective(self): + """ + Saves the entire user interface layout into an encoded string, which can then + be stored by the application (probably using `wx.Config`). + + When a perspective is restored using L{LoadPerspective}, the entire user + interface will return to the state it was when the perspective was saved. + """ + + result = "layout2|" + + for pane in self._panes: + result += self.SavePaneInfo(pane) + "|" + + for dock in self._docks: + result = result + ("dock_size(%d,%d,%d)=%d|")%(dock.dock_direction, + dock.dock_layer, + dock.dock_row, + dock.size) + return result + + + def LoadPerspective(self, layout, update=True): + """ + Loads a layout which was saved with L{SavePerspective}. + + If the `update` flag parameter is ``True``, L{Update} will be + automatically invoked, thus realizing the saved perspective on screen. + + :param `layout`: a string which contains a saved AUI layout; + :param `update`: whether to update immediately the window or not. + """ + + input = layout + + # check layout string version + # 'layout1' = wxAUI 0.9.0 - wxAUI 0.9.2 + # 'layout2' = wxAUI 0.9.2 (wxWidgets 2.8) + index = input.find("|") + part = input[0:index].strip() + input = input[index+1:] + + if part != "layout2": + return False + + # mark all panes currently managed as docked and hidden + for pane in self._panes: + pane.Dock().Hide() + + # clear out the dock array; this will be reconstructed + self._docks = [] + + # replace escaped characters so we can + # split up the string easily + input = input.replace("\\|", "\a") + input = input.replace("\\;", "\b") + + while 1: + + pane = AuiPaneInfo() + index = input.find("|") + pane_part = input[0:index].strip() + input = input[index+1:] + + # if the string is empty, we're done parsing + if pane_part == "": + break + + if pane_part[0:9] == "dock_size": + index = pane_part.find("=") + val_name = pane_part[0:index] + value = pane_part[index+1:] + + index = val_name.find("(") + piece = val_name[index+1:] + index = piece.find(")") + piece = piece[0:index] + + vals = piece.split(",") + dir = int(vals[0]) + layer = int(vals[1]) + row = int(vals[2]) + size = int(value) + + dock = AuiDockInfo() + dock.dock_direction = dir + dock.dock_layer = layer + dock.dock_row = row + dock.size = size + self._docks.append(dock) + + continue + + # Undo our escaping as LoadPaneInfo needs to take an unescaped + # name so it can be called by external callers + pane_part = pane_part.replace("\a", "|") + pane_part = pane_part.replace("\b", ";") + + pane = self.LoadPaneInfo(pane_part, pane) + + p = self.GetPane(pane.name) + + if not p.IsOk(): + if pane.IsNotebookControl(): + # notebook controls - auto add... + self._panes.append(pane) + indx = self._panes.index(pane) + else: + # the pane window couldn't be found + # in the existing layout -- skip it + continue + + else: + indx = self._panes.index(p) + pane.window = p.window + pane.frame = p.frame + pane.buttons = p.buttons + self._panes[indx] = pane + + if isinstance(pane.window, auibar.AuiToolBar) and (pane.IsFloatable() or pane.IsDockable()): + pane.window.SetGripperVisible(True) + + if update: + self.Update() + + return True + + + def GetPanePositionsAndSizes(self, dock): + """ + Returns all the panes positions and sizes in a dock. + + :param `dock`: a L{AuiDockInfo} instance. + """ + + caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) + gripper_size = self._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) + + positions = [] + sizes = [] + + action_pane = -1 + pane_count = len(dock.panes) + + # find the pane marked as our action pane + for pane_i in xrange(pane_count): + pane = dock.panes[pane_i] + if pane.HasFlag(AuiPaneInfo.actionPane): + if action_pane != -1: + raise Exception("Too many action panes!") + action_pane = pane_i + + # set up each panes default position, and + # determine the size (width or height, depending + # on the dock's orientation) of each pane + for pane in dock.panes: + positions.append(pane.dock_pos) + size = 0 + + if pane.HasBorder(): + size += pane_border_size*2 + + if dock.IsHorizontal(): + if pane.HasGripper() and not pane.HasGripperTop(): + size += gripper_size + + if pane.HasCaptionLeft(): + size += caption_size + + size += pane.best_size.x + + else: + if pane.HasGripper() and pane.HasGripperTop(): + size += gripper_size + + if pane.HasCaption() and not pane.HasCaptionLeft(): + size += caption_size + + size += pane.best_size.y + + sizes.append(size) + + # if there is no action pane, just return the default + # positions (as specified in pane.pane_pos) + if action_pane == -1: + return positions, sizes + + offset = 0 + for pane_i in xrange(action_pane-1, -1, -1): + amount = positions[pane_i+1] - (positions[pane_i] + sizes[pane_i]) + if amount >= 0: + offset += amount + else: + positions[pane_i] -= -amount + + offset += sizes[pane_i] + + # if the dock mode is fixed, make sure none of the panes + # overlap we will bump panes that overlap + offset = 0 + for pane_i in xrange(action_pane, pane_count): + amount = positions[pane_i] - offset + if amount >= 0: + offset += amount + else: + positions[pane_i] += -amount + + offset += sizes[pane_i] + + return positions, sizes + + + def LayoutAddPane(self, cont, dock, pane, uiparts, spacer_only): + """ + Adds a pane into the existing layout (in an existing dock). + + :param `cont`: a `wx.Sizer` object; + :param `dock`: the L{AuiDockInfo} structure in which to add the pane; + :param `pane`: the L{AuiPaneInfo} instance to add to the dock; + :param `uiparts`: a list of UI parts in the interface; + :param `spacer_only`: whether to add a simple spacer or a real window. + """ + + sizer_item = wx.SizerItem() + caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + gripper_size = self._art.GetMetric(AUI_DOCKART_GRIPPER_SIZE) + pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) + pane_button_size = self._art.GetMetric(AUI_DOCKART_PANE_BUTTON_SIZE) + + # find out the orientation of the item (orientation for panes + # is the same as the dock's orientation) + + if dock.IsHorizontal(): + orientation = wx.HORIZONTAL + else: + orientation = wx.VERTICAL + + # this variable will store the proportion + # value that the pane will receive + pane_proportion = pane.dock_proportion + + horz_pane_sizer = wx.BoxSizer(wx.HORIZONTAL) + vert_pane_sizer = wx.BoxSizer(wx.VERTICAL) + + if pane.HasGripper(): + + part = AuiDockUIPart() + if pane.HasGripperTop(): + sizer_item = vert_pane_sizer.Add((1, gripper_size), 0, wx.EXPAND) + else: + sizer_item = horz_pane_sizer.Add((gripper_size, 1), 0, wx.EXPAND) + + part.type = AuiDockUIPart.typeGripper + part.dock = dock + part.pane = pane + part.button = None + part.orientation = orientation + part.cont_sizer = horz_pane_sizer + part.sizer_item = sizer_item + uiparts.append(part) + + button_count = len(pane.buttons) + button_width_total = button_count*pane_button_size + if button_count >= 1: + button_width_total += 3 + + caption, captionLeft = pane.HasCaption(), pane.HasCaptionLeft() + button_count = len(pane.buttons) + + if captionLeft: + caption_sizer = wx.BoxSizer(wx.VERTICAL) + + # add pane buttons to the caption + dummy_parts = [] + for btn_id in xrange(len(pane.buttons)-1, -1, -1): + sizer_item = caption_sizer.Add((caption_size, pane_button_size), 0, wx.EXPAND) + part = AuiDockUIPart() + part.type = AuiDockUIPart.typePaneButton + part.dock = dock + part.pane = pane + part.button = pane.buttons[btn_id] + part.orientation = orientation + part.cont_sizer = caption_sizer + part.sizer_item = sizer_item + dummy_parts.append(part) + + sizer_item = caption_sizer.Add((caption_size, 1), 1, wx.EXPAND) + vert_pane_sizer = wx.BoxSizer(wx.HORIZONTAL) + + # create the caption sizer + part = AuiDockUIPart() + + part.type = AuiDockUIPart.typeCaption + part.dock = dock + part.pane = pane + part.button = None + part.orientation = orientation + part.cont_sizer = vert_pane_sizer + part.sizer_item = sizer_item + caption_part_idx = len(uiparts) + uiparts.append(part) + uiparts.extend(dummy_parts) + + elif caption: + + caption_sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer_item = caption_sizer.Add((1, caption_size), 1, wx.EXPAND) + + # create the caption sizer + part = AuiDockUIPart() + + part.type = AuiDockUIPart.typeCaption + part.dock = dock + part.pane = pane + part.button = None + part.orientation = orientation + part.cont_sizer = vert_pane_sizer + part.sizer_item = sizer_item + caption_part_idx = len(uiparts) + uiparts.append(part) + + # add pane buttons to the caption + for button in pane.buttons: + sizer_item = caption_sizer.Add((pane_button_size, caption_size), 0, wx.EXPAND) + part = AuiDockUIPart() + part.type = AuiDockUIPart.typePaneButton + part.dock = dock + part.pane = pane + part.button = button + part.orientation = orientation + part.cont_sizer = caption_sizer + part.sizer_item = sizer_item + uiparts.append(part) + + if caption or captionLeft: + # if we have buttons, add a little space to the right + # of them to ease visual crowding + if button_count >= 1: + if captionLeft: + caption_sizer.Add((caption_size, 3), 0, wx.EXPAND) + else: + caption_sizer.Add((3, caption_size), 0, wx.EXPAND) + + # add the caption sizer + sizer_item = vert_pane_sizer.Add(caption_sizer, 0, wx.EXPAND) + uiparts[caption_part_idx].sizer_item = sizer_item + + # add the pane window itself + if spacer_only or not pane.window: + sizer_item = vert_pane_sizer.Add((1, 1), 1, wx.EXPAND) + else: + sizer_item = vert_pane_sizer.Add(pane.window, 1, wx.EXPAND) + vert_pane_sizer.SetItemMinSize(pane.window, (1, 1)) + + part = AuiDockUIPart() + part.type = AuiDockUIPart.typePane + part.dock = dock + part.pane = pane + part.button = None + part.orientation = orientation + part.cont_sizer = vert_pane_sizer + part.sizer_item = sizer_item + uiparts.append(part) + + # determine if the pane should have a minimum size if the pane is + # non-resizable (fixed) then we must set a minimum size. Alternatively, + # if the pane.min_size is set, we must use that value as well + + min_size = pane.min_size + if pane.IsFixed(): + if min_size == wx.Size(-1, -1): + min_size = pane.best_size + pane_proportion = 0 + + if min_size != wx.Size(-1, -1): + vert_pane_sizer.SetItemMinSize(len(vert_pane_sizer.GetChildren())-1, (min_size.x, min_size.y)) + + # add the vertical/horizontal sizer (caption, pane window) to the + # horizontal sizer (gripper, vertical sizer) + horz_pane_sizer.Add(vert_pane_sizer, 1, wx.EXPAND) + + # finally, add the pane sizer to the dock sizer + if pane.HasBorder(): + # allowing space for the pane's border + sizer_item = cont.Add(horz_pane_sizer, pane_proportion, + wx.EXPAND | wx.ALL, pane_border_size) + part = AuiDockUIPart() + part.type = AuiDockUIPart.typePaneBorder + part.dock = dock + part.pane = pane + part.button = None + part.orientation = orientation + part.cont_sizer = cont + part.sizer_item = sizer_item + uiparts.append(part) + else: + sizer_item = cont.Add(horz_pane_sizer, pane_proportion, wx.EXPAND) + + return uiparts + + + def LayoutAddDock(self, cont, dock, uiparts, spacer_only): + """ + Adds a dock into the existing layout. + + :param `cont`: a `wx.Sizer` object; + :param `dock`: the L{AuiDockInfo} structure to add to the layout; + :param `uiparts`: a list of UI parts in the interface; + :param `spacer_only`: whether to add a simple spacer or a real window. + """ + + sizer_item = wx.SizerItem() + part = AuiDockUIPart() + + sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) + orientation = (dock.IsHorizontal() and [wx.HORIZONTAL] or [wx.VERTICAL])[0] + + # resizable bottom and right docks have a sash before them + if not self._has_maximized and not dock.fixed and \ + dock.dock_direction in [AUI_DOCK_BOTTOM, AUI_DOCK_RIGHT]: + + sizer_item = cont.Add((sash_size, sash_size), 0, wx.EXPAND) + + part.type = AuiDockUIPart.typeDockSizer + part.orientation = orientation + part.dock = dock + part.pane = None + part.button = None + part.cont_sizer = cont + part.sizer_item = sizer_item + uiparts.append(part) + + # create the sizer for the dock + dock_sizer = wx.BoxSizer(orientation) + + # add each pane to the dock + has_maximized_pane = False + pane_count = len(dock.panes) + + if dock.fixed: + + # figure out the real pane positions we will + # use, without modifying the each pane's pane_pos member + pane_positions, pane_sizes = self.GetPanePositionsAndSizes(dock) + + offset = 0 + for pane_i in xrange(pane_count): + + pane = dock.panes[pane_i] + pane_pos = pane_positions[pane_i] + + if pane.IsMaximized(): + has_maximized_pane = True + + amount = pane_pos - offset + if amount > 0: + + if dock.IsVertical(): + sizer_item = dock_sizer.Add((1, amount), 0, wx.EXPAND) + else: + sizer_item = dock_sizer.Add((amount, 1), 0, wx.EXPAND) + + part = AuiDockUIPart() + part.type = AuiDockUIPart.typeBackground + part.dock = dock + part.pane = None + part.button = None + part.orientation = (orientation==wx.HORIZONTAL and \ + [wx.VERTICAL] or [wx.HORIZONTAL])[0] + part.cont_sizer = dock_sizer + part.sizer_item = sizer_item + uiparts.append(part) + + offset = offset + amount + + uiparts = self.LayoutAddPane(dock_sizer, dock, pane, uiparts, spacer_only) + + offset = offset + pane_sizes[pane_i] + + # at the end add a very small stretchable background area + sizer_item = dock_sizer.Add((0, 0), 1, wx.EXPAND) + part = AuiDockUIPart() + part.type = AuiDockUIPart.typeBackground + part.dock = dock + part.pane = None + part.button = None + part.orientation = orientation + part.cont_sizer = dock_sizer + part.sizer_item = sizer_item + uiparts.append(part) + + else: + + for pane_i in xrange(pane_count): + + pane = dock.panes[pane_i] + + if pane.IsMaximized(): + has_maximized_pane = True + + # if this is not the first pane being added, + # we need to add a pane sizer + if not self._has_maximized and pane_i > 0: + sizer_item = dock_sizer.Add((sash_size, sash_size), 0, wx.EXPAND) + part = AuiDockUIPart() + part.type = AuiDockUIPart.typePaneSizer + part.dock = dock + part.pane = dock.panes[pane_i-1] + part.button = None + part.orientation = (orientation==wx.HORIZONTAL and \ + [wx.VERTICAL] or [wx.HORIZONTAL])[0] + part.cont_sizer = dock_sizer + part.sizer_item = sizer_item + uiparts.append(part) + + uiparts = self.LayoutAddPane(dock_sizer, dock, pane, uiparts, spacer_only) + + if dock.dock_direction == AUI_DOCK_CENTER or has_maximized_pane: + sizer_item = cont.Add(dock_sizer, 1, wx.EXPAND) + else: + sizer_item = cont.Add(dock_sizer, 0, wx.EXPAND) + + part = AuiDockUIPart() + part.type = AuiDockUIPart.typeDock + part.dock = dock + part.pane = None + part.button = None + part.orientation = orientation + part.cont_sizer = cont + part.sizer_item = sizer_item + uiparts.append(part) + + if dock.IsHorizontal(): + cont.SetItemMinSize(dock_sizer, (0, dock.size)) + else: + cont.SetItemMinSize(dock_sizer, (dock.size, 0)) + + # top and left docks have a sash after them + if not self._has_maximized and not dock.fixed and \ + dock.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_LEFT]: + + sizer_item = cont.Add((sash_size, sash_size), 0, wx.EXPAND) + + part = AuiDockUIPart() + part.type = AuiDockUIPart.typeDockSizer + part.dock = dock + part.pane = None + part.button = None + part.orientation = orientation + part.cont_sizer = cont + part.sizer_item = sizer_item + uiparts.append(part) + + return uiparts + + + def LayoutAll(self, panes, docks, uiparts, spacer_only=False, oncheck=True): + """ + Layouts all the UI structures in the interface. + + :param `panes`: a list of L{AuiPaneInfo} instances; + :param `docks`: a list of L{AuiDockInfo} classes; + :param `uiparts`: a list of UI parts in the interface; + :param `spacer_only`: whether to add a simple spacer or a real window; + :param `oncheck`: whether to store the results in a class member or not. + """ + + container = wx.BoxSizer(wx.VERTICAL) + + pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) + caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + cli_size = self._frame.GetClientSize() + + # empty all docks out + for dock in docks: + dock.panes = [] + if dock.fixed: + # always reset fixed docks' sizes, because + # the contained windows may have been resized + dock.size = 0 + + dock_count = len(docks) + + # iterate through all known panes, filing each + # of them into the appropriate dock. If the + # pane does not exist in the dock, add it + for p in panes: + + # don't layout hidden panes. + if p.IsShown(): + + # find any docks with the same dock direction, dock layer, and + # dock row as the pane we are working on + arr = FindDocks(docks, p.dock_direction, p.dock_layer, p.dock_row) + + if arr: + dock = arr[0] + + else: + # dock was not found, so we need to create a new one + d = AuiDockInfo() + d.dock_direction = p.dock_direction + d.dock_layer = p.dock_layer + d.dock_row = p.dock_row + docks.append(d) + dock = docks[-1] + + if p.HasFlag(p.needsRestore) and not p.HasFlag(p.wasMaximized): + + isHor = dock.IsHorizontal() + sashSize = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) + + # get the sizes of any docks that might + # overlap with our restored dock + + # make list of widths or heights from the size in the dock rects + sizes = [d.rect[2:][isHor] for \ + d in docks if d.IsOk() and \ + (d.IsHorizontal() == isHor) and \ + not d.toolbar and \ + d.dock_direction != AUI_DOCK_CENTER] + + frameRect = GetInternalFrameRect(self._frame, self._docks) + + # set max size allowing for sashes and absolute minimum + maxsize = frameRect[2:][isHor] - sum(sizes) - (len(sizes)*10) - (sashSize*len(sizes)) + dock.size = min(p.previousDockSize,maxsize) + + else: + dock.size = 0 + + if p.HasFlag(p.wasMaximized): + self.MaximizePane(p, savesizes=False) + p.SetFlag(p.wasMaximized, False) + + if p.HasFlag(p.needsRestore): + if p.previousDockPos is not None: + DoInsertPane(dock.panes, dock.dock_direction, dock.dock_layer, dock.dock_row, p.previousDockPos) + p.dock_pos = p.previousDockPos + p.previousDockPos = None + p.SetFlag(p.needsRestore, False) + + if p.IsDocked(): + # remove the pane from any existing docks except this one + docks = RemovePaneFromDocks(docks, p, dock) + + # pane needs to be added to the dock, + # if it doesn't already exist + if not FindPaneInDock(dock, p.window): + dock.panes.append(p) + else: + # remove the pane from any existing docks + docks = RemovePaneFromDocks(docks, p) + + # remove any empty docks + docks = [dock for dock in docks if dock.panes] + + dock_count = len(docks) + # configure the docks further + for ii, dock in enumerate(docks): + # sort the dock pane array by the pane's + # dock position (dock_pos), in ascending order + dock.panes.sort(PaneSortFunc) + dock_pane_count = len(dock.panes) + + # for newly created docks, set up their initial size + if dock.size == 0: + size = 0 + for pane in dock.panes: + pane_size = pane.best_size + if pane_size == wx.Size(-1, -1): + pane_size = pane.min_size + if pane_size == wx.Size(-1, -1) and pane.window: + pane_size = pane.window.GetSize() + if dock.IsHorizontal(): + size = max(pane_size.y, size) + else: + size = max(pane_size.x, size) + + # add space for the border (two times), but only + # if at least one pane inside the dock has a pane border + for pane in dock.panes: + if pane.HasBorder(): + size = size + pane_border_size*2 + break + + # if pane is on the top or bottom, add the caption height, + # but only if at least one pane inside the dock has a caption + if dock.IsHorizontal(): + for pane in dock.panes: + if pane.HasCaption() and not pane.HasCaptionLeft(): + size = size + caption_size + break + else: + for pane in dock.panes: + if pane.HasCaptionLeft() and not pane.HasCaption(): + size = size + caption_size + break + + # new dock's size may not be more than the dock constraint + # parameter specifies. See SetDockSizeConstraint() + max_dock_x_size = int(self._dock_constraint_x*float(cli_size.x)) + max_dock_y_size = int(self._dock_constraint_y*float(cli_size.y)) + if cli_size <= wx.Size(20, 20): + max_dock_x_size = 10000 + max_dock_y_size = 10000 + + if dock.IsHorizontal(): + size = min(size, max_dock_y_size) + else: + size = min(size, max_dock_x_size) + + # absolute minimum size for a dock is 10 pixels + if size < 10: + size = 10 + + dock.size = size + + # determine the dock's minimum size + plus_border = False + plus_caption = False + plus_caption_left = False + dock_min_size = 0 + for pane in dock.panes: + if pane.min_size != wx.Size(-1, -1): + if pane.HasBorder(): + plus_border = True + if pane.HasCaption(): + plus_caption = True + if pane.HasCaptionLeft(): + plus_caption_left = True + if dock.IsHorizontal(): + if pane.min_size.y > dock_min_size: + dock_min_size = pane.min_size.y + else: + if pane.min_size.x > dock_min_size: + dock_min_size = pane.min_size.x + + if plus_border: + dock_min_size += pane_border_size*2 + if plus_caption and dock.IsHorizontal(): + dock_min_size += caption_size + if plus_caption_left and dock.IsVertical(): + dock_min_size += caption_size + + dock.min_size = dock_min_size + + # if the pane's current size is less than it's + # minimum, increase the dock's size to it's minimum + if dock.size < dock.min_size: + dock.size = dock.min_size + + # determine the dock's mode (fixed or proportional) + # determine whether the dock has only toolbars + action_pane_marked = False + dock.fixed = True + dock.toolbar = True + for pane in dock.panes: + if not pane.IsFixed(): + dock.fixed = False + if not pane.IsToolbar(): + dock.toolbar = False + if pane.HasFlag(AuiPaneInfo.optionDockFixed): + dock.fixed = True + if pane.HasFlag(AuiPaneInfo.actionPane): + action_pane_marked = True + + # if the dock mode is proportional and not fixed-pixel, + # reassign the dock_pos to the sequential 0, 1, 2, 3 + # e.g. remove gaps like 1, 2, 30, 500 + if not dock.fixed: + for jj in xrange(dock_pane_count): + pane = dock.panes[jj] + pane.dock_pos = jj + + # if the dock mode is fixed, and none of the panes + # are being moved right now, make sure the panes + # do not overlap each other. If they do, we will + # adjust the panes' positions + if dock.fixed and not action_pane_marked: + pane_positions, pane_sizes = self.GetPanePositionsAndSizes(dock) + offset = 0 + for jj in xrange(dock_pane_count): + pane = dock.panes[jj] + pane.dock_pos = pane_positions[jj] + amount = pane.dock_pos - offset + if amount >= 0: + offset += amount + else: + pane.dock_pos += -amount + + offset += pane_sizes[jj] + dock.panes[jj] = pane + + if oncheck: + self._docks[ii] = dock + + # shrink docks if needed +## docks = self.SmartShrink(docks, AUI_DOCK_TOP) +## docks = self.SmartShrink(docks, AUI_DOCK_LEFT) + + if oncheck: + self._docks = docks + + # discover the maximum dock layer + max_layer = 0 + dock_count = len(docks) + + for ii in xrange(dock_count): + max_layer = max(max_layer, docks[ii].dock_layer) + + # clear out uiparts + uiparts = [] + + # create a bunch of box sizers, + # from the innermost level outwards. + cont = None + middle = None + + if oncheck: + docks = self._docks + + for layer in xrange(max_layer+1): + # find any docks in this layer + arr = FindDocks(docks, -1, layer, -1) + # if there aren't any, skip to the next layer + if not arr: + continue + + old_cont = cont + + # create a container which will hold this layer's + # docks (top, bottom, left, right) + cont = wx.BoxSizer(wx.VERTICAL) + + # find any top docks in this layer + arr = FindDocks(docks, AUI_DOCK_TOP, layer, -1) + for row in arr: + uiparts = self.LayoutAddDock(cont, row, uiparts, spacer_only) + + # fill out the middle layer (which consists + # of left docks, content area and right docks) + + middle = wx.BoxSizer(wx.HORIZONTAL) + + # find any left docks in this layer + arr = FindDocks(docks, AUI_DOCK_LEFT, layer, -1) + for row in arr: + uiparts = self.LayoutAddDock(middle, row, uiparts, spacer_only) + + # add content dock (or previous layer's sizer + # to the middle + if not old_cont: + # find any center docks + arr = FindDocks(docks, AUI_DOCK_CENTER, -1, -1) + if arr: + for row in arr: + uiparts = self.LayoutAddDock(middle, row, uiparts, spacer_only) + + elif not self._has_maximized: + # there are no center docks, add a background area + sizer_item = middle.Add((1, 1), 1, wx.EXPAND) + part = AuiDockUIPart() + part.type = AuiDockUIPart.typeBackground + part.pane = None + part.dock = None + part.button = None + part.cont_sizer = middle + part.sizer_item = sizer_item + uiparts.append(part) + else: + middle.Add(old_cont, 1, wx.EXPAND) + + # find any right docks in this layer + arr = FindDocks(docks, AUI_DOCK_RIGHT, layer, -1, reverse=True) + for row in arr: + uiparts = self.LayoutAddDock(middle, row, uiparts, spacer_only) + + if len(middle.GetChildren()) > 0: + cont.Add(middle, 1, wx.EXPAND) + + # find any bottom docks in this layer + arr = FindDocks(docks, AUI_DOCK_BOTTOM, layer, -1, reverse=True) + for row in arr: + uiparts = self.LayoutAddDock(cont, row, uiparts, spacer_only) + + if not cont: + # no sizer available, because there are no docks, + # therefore we will create a simple background area + cont = wx.BoxSizer(wx.VERTICAL) + sizer_item = cont.Add((1, 1), 1, wx.EXPAND) + part = AuiDockUIPart() + part.type = AuiDockUIPart.typeBackground + part.pane = None + part.dock = None + part.button = None + part.cont_sizer = middle + part.sizer_item = sizer_item + uiparts.append(part) + + if oncheck: + self._uiparts = uiparts + self._docks = docks + + container.Add(cont, 1, wx.EXPAND) + + if oncheck: + return container + else: + return container, panes, docks, uiparts + + + def SetDockSizeConstraint(self, width_pct, height_pct): + """ + When a user creates a new dock by dragging a window into a docked position, + often times the large size of the window will create a dock that is unwieldly + large. + + L{AuiManager} by default limits the size of any new dock to 1/3 of the window + size. For horizontal docks, this would be 1/3 of the window height. For vertical + docks, 1/3 of the width. Calling this function will adjust this constraint value. + + The numbers must be between 0.0 and 1.0. For instance, calling L{SetDockSizeConstraint} + with (0.5, 0.5) will cause new docks to be limited to half of the size of the entire + managed window. + + :param `width_pct`: a float number representing the x dock size constraint; + :param `width_pct`: a float number representing the y dock size constraint. + """ + + self._dock_constraint_x = max(0.0, min(1.0, width_pct)) + self._dock_constraint_y = max(0.0, min(1.0, height_pct)) + + + def GetDockSizeConstraint(self): + """ + Returns the current dock constraint values. + + :see: L{SetDockSizeConstraint} + """ + + return self._dock_constraint_x, self._dock_constraint_y + + + def Update(self): + """ + This method is called after any number of changes are made to any of the + managed panes. L{Update} must be invoked after L{AddPane} or L{InsertPane} are + called in order to "realize" or "commit" the changes. + + In addition, any number of changes may be made to L{AuiPaneInfo} structures + (retrieved with L{GetPane}), but to realize the changes, L{Update} + must be called. This construction allows pane flicker to be avoided by updating + the whole layout at one time. + """ + + self._hover_button = None + self._action_part = None + + # destroy floating panes which have been + # redocked or are becoming non-floating + for p in self._panes: + if p.IsFloating() or not p.frame: + continue + + # because the pane is no longer in a floating, we need to + # reparent it to self._frame and destroy the floating frame + # reduce flicker + p.window.SetSize((1, 1)) + + # the following block is a workaround for bug #1531361 + # (see wxWidgets sourceforge page). On wxGTK (only), when + # a frame is shown/hidden, a move event unfortunately + # also gets fired. Because we may be dragging around + # a pane, we need to cancel that action here to prevent + # a spurious crash. + if self._action_window == p.frame: + if self._frame.HasCapture(): + self._frame.ReleaseMouse() + self._action = actionNone + self._action_window = None + + # hide the frame + if p.frame.IsShown(): + p.frame.Show(False) + + if self._action_window == p.frame: + self._action_window = None + + # reparent to self._frame and destroy the pane + p.window.Reparent(self._frame) + if isinstance(p.window, auibar.AuiToolBar): + p.window.SetAuiManager(self) + + if p.frame: + p.frame.SetSizer(None) + p.frame.Destroy() + p.frame = None + + # Only the master manager should create/destroy notebooks... + if not self._masterManager: + self.UpdateNotebook() + + # delete old sizer first + self._frame.SetSizer(None) + + # create a layout for all of the panes + sizer = self.LayoutAll(self._panes, self._docks, self._uiparts, False) + + # hide or show panes as necessary, + # and float panes as necessary + + pane_count = len(self._panes) + + for ii in xrange(pane_count): + p = self._panes[ii] + pFrame = p.frame + + if p.IsFloating(): + if pFrame is None: + # we need to create a frame for this + # pane, which has recently been floated + frame = self.CreateFloatingFrame(self._frame, p) + + # on MSW and Mac, if the owner desires transparent dragging, and + # the dragging is happening right now, then the floating + # window should have this style by default + if self._action in [actionDragFloatingPane, actionDragToolbarPane] and \ + self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: + frame.SetTransparent(150) + + if p.IsToolbar(): + bar = p.window + if isinstance(bar, auibar.AuiToolBar): + bar.SetGripperVisible(False) + agwStyle = bar.GetAGWWindowStyleFlag() + bar.SetAGWWindowStyleFlag(agwStyle & ~AUI_TB_VERTICAL) + bar.Realize() + + s = p.window.GetMinSize() + p.BestSize(s) + p.FloatingSize(wx.DefaultSize) + + frame.SetPaneWindow(p) + p.needsTransparency = True + p.frame = pFrame = frame + if p.IsShown() and not frame.IsShown(): + frame.Show() + frame.Update() + else: + + # frame already exists, make sure it's position + # and size reflect the information in AuiPaneInfo + if pFrame.GetPosition() != p.floating_pos or pFrame.GetSize() != p.floating_size: + pFrame.SetDimensions(p.floating_pos.x, p.floating_pos.y, + p.floating_size.x, p.floating_size.y, wx.SIZE_USE_EXISTING) + + # update whether the pane is resizable or not + style = p.frame.GetWindowStyleFlag() + if p.IsFixed(): + style &= ~wx.RESIZE_BORDER + else: + style |= wx.RESIZE_BORDER + + p.frame.SetWindowStyleFlag(style) + + if pFrame.IsShown() != p.IsShown(): + p.needsTransparency = True + pFrame.Show(p.IsShown()) + + if pFrame.GetTitle() != p.caption: + pFrame.SetTitle(p.caption) + if p.icon.IsOk(): + pFrame.SetIcon(wx.IconFromBitmap(p.icon)) + + else: + + if p.IsToolbar(): +# self.SwitchToolBarOrientation(p) + p.best_size = p.window.GetBestSize() + + if p.window and not p.IsNotebookPage() and p.window.IsShown() != p.IsShown(): + p.window.Show(p.IsShown()) + + if pFrame and p.needsTransparency: + if pFrame.IsShown() and pFrame._transparent != p.transparent: + pFrame.SetTransparent(p.transparent) + pFrame._transparent = p.transparent + + p.needsTransparency = False + + # if "active panes" are no longer allowed, clear + # any optionActive values from the pane states + if self._agwFlags & AUI_MGR_ALLOW_ACTIVE_PANE == 0: + p.state &= ~AuiPaneInfo.optionActive + + self._panes[ii] = p + + old_pane_rects = [] + pane_count = len(self._panes) + + for p in self._panes: + r = wx.Rect() + if p.window and p.IsShown() and p.IsDocked(): + r = p.rect + + old_pane_rects.append(r) + + # apply the new sizer + self._frame.SetSizer(sizer) + self._frame.SetAutoLayout(False) + self.DoFrameLayout() + + # now that the frame layout is done, we need to check + # the new pane rectangles against the old rectangles that + # we saved a few lines above here. If the rectangles have + # changed, the corresponding panes must also be updated + for ii in xrange(pane_count): + p = self._panes[ii] + if p.window and p.IsShown() and p.IsDocked(): + if p.rect != old_pane_rects[ii]: + p.window.Refresh() + p.window.Update() + + if wx.Platform == "__WXMAC__": + self._frame.Refresh() + else: + self.Repaint() + + if not self._masterManager: + e = self.FireEvent(wxEVT_AUI_PERSPECTIVE_CHANGED, None, canVeto=False) + + + def UpdateNotebook(self): + """ Updates the automatic L{AuiNotebook} in the layout (if any exists). """ + + # Workout how many notebooks we need. + max_notebook = -1 + + # destroy floating panes which have been + # redocked or are becoming non-floating + for paneInfo in self._panes: + if max_notebook < paneInfo.notebook_id: + max_notebook = paneInfo.notebook_id + + # We are the master of our domain + extra_notebook = len(self._notebooks) + max_notebook += 1 + + for i in xrange(extra_notebook, max_notebook): + self.CreateNotebook() + + # Remove pages from notebooks that no-longer belong there ... + for nb, notebook in enumerate(self._notebooks): + pages = notebook.GetPageCount() + pageCounter, allPages = 0, pages + + # Check each tab ... + for page in xrange(pages): + + if page >= allPages: + break + + window = notebook.GetPage(pageCounter) + paneInfo = self.GetPane(window) + if paneInfo.IsOk() and paneInfo.notebook_id != nb: + notebook.RemovePage(pageCounter) + window.Hide() + window.Reparent(self._frame) + pageCounter -= 1 + allPages -= 1 + + pageCounter += 1 + + notebook.DoSizing() + + # Add notebook pages that aren't there already... + for paneInfo in self._panes: + if paneInfo.IsNotebookPage(): + + title = (paneInfo.caption == "" and [paneInfo.name] or [paneInfo.caption])[0] + + notebook = self._notebooks[paneInfo.notebook_id] + page_id = notebook.GetPageIndex(paneInfo.window) + + if page_id < 0: + + paneInfo.window.Reparent(notebook) + notebook.AddPage(paneInfo.window, title, True, paneInfo.icon) + + # Update title and icon ... + else: + + notebook.SetPageText(page_id, title) + notebook.SetPageBitmap(page_id, paneInfo.icon) + + notebook.DoSizing() + + # Wire-up newly created notebooks + elif paneInfo.IsNotebookControl() and not paneInfo.window: + paneInfo.window = self._notebooks[paneInfo.notebook_id] + + # Delete empty notebooks, and convert notebooks with 1 page to + # normal panes... + remap_ids = [-1]*len(self._notebooks) + nb_idx = 0 + + for nb, notebook in enumerate(self._notebooks): + if notebook.GetPageCount() == 1: + + # Convert notebook page to pane... + window = notebook.GetPage(0) + child_pane = self.GetPane(window) + notebook_pane = self.GetPane(notebook) + if child_pane.IsOk() and notebook_pane.IsOk(): + + child_pane.SetDockPos(notebook_pane) + child_pane.window.Hide() + child_pane.window.Reparent(self._frame) + child_pane.frame = None + child_pane.notebook_id = -1 + if notebook_pane.IsFloating(): + child_pane.Float() + + self.DetachPane(notebook) + + notebook.RemovePage(0) + notebook.Destroy() + + else: + + raise Exception("Odd notebook docking") + + elif notebook.GetPageCount() == 0: + + self.DetachPane(notebook) + notebook.Destroy() + + else: + + # Correct page ordering. The original wxPython code + # for this did not work properly, and would misplace + # windows causing errors. + notebook.Freeze() + self._notebooks[nb_idx] = notebook + pages = notebook.GetPageCount() + selected = notebook.GetPage(notebook.GetSelection()) + + # Take each page out of the notebook, group it with + # its current pane, and sort the list by pane.dock_pos + # order + pages_and_panes = [] + for idx in reversed(range(pages)): + page = notebook.GetPage(idx) + pane = self.GetPane(page) + pages_and_panes.append((page, pane)) + notebook.RemovePage(idx) + sorted_pnp = sorted(pages_and_panes, key=lambda tup: tup[1].dock_pos) + + # Grab the attributes from the panes which are ordered + # correctly, and copy those attributes to the original + # panes. (This avoids having to change the ordering + # of self._panes) Then, add the page back into the notebook + sorted_attributes = [self.GetAttributes(tup[1]) + for tup in sorted_pnp] + for attrs, tup in zip(sorted_attributes, pages_and_panes): + pane = tup[1] + self.SetAttributes(pane, attrs) + notebook.AddPage(pane.window, pane.caption) + + notebook.SetSelection(notebook.GetPageIndex(selected), True) + notebook.DoSizing() + notebook.Thaw() + + # It's a keeper. + remap_ids[nb] = nb_idx + nb_idx += 1 + + # Apply remap... + nb_count = len(self._notebooks) + + if nb_count != nb_idx: + + self._notebooks = self._notebooks[0:nb_idx] + for p in self._panes: + if p.notebook_id >= 0: + p.notebook_id = remap_ids[p.notebook_id] + if p.IsNotebookControl(): + p.SetNameFromNotebookId() + + # Make sure buttons are correct ... + for notebook in self._notebooks: + want_max = True + want_min = True + want_close = True + + pages = notebook.GetPageCount() + for page in xrange(pages): + + win = notebook.GetPage(page) + pane = self.GetPane(win) + if pane.IsOk(): + + if not pane.HasCloseButton(): + want_close = False + if not pane.HasMaximizeButton(): + want_max = False + if not pane.HasMinimizeButton(): + want_min = False + + notebook_pane = self.GetPane(notebook) + if notebook_pane.IsOk(): + if notebook_pane.HasMinimizeButton() != want_min: + if want_min: + button = AuiPaneButton(AUI_BUTTON_MINIMIZE) + notebook_pane.state |= AuiPaneInfo.buttonMinimize + notebook_pane.buttons.append(button) + + # todo: remove min/max + + if notebook_pane.HasMaximizeButton() != want_max: + if want_max: + button = AuiPaneButton(AUI_BUTTON_MAXIMIZE_RESTORE) + notebook_pane.state |= AuiPaneInfo.buttonMaximize + notebook_pane.buttons.append(button) + + # todo: remove min/max + + if notebook_pane.HasCloseButton() != want_close: + if want_close: + button = AuiPaneButton(AUI_BUTTON_CLOSE) + notebook_pane.state |= AuiPaneInfo.buttonClose + notebook_pane.buttons.append(button) + + # todo: remove close + + + def SmartShrink(self, docks, direction): + """ + Used to intelligently shrink the docks' size (if needed). + + :param `docks`: a list of L{AuiDockInfo} instances; + :param `direction`: the direction in which to shrink. + """ + + sashSize = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) + caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + clientSize = self._frame.GetClientSize() + ourDocks = FindDocks(docks, direction, -1, -1) + oppositeDocks = FindOppositeDocks(docks, direction) + oppositeSize = self.GetOppositeDockTotalSize(docks, direction) + ourSize = 0 + + for dock in ourDocks: + ourSize += dock.size + + if not dock.toolbar: + ourSize += sashSize + + shrinkSize = ourSize + oppositeSize + + if direction == AUI_DOCK_TOP or direction == AUI_DOCK_BOTTOM: + shrinkSize -= clientSize.y + else: + shrinkSize -= clientSize.x + + if shrinkSize <= 0: + return docks + + # Combine arrays + for dock in oppositeDocks: + ourDocks.append(dock) + + oppositeDocks = [] + + for dock in ourDocks: + if dock.toolbar or not dock.resizable: + continue + + dockRange = dock.size - dock.min_size + + if dock.min_size == 0: + dockRange -= sashSize + if direction == AUI_DOCK_TOP or direction == AUI_DOCK_BOTTOM: + dockRange -= caption_size + + if dockRange >= shrinkSize: + + dock.size -= shrinkSize + return docks + + else: + + dock.size -= dockRange + shrinkSize -= dockRange + + return docks + + + def UpdateDockingGuides(self, paneInfo): + """ + Updates the docking guide windows positions and appearance. + + :param `paneInfo`: a L{AuiPaneInfo} instance. + """ + + if len(self._guides) == 0: + self.CreateGuideWindows() + + captionSize = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + frameRect = GetInternalFrameRect(self._frame, self._docks) + mousePos = wx.GetMousePosition() + + for indx, guide in enumerate(self._guides): + + pt = wx.Point() + guide_size = guide.host.GetSize() + if not guide.host: + raise Exception("Invalid docking host") + + direction = guide.dock_direction + + if direction == AUI_DOCK_LEFT: + pt.x = frameRect.x + guide_size.x / 2 + 16 + pt.y = frameRect.y + frameRect.height / 2 + + elif direction == AUI_DOCK_TOP: + pt.x = frameRect.x + frameRect.width / 2 + pt.y = frameRect.y + guide_size.y / 2 + 16 + + elif direction == AUI_DOCK_RIGHT: + pt.x = frameRect.x + frameRect.width - guide_size.x / 2 - 16 + pt.y = frameRect.y + frameRect.height / 2 + + elif direction == AUI_DOCK_BOTTOM: + pt.x = frameRect.x + frameRect.width / 2 + pt.y = frameRect.y + frameRect.height - guide_size.y / 2 - 16 + + elif direction == AUI_DOCK_CENTER: + rc = paneInfo.window.GetScreenRect() + pt.x = rc.x + rc.width / 2 + pt.y = rc.y + rc.height / 2 + if paneInfo.HasCaption(): + pt.y -= captionSize / 2 + elif paneInfo.HasCaptionLeft(): + pt.x -= captionSize / 2 + + # guide will be centered around point 'pt' + targetPosition = wx.Point(pt.x - guide_size.x / 2, pt.y - guide_size.y / 2) + + if guide.host.GetPosition() != targetPosition: + guide.host.Move(targetPosition) + + guide.host.AeroMove(targetPosition) + + if guide.dock_direction == AUI_DOCK_CENTER: + guide.host.ValidateNotebookDocking(paneInfo.IsNotebookDockable()) + + guide.host.UpdateDockGuide(mousePos) + + paneInfo.window.Lower() + + + def DoFrameLayout(self): + """ + This is an internal function which invokes `wx.Sizer.Layout` + on the frame's main sizer, then measures all the various UI items + and updates their internal rectangles. + + :note: This should always be called instead of calling + `self._managed_window.Layout()` directly. + """ + + self._frame.Layout() + + for part in self._uiparts: + # get the rectangle of the UI part + # originally, this code looked like this: + # part.rect = wx.Rect(part.sizer_item.GetPosition(), + # part.sizer_item.GetSize()) + # this worked quite well, with one exception: the mdi + # client window had a "deferred" size variable + # that returned the wrong size. It looks like + # a bug in wx, because the former size of the window + # was being returned. So, we will retrieve the part's + # rectangle via other means + + part.rect = part.sizer_item.GetRect() + flag = part.sizer_item.GetFlag() + border = part.sizer_item.GetBorder() + + if flag & wx.TOP: + part.rect.y -= border + part.rect.height += border + if flag & wx.LEFT: + part.rect.x -= border + part.rect.width += border + if flag & wx.BOTTOM: + part.rect.height += border + if flag & wx.RIGHT: + part.rect.width += border + + if part.type == AuiDockUIPart.typeDock: + part.dock.rect = part.rect + if part.type == AuiDockUIPart.typePane: + part.pane.rect = part.rect + + + def GetPanePart(self, wnd): + """ + Looks up the pane border UI part of the + pane specified. This allows the caller to get the exact rectangle + of the pane in question, including decorations like caption and border. + + :param `wnd`: the window to which the pane border belongs to. + """ + + for part in self._uiparts: + if part.type == AuiDockUIPart.typePaneBorder and \ + part.pane and part.pane.window == wnd: + return part + + for part in self._uiparts: + if part.type == AuiDockUIPart.typePane and \ + part.pane and part.pane.window == wnd: + return part + + return None + + + def GetDockPixelOffset(self, test): + """ + This is an internal function which returns + a dock's offset in pixels from the left side of the window + (for horizontal docks) or from the top of the window (for + vertical docks). + + This value is necessary for calculating fixed-pane/toolbar offsets + when they are dragged. + + :param `test`: a fake L{AuiPaneInfo} for testing purposes. + """ + + # the only way to accurately calculate the dock's + # offset is to actually run a theoretical layout + docks, panes = CopyDocksAndPanes2(self._docks, self._panes) + panes.append(test) + + sizer, panes, docks, uiparts = self.LayoutAll(panes, docks, [], True, False) + client_size = self._frame.GetClientSize() + sizer.SetDimension(0, 0, client_size.x, client_size.y) + sizer.Layout() + + for part in uiparts: + pos = part.sizer_item.GetPosition() + size = part.sizer_item.GetSize() + part.rect = wx.RectPS(pos, size) + if part.type == AuiDockUIPart.typeDock: + part.dock.rect = part.rect + + sizer.Destroy() + + for dock in docks: + if test.dock_direction == dock.dock_direction and \ + test.dock_layer == dock.dock_layer and \ + test.dock_row == dock.dock_row: + + if dock.IsVertical(): + return dock.rect.y + else: + return dock.rect.x + + return 0 + + + def GetPartnerDock(self, dock): + """ + Returns the partner dock for the input dock. + + :param `dock`: a L{AuiDockInfo} instance. + """ + + for layer in xrange(dock.dock_layer, -1, -1): + + bestDock = None + + for tmpDock in self._docks: + + if tmpDock.dock_layer != layer: + continue + + if tmpDock.dock_direction != dock.dock_direction: + continue + + if tmpDock.dock_layer < dock.dock_layer: + + if not bestDock or tmpDock.dock_row < bestDock.dock_row: + bestDock = tmpDock + + elif tmpDock.dock_row > dock.dock_row: + + if not bestDock or tmpDock.dock_row > bestDock.dock_row: + bestDock = tmpDock + + if bestDock: + return bestDock + + return None + + + def GetPartnerPane(self, dock, pane): + """ + Returns the partner pane for the input pane. They both need to live + in the same L{AuiDockInfo}. + + :param `dock`: a L{AuiDockInfo} instance; + :param `pane`: a L{AuiPaneInfo} class. + """ + + panePosition = -1 + + for i, tmpPane in enumerate(dock.panes): + if tmpPane.window == pane.window: + panePosition = i + elif not tmpPane.IsFixed() and panePosition != -1: + return tmpPane + + return None + + + def GetTotalPixSizeAndProportion(self, dock): + """ + Returns the dimensions and proportion of the input dock. + + :param `dock`: the L{AuiDockInfo} structure to analyze. + """ + + totalPixsize = 0 + totalProportion = 0 + + # determine the total proportion of all resizable panes, + # and the total size of the dock minus the size of all + # the fixed panes + for tmpPane in dock.panes: + + if tmpPane.IsFixed(): + continue + + totalProportion += tmpPane.dock_proportion + + if dock.IsHorizontal(): + totalPixsize += tmpPane.rect.width + else: + totalPixsize += tmpPane.rect.height + +## if tmpPane.min_size.IsFullySpecified(): +## +## if dock.IsHorizontal(): +## totalPixsize -= tmpPane.min_size.x +## else: +## totalPixsize -= tmpPane.min_size.y + + return totalPixsize, totalProportion + + + def GetOppositeDockTotalSize(self, docks, direction): + """ + Returns the dimensions of the dock which lives opposite of the input dock. + + :param `docks`: a list of L{AuiDockInfo} structures to analyze; + :param `direction`: the direction in which to look for the opposite dock. + """ + + sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) + caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + pane_border_size = self._art.GetMetric(AUI_DOCKART_PANE_BORDER_SIZE) + minSizeMax = 0 + result = sash_size + vertical = False + + if direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM]: + vertical = True + + # Get minimum size of the most inner area + for tmpDock in docks: + + if tmpDock.dock_layer != 0: + continue + + if tmpDock.dock_direction != AUI_DOCK_CENTER and tmpDock.IsVertical() != vertical: + continue + + for tmpPane in tmpDock.panes: + + minSize = pane_border_size*2 - sash_size + + if vertical: + minSize += tmpPane.min_size.y + caption_size + else: + minSize += tmpPane.min_size.x + + if minSize > minSizeMax: + minSizeMax = minSize + + result += minSizeMax + + # Get opposite docks + oppositeDocks = FindOppositeDocks(docks, direction) + + # Sum size of the opposite docks and their sashes + for dock in oppositeDocks: + result += dock.size + # if it's not a toolbar add the sash_size too + if not dock.toolbar: + result += sash_size + + return result + + + def CalculateDockSizerLimits(self, dock): + """ + Calculates the minimum and maximum sizes allowed for the input dock. + + :param `dock`: the L{AuiDockInfo} structure to analyze. + """ + + docks, panes = CopyDocksAndPanes2(self._docks, self._panes) + + sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) + caption_size = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + opposite_size = self.GetOppositeDockTotalSize(docks, dock.dock_direction) + + for tmpDock in docks: + + if tmpDock.dock_direction == dock.dock_direction and \ + tmpDock.dock_layer == dock.dock_layer and \ + tmpDock.dock_row == dock.dock_row: + + tmpDock.size = 1 + break + + sizer, panes, docks, uiparts = self.LayoutAll(panes, docks, [], True, False) + client_size = self._frame.GetClientSize() + sizer.SetDimension(0, 0, client_size.x, client_size.y) + sizer.Layout() + + for part in uiparts: + + part.rect = wx.RectPS(part.sizer_item.GetPosition(), part.sizer_item.GetSize()) + if part.type == AuiDockUIPart.typeDock: + part.dock.rect = part.rect + + sizer.Destroy() + new_dock = None + + for tmpDock in docks: + if tmpDock.dock_direction == dock.dock_direction and \ + tmpDock.dock_layer == dock.dock_layer and \ + tmpDock.dock_row == dock.dock_row: + + new_dock = tmpDock + break + + partnerDock = self.GetPartnerDock(dock) + + if partnerDock: + partnerRange = partnerDock.size - partnerDock.min_size + if partnerDock.min_size == 0: + partnerRange -= sash_size + if dock.IsHorizontal(): + partnerRange -= caption_size + + direction = dock.dock_direction + + if direction == AUI_DOCK_LEFT: + minPix = new_dock.rect.x + new_dock.rect.width + maxPix = dock.rect.x + dock.rect.width + maxPix += partnerRange + + elif direction == AUI_DOCK_TOP: + minPix = new_dock.rect.y + new_dock.rect.height + maxPix = dock.rect.y + dock.rect.height + maxPix += partnerRange + + elif direction == AUI_DOCK_RIGHT: + minPix = dock.rect.x - partnerRange - sash_size + maxPix = new_dock.rect.x - sash_size + + elif direction == AUI_DOCK_BOTTOM: + minPix = dock.rect.y - partnerRange - sash_size + maxPix = new_dock.rect.y - sash_size + + return minPix, maxPix + + direction = new_dock.dock_direction + + if direction == AUI_DOCK_LEFT: + minPix = new_dock.rect.x + new_dock.rect.width + maxPix = client_size.x - opposite_size - sash_size + + elif direction == AUI_DOCK_TOP: + minPix = new_dock.rect.y + new_dock.rect.height + maxPix = client_size.y - opposite_size - sash_size + + elif direction == AUI_DOCK_RIGHT: + minPix = opposite_size + maxPix = new_dock.rect.x - sash_size + + elif direction == AUI_DOCK_BOTTOM: + minPix = opposite_size + maxPix = new_dock.rect.y - sash_size + + return minPix, maxPix + + + def CalculatePaneSizerLimits(self, dock, pane): + """ + Calculates the minimum and maximum sizes allowed for the input pane. + + :param `dock`: the L{AuiDockInfo} structure to which `pane` belongs to; + :param `pane`: a L{AuiPaneInfo} class for which calculation are requested. + """ + + if pane.IsFixed(): + if dock.IsHorizontal(): + minPix = maxPix = pane.rect.x + 1 + pane.rect.width + else: + minPix = maxPix = pane.rect.y + 1 + pane.rect.height + + return minPix, maxPix + + totalPixsize, totalProportion = self.GetTotalPixSizeAndProportion(dock) + partnerPane = self.GetPartnerPane(dock, pane) + + if dock.IsHorizontal(): + + minPix = pane.rect.x + 1 + maxPix = pane.rect.x + 1 + pane.rect.width + + if pane.min_size.IsFullySpecified(): + minPix += pane.min_size.x + else: + minPix += 1 + + if partnerPane: + maxPix += partnerPane.rect.width + + if partnerPane.min_size.IsFullySpecified(): + maxPix -= partnerPane.min_size.x - 1 + + else: + minPix = maxPix + + else: + + minPix = pane.rect.y + 1 + maxPix = pane.rect.y + 1 + pane.rect.height + + if pane.min_size.IsFullySpecified(): + minPix += pane.min_size.y + else: + minPix += 1 + + if partnerPane: + maxPix += partnerPane.rect.height + + if partnerPane.min_size.IsFullySpecified(): + maxPix -= partnerPane.min_size.y - 1 + + else: + minPix = maxPix + + return minPix, maxPix + + + def CheckMovableSizer(self, part): + """ + Checks if a UI part can be actually resized. + + :param `part`: a UI part. + """ + + # a dock may not be resized if it has a single + # pane which is not resizable + if part.type == AuiDockUIPart.typeDockSizer and part.dock and \ + len(part.dock.panes) == 1 and part.dock.panes[0].IsFixed(): + + return False + + if part.pane: + + # panes that may not be resized should be ignored here + minPix, maxPix = self.CalculatePaneSizerLimits(part.dock, part.pane) + + if minPix == maxPix: + return False + + return True + + + def PaneFromTabEvent(self, event): + """ + Returns a L{AuiPaneInfo} from a L{AuiNotebookEvent} event. + + :param `event`: a L{AuiNotebookEvent} event. + """ + + obj = event.GetEventObject() + + if obj and isinstance(obj, auibook.AuiTabCtrl): + + page_idx = obj.GetActivePage() + + if page_idx >= 0: + page = obj.GetPage(page_idx) + window = page.window + if window: + return self.GetPane(window) + + elif obj and isinstance(obj, auibook.AuiNotebook): + + page_idx = event.GetSelection() + + if page_idx >= 0: + window = obj.GetPage(page_idx) + if window: + return self.GetPane(window) + + return NonePaneInfo + + + def OnTabBeginDrag(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_BEGIN_DRAG`` event. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + if self._masterManager: + self._masterManager.OnTabBeginDrag(event) + + else: + paneInfo = self.PaneFromTabEvent(event) + + if paneInfo.IsOk(): + + # It's one of ours! + self._action = actionDragFloatingPane + mouse = wx.GetMousePosition() + + # set initial float position - may have to think about this + # offset a bit more later ... + self._action_offset = wx.Point(20, 10) + self._toolbar_action_offset = wx.Point(20, 10) + + paneInfo.floating_pos = mouse - self._action_offset + paneInfo.dock_pos = AUI_DOCK_NONE + paneInfo.notebook_id = -1 + + tab = event.GetEventObject() + + if tab.HasCapture(): + tab.ReleaseMouse() + + # float the window + if paneInfo.IsMaximized(): + self.RestorePane(paneInfo) + paneInfo.Float() + self.Update() + + self._action_window = paneInfo.window + + self._frame.CaptureMouse() + event.SetDispatched(True) + + else: + + # not our window + event.Skip() + + + def OnTabPageClose(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_PAGE_CLOSE`` event. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + if self._masterManager: + self._masterManager.OnTabPageClose(event) + + else: + + p = self.PaneFromTabEvent(event) + if p.IsOk(): + + # veto it because we will call "RemovePage" ourselves + event.Veto() + + # Now ask the app if they really want to close... + # fire pane close event + e = AuiManagerEvent(wxEVT_AUI_PANE_CLOSE) + e.SetPane(p) + e.SetCanVeto(True) + self.ProcessMgrEvent(e) + + if e.GetVeto(): + return + + self.ClosePane(p) + self.Update() + else: + event.Skip() + + + def OnTabSelected(self, event): + """ + Handles the ``EVT_AUINOTEBOOK_PAGE_CHANGED`` event. + + :param `event`: a L{AuiNotebookEvent} event to be processed. + """ + + if self._masterManager: + self._masterManager.OnTabSelected(event) + return + + obj = event.GetEventObject() + + if obj and isinstance(obj, auibook.AuiNotebook): + + notebook = obj + page = notebook.GetPage(event.GetSelection()) + paneInfo = self.GetPane(page) + + if paneInfo.IsOk(): + notebookRoot = GetNotebookRoot(self._panes, paneInfo.notebook_id) + if notebookRoot: + + notebookRoot.Caption(paneInfo.caption) + self.RefreshCaptions() + + event.Skip() + + + def GetNotebooks(self): + """ Returns all the automatic L{AuiNotebook} in the L{AuiManager}. """ + + if self._masterManager: + return self._masterManager.GetNotebooks() + + return self._notebooks + + + def SetMasterManager(self, manager): + """ + Sets the master manager for an automatic L{AuiNotebook}. + + :param `manager`: an instance of L{AuiManager}. + """ + + self._masterManager = manager + + + def ProcessDockResult(self, target, new_pos): + """ + This is a utility function used by L{DoDrop} - it checks + if a dock operation is allowed, the new dock position is copied into + the target info. If the operation was allowed, the function returns ``True``. + + :param `target`: the L{AuiPaneInfo} instance to be docked; + :param `new_pos`: the new docking position if the docking operation is allowed. + """ + + allowed = False + direction = new_pos.dock_direction + + if direction == AUI_DOCK_TOP: + allowed = target.IsTopDockable() + elif direction == AUI_DOCK_BOTTOM: + allowed = target.IsBottomDockable() + elif direction == AUI_DOCK_LEFT: + allowed = target.IsLeftDockable() + elif direction == AUI_DOCK_RIGHT: + allowed = target.IsRightDockable() + + if allowed: + target = new_pos + + if target.IsToolbar(): + self.SwitchToolBarOrientation(target) + + return allowed, target + + + def SwitchToolBarOrientation(self, pane): + """ + Switches the toolbar orientation from vertical to horizontal and vice-versa. + This is especially useful for vertical docked toolbars once they float. + + :param `pane`: an instance of L{AuiPaneInfo}, which may have a L{AuiToolBar} + window associated with it. + """ + + if not isinstance(pane.window, auibar.AuiToolBar): + return pane + + if pane.IsFloating(): + return pane + + toolBar = pane.window + direction = pane.dock_direction + vertical = direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT] + + agwStyle = toolBar.GetAGWWindowStyleFlag() + new_agwStyle = agwStyle + + if vertical: + new_agwStyle |= AUI_TB_VERTICAL + else: + new_agwStyle &= ~(AUI_TB_VERTICAL) + + if agwStyle != new_agwStyle: + toolBar.SetAGWWindowStyleFlag(new_agwStyle) + if not toolBar.GetGripperVisible(): + toolBar.SetGripperVisible(True) + + s = pane.window.GetMinSize() + pane.BestSize(s) + + if new_agwStyle != agwStyle: + toolBar.Realize() + + return pane + + + def DoDrop(self, docks, panes, target, pt, offset=wx.Point(0, 0)): + """ + This is an important function. It basically takes a mouse position, + and determines where the panes new position would be. If the pane is to be + dropped, it performs the drop operation using the specified dock and pane + arrays. By specifying copy dock and pane arrays when calling, a "what-if" + scenario can be performed, giving precise coordinates for drop hints. + + :param `docks`: a list of L{AuiDockInfo} classes; + :param `panes`: a list of L{AuiPaneInfo} instances; + :param `pt`: a mouse position to check for a drop operation; + :param `offset`: a possible offset from the input point `pt`. + """ + + if target.IsToolbar(): + return self.DoDropToolbar(docks, panes, target, pt, offset) + elif target.IsFloating(): + return self.DoDropFloatingPane(docks, panes, target, pt) + else: + return self.DoDropNonFloatingPane(docks, panes, target, pt) + + + def CopyTarget(self, target): + """ + Copies all the attributes of the input `target` into another L{AuiPaneInfo}. + + :param `target`: the source L{AuiPaneInfo} from where to copy attributes. + """ + + drop = AuiPaneInfo() + drop.name = target.name + drop.caption = target.caption + drop.window = target.window + drop.frame = target.frame + drop.state = target.state + drop.dock_direction = target.dock_direction + drop.dock_layer = target.dock_layer + drop.dock_row = target.dock_row + drop.dock_pos = target.dock_pos + drop.best_size = wx.Size(*target.best_size) + drop.min_size = wx.Size(*target.min_size) + drop.max_size = wx.Size(*target.max_size) + drop.floating_pos = wx.Point(*target.floating_pos) + drop.floating_size = wx.Size(*target.floating_size) + drop.dock_proportion = target.dock_proportion + drop.buttons = target.buttons + drop.rect = wx.Rect(*target.rect) + drop.icon = target.icon + drop.notebook_id = target.notebook_id + drop.transparent = target.transparent + drop.snapped = target.snapped + drop.minimize_mode = target.minimize_mode + + return drop + + + def DoDropToolbar(self, docks, panes, target, pt, offset): + """ + Handles the situation in which the dropped pane contains a toolbar. + + :param `docks`: a list of L{AuiDockInfo} classes; + :param `panes`: a list of L{AuiPaneInfo} instances; + :param `target`: the target pane containing the toolbar; + :param `pt`: a mouse position to check for a drop operation; + :param `offset`: a possible offset from the input point `pt`. + """ + + drop = self.CopyTarget(target) + + # The result should always be shown + drop.Show() + + # Check to see if the toolbar has been dragged out of the window + if CheckOutOfWindow(self._frame, pt): + if self._agwFlags & AUI_MGR_ALLOW_FLOATING and drop.IsFloatable(): + drop.Float() + + return self.ProcessDockResult(target, drop) + + # Allow directional change when the cursor leaves this rect + safeRect = wx.Rect(*target.rect) + if target.IsHorizontal(): + safeRect.Inflate(100, 50) + else: + safeRect.Inflate(50, 100) + + # Check to see if the toolbar has been dragged to edge of the frame + dropDir = CheckEdgeDrop(self._frame, docks, pt) + + if dropDir != -1: + + if dropDir == wx.LEFT: + drop.Dock().Left().Layer(auiToolBarLayer).Row(0). \ + Position(pt.y - self.GetDockPixelOffset(drop) - offset.y) + + elif dropDir == wx.RIGHT: + drop.Dock().Right().Layer(auiToolBarLayer).Row(0). \ + Position(pt.y - self.GetDockPixelOffset(drop) - offset.y) + + elif dropDir == wx.TOP: + drop.Dock().Top().Layer(auiToolBarLayer).Row(0). \ + Position(pt.x - self.GetDockPixelOffset(drop) - offset.x) + + elif dropDir == wx.BOTTOM: + drop.Dock().Bottom().Layer(auiToolBarLayer).Row(0). \ + Position(pt.x - self.GetDockPixelOffset(drop) - offset.x) + + if not target.IsFloating() and safeRect.Contains(pt) and \ + target.dock_direction != drop.dock_direction: + return False, target + + return self.ProcessDockResult(target, drop) + + # If the windows is floating and out of the client area, do nothing + if drop.IsFloating() and not self._frame.GetClientRect().Contains(pt): + return False, target + + # Ok, can't drop on edge - check internals ... + + clientSize = self._frame.GetClientSize() + x = Clip(pt.x, 0, clientSize.x - 1) + y = Clip(pt.y, 0, clientSize.y - 1) + part = self.HitTest(x, y) + + if not part or not part.dock: + return False, target + + dock = part.dock + + # toolbars may only be moved in and to fixed-pane docks, + # otherwise we will try to float the pane. Also, the pane + # should float if being dragged over center pane windows + if not dock.fixed or dock.dock_direction == AUI_DOCK_CENTER: + + if (self._agwFlags & AUI_MGR_ALLOW_FLOATING and drop.IsFloatable()) or \ + dock.dock_direction not in [AUI_DOCK_CENTER, AUI_DOCK_NONE]: + if drop.IsFloatable(): + drop.Float() + + return self.ProcessDockResult(target, drop) + + # calculate the offset from where the dock begins + # to the point where the user dropped the pane + dockDropOffset = 0 + if dock.IsHorizontal(): + dockDropOffset = pt.x - dock.rect.x - offset.x + else: + dockDropOffset = pt.y - dock.rect.y - offset.y + + drop.Dock().Direction(dock.dock_direction).Layer(dock.dock_layer). \ + Row(dock.dock_row).Position(dockDropOffset) + + if (pt.y <= dock.rect.GetTop() + 2 and dock.IsHorizontal()) or \ + (pt.x <= dock.rect.GetLeft() + 2 and dock.IsVertical()): + + if dock.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_LEFT]: + row = drop.dock_row + panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row) + drop.dock_row = row + + else: + panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row+1) + drop.dock_row = dock.dock_row + 1 + + if (pt.y >= dock.rect.GetBottom() - 2 and dock.IsHorizontal()) or \ + (pt.x >= dock.rect.GetRight() - 2 and dock.IsVertical()): + + if dock.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_LEFT]: + panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row+1) + drop.dock_row = dock.dock_row+1 + + else: + row = drop.dock_row + panes = DoInsertDockRow(panes, dock.dock_direction, dock.dock_layer, dock.dock_row) + drop.dock_row = row + + if not target.IsFloating() and safeRect.Contains(pt) and \ + target.dock_direction != drop.dock_direction: + return False, target + + return self.ProcessDockResult(target, drop) + + + def DoDropFloatingPane(self, docks, panes, target, pt): + """ + Handles the situation in which the dropped pane contains a normal window. + + :param `docks`: a list of L{AuiDockInfo} classes; + :param `panes`: a list of L{AuiPaneInfo} instances; + :param `target`: the target pane containing the window; + :param `pt`: a mouse position to check for a drop operation. + """ + + screenPt = self._frame.ClientToScreen(pt) + paneInfo = self.PaneHitTest(panes, pt) + + if paneInfo.IsMaximized(): + return False, target + + if paneInfo.window is None: + return False, target + + # search the dock guides. + # reverse order to handle the center first. + for i in xrange(len(self._guides)-1, -1, -1): + guide = self._guides[i] + + # do hit testing on the guide + dir = guide.host.HitTest(screenPt.x, screenPt.y) + + if dir == -1: # point was outside of the dock guide + continue + + if dir == wx.ALL: # target is a single dock guide + return self.DoDropLayer(docks, target, guide.dock_direction) + + elif dir == wx.CENTER: + + if not target.IsNotebookDockable(): + continue + if not paneInfo.IsNotebookDockable() and not paneInfo.IsNotebookControl(): + continue + + if not paneInfo.HasNotebook(): + + # Add a new notebook pane with the original as a tab... + self.CreateNotebookBase(panes, paneInfo) + + # Add new item to notebook + target.NotebookPage(paneInfo.notebook_id) + + else: + + drop_pane = False + drop_row = False + + insert_dir = paneInfo.dock_direction + insert_layer = paneInfo.dock_layer + insert_row = paneInfo.dock_row + insert_pos = paneInfo.dock_pos + + if insert_dir == AUI_DOCK_CENTER: + + insert_layer = 0 + if dir == wx.LEFT: + insert_dir = AUI_DOCK_LEFT + elif dir == wx.UP: + insert_dir = AUI_DOCK_TOP + elif dir == wx.RIGHT: + insert_dir = AUI_DOCK_RIGHT + elif dir == wx.DOWN: + insert_dir = AUI_DOCK_BOTTOM + + if insert_dir == AUI_DOCK_LEFT: + + drop_pane = (dir == wx.UP or dir == wx.DOWN) + drop_row = (dir == wx.LEFT or dir == wx.RIGHT) + if dir == wx.RIGHT: + insert_row += 1 + elif dir == wx.DOWN: + insert_pos += 1 + + elif insert_dir == AUI_DOCK_RIGHT: + + drop_pane = (dir == wx.UP or dir == wx.DOWN) + drop_row = (dir == wx.LEFT or dir == wx.RIGHT) + if dir == wx.LEFT: + insert_row += 1 + elif dir == wx.DOWN: + insert_pos += 1 + + elif insert_dir == AUI_DOCK_TOP: + + drop_pane = (dir == wx.LEFT or dir == wx.RIGHT) + drop_row = (dir == wx.UP or dir == wx.DOWN) + if dir == wx.DOWN: + insert_row += 1 + elif dir == wx.RIGHT: + insert_pos += 1 + + elif insert_dir == AUI_DOCK_BOTTOM: + + drop_pane = (dir == wx.LEFT or dir == wx.RIGHT) + drop_row = (dir == wx.UP or dir == wx.DOWN) + if dir == wx.UP: + insert_row += 1 + elif dir == wx.RIGHT: + insert_pos += 1 + + if paneInfo.dock_direction == AUI_DOCK_CENTER: + insert_row = GetMaxRow(panes, insert_dir, insert_layer) + 1 + + if drop_pane: + return self.DoDropPane(panes, target, insert_dir, insert_layer, insert_row, insert_pos) + + if drop_row: + return self.DoDropRow(panes, target, insert_dir, insert_layer, insert_row) + + return True, target + + return False, target + + + def DoDropNonFloatingPane(self, docks, panes, target, pt): + """ + Handles the situation in which the dropped pane is not floating. + + :param `docks`: a list of L{AuiDockInfo} classes; + :param `panes`: a list of L{AuiPaneInfo} instances; + :param `target`: the target pane containing the toolbar; + :param `pt`: a mouse position to check for a drop operation. + """ + + screenPt = self._frame.ClientToScreen(pt) + clientSize = self._frame.GetClientSize() + frameRect = GetInternalFrameRect(self._frame, self._docks) + + drop = self.CopyTarget(target) + + # The result should always be shown + drop.Show() + + part = self.HitTest(pt.x, pt.y) + + if not part: + return False, target + + if part.type == AuiDockUIPart.typeDockSizer: + + if len(part.dock.panes) != 1: + return False, target + + part = self.GetPanePart(part.dock.panes[0].window) + if not part: + return False, target + + if not part.pane: + return False, target + + part = self.GetPanePart(part.pane.window) + if not part: + return False, target + + insert_dock_row = False + insert_row = part.pane.dock_row + insert_dir = part.pane.dock_direction + insert_layer = part.pane.dock_layer + + direction = part.pane.dock_direction + + if direction == AUI_DOCK_TOP: + if pt.y >= part.rect.y and pt.y < part.rect.y+auiInsertRowPixels: + insert_dock_row = True + + elif direction == AUI_DOCK_BOTTOM: + if pt.y > part.rect.y+part.rect.height-auiInsertRowPixels and \ + pt.y <= part.rect.y + part.rect.height: + insert_dock_row = True + + elif direction == AUI_DOCK_LEFT: + if pt.x >= part.rect.x and pt.x < part.rect.x+auiInsertRowPixels: + insert_dock_row = True + + elif direction == AUI_DOCK_RIGHT: + if pt.x > part.rect.x+part.rect.width-auiInsertRowPixels and \ + pt.x <= part.rect.x+part.rect.width: + insert_dock_row = True + + elif direction == AUI_DOCK_CENTER: + + # "new row pixels" will be set to the default, but + # must never exceed 20% of the window size + new_row_pixels_x = auiNewRowPixels + new_row_pixels_y = auiNewRowPixels + + if new_row_pixels_x > (part.rect.width*20)/100: + new_row_pixels_x = (part.rect.width*20)/100 + + if new_row_pixels_y > (part.rect.height*20)/100: + new_row_pixels_y = (part.rect.height*20)/100 + + # determine if the mouse pointer is in a location that + # will cause a new row to be inserted. The hot spot positions + # are along the borders of the center pane + + insert_layer = 0 + insert_dock_row = True + pr = part.rect + + if pt.x >= pr.x and pt.x < pr.x + new_row_pixels_x: + insert_dir = AUI_DOCK_LEFT + elif pt.y >= pr.y and pt.y < pr.y + new_row_pixels_y: + insert_dir = AUI_DOCK_TOP + elif pt.x >= pr.x + pr.width - new_row_pixels_x and pt.x < pr.x + pr.width: + insert_dir = AUI_DOCK_RIGHT + elif pt.y >= pr.y+ pr.height - new_row_pixels_y and pt.y < pr.y + pr.height: + insert_dir = AUI_DOCK_BOTTOM + else: + return False, target + + insert_row = GetMaxRow(panes, insert_dir, insert_layer) + 1 + + if insert_dock_row: + + panes = DoInsertDockRow(panes, insert_dir, insert_layer, insert_row) + drop.Dock().Direction(insert_dir).Layer(insert_layer). \ + Row(insert_row).Position(0) + + return self.ProcessDockResult(target, drop) + + # determine the mouse offset and the pane size, both in the + # direction of the dock itself, and perpendicular to the dock + + if part.orientation == wx.VERTICAL: + + offset = pt.y - part.rect.y + size = part.rect.GetHeight() + + else: + + offset = pt.x - part.rect.x + size = part.rect.GetWidth() + + drop_position = part.pane.dock_pos + + # if we are in the top/left part of the pane, + # insert the pane before the pane being hovered over + if offset <= size/2: + + drop_position = part.pane.dock_pos + panes = DoInsertPane(panes, + part.pane.dock_direction, + part.pane.dock_layer, + part.pane.dock_row, + part.pane.dock_pos) + + # if we are in the bottom/right part of the pane, + # insert the pane before the pane being hovered over + if offset > size/2: + + drop_position = part.pane.dock_pos+1 + panes = DoInsertPane(panes, + part.pane.dock_direction, + part.pane.dock_layer, + part.pane.dock_row, + part.pane.dock_pos+1) + + + drop.Dock(). \ + Direction(part.dock.dock_direction). \ + Layer(part.dock.dock_layer).Row(part.dock.dock_row). \ + Position(drop_position) + + return self.ProcessDockResult(target, drop) + + + def DoDropLayer(self, docks, target, dock_direction): + """ + Handles the situation in which `target` is a single dock guide. + + :param `docks`: a list of L{AuiDockInfo} classes; + :param `target`: the target pane; + :param `dock_direction`: the docking direction. + """ + + drop = self.CopyTarget(target) + + if dock_direction == AUI_DOCK_LEFT: + drop.Dock().Left() + drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_LEFT), + GetMaxLayer(docks, AUI_DOCK_BOTTOM)), + GetMaxLayer(docks, AUI_DOCK_TOP)) + 1 + + elif dock_direction == AUI_DOCK_TOP: + drop.Dock().Top() + drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_TOP), + GetMaxLayer(docks, AUI_DOCK_LEFT)), + GetMaxLayer(docks, AUI_DOCK_RIGHT)) + 1 + + elif dock_direction == AUI_DOCK_RIGHT: + drop.Dock().Right() + drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_RIGHT), + GetMaxLayer(docks, AUI_DOCK_TOP)), + GetMaxLayer(docks, AUI_DOCK_BOTTOM)) + 1 + + elif dock_direction == AUI_DOCK_BOTTOM: + drop.Dock().Bottom() + drop_new_layer = max(max(GetMaxLayer(docks, AUI_DOCK_BOTTOM), + GetMaxLayer(docks, AUI_DOCK_LEFT)), + GetMaxLayer(docks, AUI_DOCK_RIGHT)) + 1 + + else: + return False, target + + + drop.Dock().Layer(drop_new_layer) + return self.ProcessDockResult(target, drop) + + + def DoDropPane(self, panes, target, dock_direction, dock_layer, dock_row, dock_pos): + """ + Drop a pane in the interface. + + :param `panes`: a list of L{AuiPaneInfo} classes; + :param `target`: the target pane; + :param `dock_direction`: the docking direction; + :param `dock_layer`: the docking layer; + :param `dock_row`: the docking row; + :param `dock_pos`: the docking position. + """ + + drop = self.CopyTarget(target) + panes = DoInsertPane(panes, dock_direction, dock_layer, dock_row, dock_pos) + + drop.Dock().Direction(dock_direction).Layer(dock_layer).Row(dock_row).Position(dock_pos) + return self.ProcessDockResult(target, drop) + + + def DoDropRow(self, panes, target, dock_direction, dock_layer, dock_row): + """ + Insert a row in the interface before dropping. + + :param `panes`: a list of L{AuiPaneInfo} classes; + :param `target`: the target pane; + :param `dock_direction`: the docking direction; + :param `dock_layer`: the docking layer; + :param `dock_row`: the docking row. + """ + + drop = self.CopyTarget(target) + panes = DoInsertDockRow(panes, dock_direction, dock_layer, dock_row) + + drop.Dock().Direction(dock_direction).Layer(dock_layer).Row(dock_row).Position(0) + return self.ProcessDockResult(target, drop) + + + def ShowHint(self, rect): + """ + Shows the AUI hint window. + + :param `rect`: the hint rect calculated in advance. + """ + + if rect == self._last_hint: + return + + if self._agwFlags & AUI_MGR_RECTANGLE_HINT and wx.Platform != "__WXMAC__": + + if self._last_hint != rect: + # remove the last hint rectangle + self._last_hint = wx.Rect(*rect) + self._frame.Refresh() + self._frame.Update() + + screendc = wx.ScreenDC() + clip = wx.Region(1, 1, 10000, 10000) + + # clip all floating windows, so we don't draw over them + for pane in self._panes: + if pane.IsFloating() and pane.frame.IsShown(): + + rect2 = wx.Rect(*pane.frame.GetRect()) + if wx.Platform == "__WXGTK__": + # wxGTK returns the client size, not the whole frame size + rect2.width += 15 + rect2.height += 35 + rect2.Inflate(5, 5) + + clip.SubtractRect(rect2) + + # As we can only hide the hint by redrawing the managed window, we + # need to clip the region to the managed window too or we get + # nasty redrawn problems. + clip.IntersectRect(self._frame.GetRect()) + screendc.SetClippingRegionAsRegion(clip) + + stipple = PaneCreateStippleBitmap() + brush = wx.BrushFromBitmap(stipple) + screendc.SetBrush(brush) + screendc.SetPen(wx.TRANSPARENT_PEN) + screendc.DrawRectangle(rect.x, rect.y, 5, rect.height) + screendc.DrawRectangle(rect.x+5, rect.y, rect.width-10, 5) + screendc.DrawRectangle(rect.x+rect.width-5, rect.y, 5, rect.height) + screendc.DrawRectangle(rect.x+5, rect.y+rect.height-5, rect.width-10, 5) + RefreshDockingGuides(self._guides) + + return + + if not self._hint_window: + self.CreateHintWindow() + + if self._hint_window: + self._hint_window.SetRect(rect) + self._hint_window.Show() + + self._hint_fadeamt = self._hint_fademax + + if self._agwFlags & AUI_MGR_HINT_FADE: + self._hint_fadeamt = 0 + self._hint_window.SetTransparent(self._hint_fadeamt) + + if self._action == actionDragFloatingPane and self._action_window: + self._action_window.SetFocus() + + if self._hint_fadeamt != self._hint_fademax: # Only fade if we need to + # start fade in timer + self._hint_fadetimer.Start(5) + + self._last_hint = wx.Rect(*rect) + + + def HideHint(self): + """ Hides a transparent window hint if there is one. """ + + # hides a transparent window hint if there is one + if self._hint_window: + self._hint_window.Hide() + + self._hint_fadetimer.Stop() + self._last_hint = wx.Rect() + + + def IsPaneButtonVisible(self, part): + """ + Returns whether a pane button in the pane caption is visible. + + :param `part`: the UI part to analyze. + """ + + captionRect = wx.Rect() + + for temp_part in self._uiparts: + if temp_part.pane == part.pane and \ + temp_part.type == AuiDockUIPart.typeCaption: + captionRect = temp_part.rect + break + + return captionRect.ContainsRect(part.rect) + + + def DrawPaneButton(self, dc, part, pt): + """ + Draws a pane button in the caption (convenience function). + + :param `dc`: a `wx.DC` device context object; + :param `part`: the UI part to analyze; + :param `pt`: a `wx.Point` object, specifying the mouse location. + """ + + if not self.IsPaneButtonVisible(part): + return + + state = AUI_BUTTON_STATE_NORMAL + + if part.rect.Contains(pt): + + if _VERSION_STRING < "2.9": + leftDown = wx.GetMouseState().LeftDown() + else: + leftDown = wx.GetMouseState().LeftIsDown() + + if leftDown: + state = AUI_BUTTON_STATE_PRESSED + else: + state = AUI_BUTTON_STATE_HOVER + + self._art.DrawPaneButton(dc, self._frame, part.button.button_id, + state, part.rect, part.pane) + + + def RefreshButton(self, part): + """ + Refreshes a pane button in the caption. + + :param `part`: the UI part to analyze. + """ + + rect = wx.Rect(*part.rect) + rect.Inflate(2, 2) + self._frame.Refresh(True, rect) + self._frame.Update() + + + def RefreshCaptions(self): + """ Refreshes all pane captions. """ + + for part in self._uiparts: + if part.type == AuiDockUIPart.typeCaption: + self._frame.Refresh(True, part.rect) + self._frame.Update() + + + def CalculateHintRect(self, pane_window, pt, offset): + """ + Calculates the drop hint rectangle. + + The method first calls L{DoDrop} to determine the exact position the pane would + be at were if dropped. If the pane would indeed become docked at the + specified drop point, the the rectangle hint will be returned in + screen coordinates. Otherwise, an empty rectangle is returned. + + :param `pane_window`: it is the window pointer of the pane being dragged; + :param `pt`: is the mouse position, in client coordinates; + :param `offset`: describes the offset that the mouse is from the upper-left + corner of the item being dragged. + """ + + # we need to paint a hint rectangle to find out the exact hint rectangle, + # we will create a new temporary layout and then measure the resulting + # rectangle we will create a copy of the docking structures (self._docks) + # so that we don't modify the real thing on screen + + rect = wx.Rect() + pane = self.GetPane(pane_window) + + attrs = self.GetAttributes(pane) + hint = AuiPaneInfo() + hint = self.SetAttributes(hint, attrs) + + if hint.name != "__HINT__": + self._oldname = hint.name + + hint.name = "__HINT__" + hint.PaneBorder(True) + hint.Show() + + if not hint.IsOk(): + hint.name = self._oldname + return rect + + docks, panes = CopyDocksAndPanes2(self._docks, self._panes) + + # remove any pane already there which bears the same window + # this happens when you are moving a pane around in a dock + for ii in xrange(len(panes)): + if panes[ii].window == pane_window: + docks = RemovePaneFromDocks(docks, panes[ii]) + panes.pop(ii) + break + + # find out where the new pane would be + allow, hint = self.DoDrop(docks, panes, hint, pt, offset) + + if not allow: + return rect + + panes.append(hint) + + sizer, panes, docks, uiparts = self.LayoutAll(panes, docks, [], True, False) + + client_size = self._frame.GetClientSize() + sizer.SetDimension(0, 0, client_size.x, client_size.y) + sizer.Layout() + + sought = "__HINT__" + + # For a notebook page, actually look for the noteboot itself. + if hint.IsNotebookPage(): + id = hint.notebook_id + for pane in panes: + if pane.IsNotebookControl() and pane.notebook_id==id: + sought = pane.name + break + + for part in uiparts: + if part.pane and part.pane.name == sought: + rect.Union(wx.RectPS(part.sizer_item.GetPosition(), + part.sizer_item.GetSize())) + + sizer.Destroy() + + # check for floating frame ... + if rect.IsEmpty(): + for p in panes: + if p.name == sought and p.IsFloating(): + return wx.RectPS(p.floating_pos, p.floating_size) + + if rect.IsEmpty(): + return rect + + # actually show the hint rectangle on the screen + rect.x, rect.y = self._frame.ClientToScreen((rect.x, rect.y)) + if self._frame.GetLayoutDirection() == wx.Layout_RightToLeft: + # Mirror rectangle in RTL mode + rect.x -= rect.GetWidth() + + return rect + + + def DrawHintRect(self, pane_window, pt, offset): + """ + Calculates the hint rectangle by calling + L{CalculateHintRect}. If there is a rectangle, it shows it + by calling L{ShowHint}, otherwise it hides any hint + rectangle currently shown. + + :param `pane_window`: it is the window pointer of the pane being dragged; + :param `pt`: is the mouse position, in client coordinates; + :param `offset`: describes the offset that the mouse is from the upper-left + corner of the item being dragged. + """ + + rect = self.CalculateHintRect(pane_window, pt, offset) + + if rect.IsEmpty(): + self.HideHint() + self._hint_rect = wx.Rect() + else: + self.ShowHint(rect) + self._hint_rect = wx.Rect(*rect) + + + def GetPartSizerRect(self, uiparts): + """ + Returns the rectangle surrounding the specified UI parts. + + :param `uiparts`: UI parts. + """ + + rect = wx.Rect() + + for part in self._uiparts: + if part.pane and part.pane.name == "__HINT__": + rect.Union(wx.RectPS(part.sizer_item.GetPosition(), + part.sizer_item.GetSize())) + + return rect + + + def GetAttributes(self, pane): + """ + Returns all the attributes of a L{AuiPaneInfo}. + + :param `pane`: a L{AuiPaneInfo} instance. + """ + + attrs = [] + attrs.extend([pane.window, pane.frame, pane.state, pane.dock_direction, + pane.dock_layer, pane.dock_pos, pane.dock_row, pane.dock_proportion, + pane.floating_pos, pane.floating_size, pane.best_size, + pane.min_size, pane.max_size, pane.caption, pane.name, + pane.buttons, pane.rect, pane.icon, pane.notebook_id, + pane.transparent, pane.snapped, pane.minimize_mode]) + + return attrs + + + def SetAttributes(self, pane, attrs): + """ + Sets all the attributes contained in `attrs` to a L{AuiPaneInfo}. + + :param `pane`: a L{AuiPaneInfo} instance; + :param `attrs`: a list of attributes. + """ + + pane.window = attrs[0] + pane.frame = attrs[1] + pane.state = attrs[2] + pane.dock_direction = attrs[3] + pane.dock_layer = attrs[4] + pane.dock_pos = attrs[5] + pane.dock_row = attrs[6] + pane.dock_proportion = attrs[7] + pane.floating_pos = attrs[8] + pane.floating_size = attrs[9] + pane.best_size = attrs[10] + pane.min_size = attrs[11] + pane.max_size = attrs[12] + pane.caption = attrs[13] + pane.name = attrs[14] + pane.buttons = attrs[15] + pane.rect = attrs[16] + pane.icon = attrs[17] + pane.notebook_id = attrs[18] + pane.transparent = attrs[19] + pane.snapped = attrs[20] + pane.minimize_mode = attrs[21] + + return pane + + + def OnFloatingPaneResized(self, wnd, size): + """ + Handles the resizing of a floating pane. + + :param `wnd`: a `wx.Window` derived window, managed by the pane; + :param `size`: a `wx.Size` object, specifying the new pane floating size. + """ + + # try to find the pane + pane = self.GetPane(wnd) + if not pane.IsOk(): + raise Exception("Pane window not found") + + if pane.frame: + indx = self._panes.index(pane) + pane.floating_pos = pane.frame.GetPosition() + pane.floating_size = size + self._panes[indx] = pane + if pane.IsSnappable(): + self.SnapPane(pane, pane.floating_pos, pane.floating_size, True) + + + def OnFloatingPaneClosed(self, wnd, event): + """ + Handles the close event of a floating pane. + + :param `wnd`: a `wx.Window` derived window, managed by the pane; + :param `event`: a `wx.CloseEvent` to be processed. + """ + + # try to find the pane + pane = self.GetPane(wnd) + if not pane.IsOk(): + raise Exception("Pane window not found") + + # fire pane close event + e = AuiManagerEvent(wxEVT_AUI_PANE_CLOSE) + e.SetPane(pane) + e.SetCanVeto(event.CanVeto()) + self.ProcessMgrEvent(e) + + if e.GetVeto(): + event.Veto() + return + else: + # close the pane, but check that it + # still exists in our pane array first + # (the event handler above might have removed it) + + check = self.GetPane(wnd) + if check.IsOk(): + self.ClosePane(pane) + + + def OnFloatingPaneActivated(self, wnd): + """ + Handles the activation event of a floating pane. + + :param `wnd`: a `wx.Window` derived window, managed by the pane. + """ + + pane = self.GetPane(wnd) + if not pane.IsOk(): + raise Exception("Pane window not found") + + if self.GetAGWFlags() & AUI_MGR_ALLOW_ACTIVE_PANE: + ret, self._panes = SetActivePane(self._panes, wnd) + self.RefreshCaptions() + self.FireEvent(wxEVT_AUI_PANE_ACTIVATED, wnd, canVeto=False) + + + def OnFloatingPaneMoved(self, wnd, eventOrPt): + """ + Handles the move event of a floating pane. + + :param `wnd`: a `wx.Window` derived window, managed by the pane; + :param `eventOrPt`: a `wx.MoveEvent` to be processed or an instance of `wx.Point`. + """ + + pane = self.GetPane(wnd) + if not pane.IsOk(): + raise Exception("Pane window not found") + + if not pane.IsSnappable(): + return + + if isinstance(eventOrPt, wx.Point): + pane_pos = wx.Point(*eventOrPt) + else: + pane_pos = eventOrPt.GetPosition() + + pane_size = pane.floating_size + + self.SnapPane(pane, pane_pos, pane_size, False) + + + def SnapPane(self, pane, pane_pos, pane_size, toSnap=False): + """ + Snaps a floating pane to one of the main frame sides. + + :param `pane`: a L{AuiPaneInfo} instance; + :param `pane_pos`: the new pane floating position; + :param `pane_size`: the new pane floating size; + :param `toSnap`: a bool variable to check if L{SnapPane} was called from + a move event. + """ + + if self._from_move: + return + + managed_window = self.GetManagedWindow() + wnd_pos = managed_window.GetPosition() + wnd_size = managed_window.GetSize() + snapX, snapY = self._snap_limits + + if not toSnap: + pane.snapped = 0 + if pane.IsLeftSnappable(): + # Check if we can snap to the left + diff = wnd_pos.x - (pane_pos.x + pane_size.x) + if -snapX <= diff <= snapX: + pane.snapped = wx.LEFT + pane.floating_pos = wx.Point(wnd_pos.x-pane_size.x, pane_pos.y) + elif pane.IsTopSnappable(): + # Check if we can snap to the top + diff = wnd_pos.y - (pane_pos.y + pane_size.y) + if -snapY <= diff <= snapY: + pane.snapped = wx.TOP + pane.floating_pos = wx.Point(pane_pos.x, wnd_pos.y-pane_size.y) + elif pane.IsRightSnappable(): + # Check if we can snap to the right + diff = pane_pos.x - (wnd_pos.x + wnd_size.x) + if -snapX <= diff <= snapX: + pane.snapped = wx.RIGHT + pane.floating_pos = wx.Point(wnd_pos.x + wnd_size.x, pane_pos.y) + elif pane.IsBottomSnappable(): + # Check if we can snap to the bottom + diff = pane_pos.y - (wnd_pos.y + wnd_size.y) + if -snapY <= diff <= snapY: + pane.snapped = wx.BOTTOM + pane.floating_pos = wx.Point(pane_pos.x, wnd_pos.y + wnd_size.y) + + self.RepositionPane(pane, wnd_pos, wnd_size) + + + def RepositionPane(self, pane, wnd_pos, wnd_size): + """ + Repositions a pane after the main frame has been moved/resized. + + :param `pane`: a L{AuiPaneInfo} instance; + :param `wnd_pos`: the main frame position; + :param `wnd_size`: the main frame size. + """ + + pane_pos = pane.floating_pos + pane_size = pane.floating_size + + snap = pane.snapped + if snap == wx.LEFT: + floating_pos = wx.Point(wnd_pos.x - pane_size.x, pane_pos.y) + elif snap == wx.TOP: + floating_pos = wx.Point(pane_pos.x, wnd_pos.y - pane_size.y) + elif snap == wx.RIGHT: + floating_pos = wx.Point(wnd_pos.x + wnd_size.x, pane_pos.y) + elif snap == wx.BOTTOM: + floating_pos = wx.Point(pane_pos.x, wnd_pos.y + wnd_size.y) + + if snap: + if pane_pos != floating_pos: + pane.floating_pos = floating_pos + self._from_move = True + pane.frame.SetPosition(pane.floating_pos) + self._from_move = False + + + def OnGripperClicked(self, pane_window, start, offset): + """ + Handles the mouse click on the pane gripper. + + :param `pane_window`: a `wx.Window` derived window, managed by the pane; + :param `start`: a `wx.Point` object, specifying the clicking position; + :param `offset`: an offset point from the `start` position. + """ + + # try to find the pane + paneInfo = self.GetPane(pane_window) + + if not paneInfo.IsOk(): + raise Exception("Pane window not found") + + if self.GetAGWFlags() & AUI_MGR_ALLOW_ACTIVE_PANE: + # set the caption as active + ret, self._panes = SetActivePane(self._panes, pane_window) + self.RefreshCaptions() + self.FireEvent(wxEVT_AUI_PANE_ACTIVATED, pane_window, canVeto=False) + + self._action_part = None + self._action_pane = paneInfo + self._action_window = pane_window + self._action_start = start + self._action_offset = offset + self._toolbar_action_offset = wx.Point(*self._action_offset) + + self._frame.CaptureMouse() + + if paneInfo.IsDocked(): + self._action = actionClickCaption + else: + if paneInfo.IsToolbar(): + self._action = actionDragToolbarPane + else: + self._action = actionDragFloatingPane + + if paneInfo.frame: + + windowPt = paneInfo.frame.GetRect().GetTopLeft() + originPt = paneInfo.frame.ClientToScreen(wx.Point()) + self._action_offset += originPt - windowPt + self._toolbar_action_offset = wx.Point(*self._action_offset) + + if self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: + paneInfo.frame.SetTransparent(150) + + if paneInfo.IsToolbar(): + self._frame.SetCursor(wx.StockCursor(wx.CURSOR_SIZING)) + + + def OnRender(self, event): + """ + Draws all of the pane captions, sashes, + backgrounds, captions, grippers, pane borders and buttons. + It renders the entire user interface. It binds the ``EVT_AUI_RENDER`` event. + + :param `event`: an instance of L{AuiManagerEvent}. + """ + + # if the frame is about to be deleted, don't bother + if not self._frame or self._frame.IsBeingDeleted(): + return + + if not self._frame.GetSizer(): + return + + mouse = wx.GetMouseState() + mousePos = wx.Point(mouse.GetX(), mouse.GetY()) + point = self._frame.ScreenToClient(mousePos) + art = self._art + + dc = event.GetDC() + + for part in self._uiparts: + + # don't draw hidden pane items or items that aren't windows + if part.sizer_item and ((not part.sizer_item.IsWindow() and \ + not part.sizer_item.IsSpacer() and \ + not part.sizer_item.IsSizer()) or \ + not part.sizer_item.IsShown()): + + continue + + ptype = part.type + + if ptype in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: + art.DrawSash(dc, self._frame, part.orientation, part.rect) + + elif ptype == AuiDockUIPart.typeBackground: + art.DrawBackground(dc, self._frame, part.orientation, part.rect) + + elif ptype == AuiDockUIPart.typeCaption: + art.DrawCaption(dc, self._frame, part.pane.caption, part.rect, part.pane) + + elif ptype == AuiDockUIPart.typeGripper: + art.DrawGripper(dc, self._frame, part.rect, part.pane) + + elif ptype == AuiDockUIPart.typePaneBorder: + art.DrawBorder(dc, self._frame, part.rect, part.pane) + + elif ptype == AuiDockUIPart.typePaneButton: + self.DrawPaneButton(dc, part, point) + + + def Repaint(self, dc=None): + """ + Repaints the entire frame decorations (sashes, borders, buttons and so on). + It renders the entire user interface. + + :param `dc`: if not ``None``, an instance of `wx.PaintDC`. + """ + + w, h = self._frame.GetClientSize() + + # Figure out which dc to use; if one + # has been specified, use it, otherwise + # make a client dc + if dc is None: + client_dc = wx.ClientDC(self._frame) + dc = client_dc + + # If the frame has a toolbar, the client area + # origin will not be (0, 0). + pt = self._frame.GetClientAreaOrigin() + if pt.x != 0 or pt.y != 0: + dc.SetDeviceOrigin(pt.x, pt.y) + + # Render all the items + self.Render(dc) + + + def Render(self, dc): + """ + Fires a render event, which is normally handled by + L{OnRender}. This allows the render function to + be overridden via the render event. + + This can be useful for painting custom graphics in the main window. + Default behavior can be invoked in the overridden function by calling + L{OnRender}. + + :param `dc`: a `wx.DC` device context object. + """ + + e = AuiManagerEvent(wxEVT_AUI_RENDER) + e.SetManager(self) + e.SetDC(dc) + self.ProcessMgrEvent(e) + + + def OnCaptionDoubleClicked(self, pane_window): + """ + Handles the mouse double click on the pane caption. + + :param `pane_window`: a `wx.Window` derived window, managed by the pane. + """ + + # try to find the pane + paneInfo = self.GetPane(pane_window) + if not paneInfo.IsOk(): + raise Exception("Pane window not found") + + if not paneInfo.IsFloatable() or not paneInfo.IsDockable() or \ + self._agwFlags & AUI_MGR_ALLOW_FLOATING == 0: + return + + indx = self._panes.index(paneInfo) + win_rect = None + + if paneInfo.IsFloating(): + if paneInfo.name.startswith("__floating__"): + # It's a floating tab from a AuiNotebook + notebook = paneInfo.window.__aui_notebook__ + notebook.ReDockPage(paneInfo) + self.Update() + return + else: + + e = self.FireEvent(wxEVT_AUI_PANE_DOCKING, paneInfo, canVeto=True) + if e.GetVeto(): + self.HideHint() + ShowDockingGuides(self._guides, False) + return + + win_rect = paneInfo.frame.GetRect() + paneInfo.Dock() + if paneInfo.IsToolbar(): + paneInfo = self.SwitchToolBarOrientation(paneInfo) + + e = self.FireEvent(wxEVT_AUI_PANE_DOCKED, paneInfo, canVeto=False) + + else: + + e = self.FireEvent(wxEVT_AUI_PANE_FLOATING, paneInfo, canVeto=True) + if e.GetVeto(): + return + + # float the window + if paneInfo.IsMaximized(): + self.RestorePane(paneInfo) + + if paneInfo.floating_pos == wx.Point(-1, -1): + captionSize = self._art.GetMetric(AUI_DOCKART_CAPTION_SIZE) + paneInfo.floating_pos = pane_window.GetScreenPosition() + paneInfo.floating_pos.y -= captionSize + + paneInfo.Float() + e = self.FireEvent(wxEVT_AUI_PANE_FLOATED, paneInfo, canVeto=False) + + self._panes[indx] = paneInfo + self.Update() + + if win_rect and self._agwFlags & AUI_MGR_ANIMATE_FRAMES: + paneInfo = self.GetPane(pane_window) + pane_rect = paneInfo.window.GetScreenRect() + self.AnimateDocking(win_rect, pane_rect) + + + def OnPaint(self, event): + """ + Handles the ``wx.EVT_PAINT`` event for L{AuiManager}. + + :param `event`: an instance of `wx.PaintEvent` to be processed. + """ + + dc = wx.PaintDC(self._frame) + self.Repaint(dc) + + + def OnEraseBackground(self, event): + """ + Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{AuiManager}. + + :param `event`: `wx.EraseEvent` to be processed. + + :note: This is intentionally empty (excluding wxMAC) to reduce + flickering while drawing. + """ + + if wx.Platform == "__WXMAC__": + event.Skip() + + + def OnSize(self, event): + """ + Handles the ``wx.EVT_SIZE`` event for L{AuiManager}. + + :param `event`: a `wx.SizeEvent` to be processed. + """ + + skipped = False + if isinstance(self._frame, AuiFloatingFrame) and self._frame.IsShownOnScreen(): + skipped = True + event.Skip() + + if self._frame: + + self.DoFrameLayout() + if wx.Platform == "__WXMAC__": + self._frame.Refresh() + else: + self.Repaint() + + if isinstance(self._frame, wx.MDIParentFrame) or isinstance(self._frame, tabmdi.AuiMDIClientWindow) \ + or isinstance(self._frame, tabmdi.AuiMDIParentFrame): + # for MDI parent frames, this event must not + # be "skipped". In other words, the parent frame + # must not be allowed to resize the client window + # after we are finished processing sizing changes + return + + if not skipped: + event.Skip() + + # For the snap to screen... + self.OnMove(None) + + + def OnFindManager(self, event): + """ + Handles the ``EVT_AUI_FIND_MANAGER`` event for L{AuiManager}. + + :param `event`: a L{AuiManagerEvent} event to be processed. + """ + + # Initialize to None + event.SetManager(None) + + if not self._frame: + return + + # See it this window wants to overwrite + self._frame.ProcessEvent(event) + + # if no, it must be us + if not event.GetManager(): + event.SetManager(self) + + + def OnSetCursor(self, event): + """ + Handles the ``wx.EVT_SET_CURSOR`` event for L{AuiManager}. + + :param `event`: a `wx.SetCursorEvent` to be processed. + """ + + # determine cursor + part = self.HitTest(event.GetX(), event.GetY()) + cursor = wx.NullCursor + + if part: + if part.type in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: + + if not self.CheckMovableSizer(part): + return + + if part.orientation == wx.VERTICAL: + cursor = wx.StockCursor(wx.CURSOR_SIZEWE) + else: + cursor = wx.StockCursor(wx.CURSOR_SIZENS) + + elif part.type == AuiDockUIPart.typeGripper: + cursor = wx.StockCursor(wx.CURSOR_SIZING) + + event.SetCursor(cursor) + + + def UpdateButtonOnScreen(self, button_ui_part, event): + """ + Updates/redraws the UI part containing a pane button. + + :param `button_ui_part`: the UI part the button belongs to; + :param `event`: a `wx.MouseEvent` to be processed. + """ + + hit_test = self.HitTest(*event.GetPosition()) + + if not hit_test or not button_ui_part: + return + + state = AUI_BUTTON_STATE_NORMAL + + if hit_test == button_ui_part: + if event.LeftDown(): + state = AUI_BUTTON_STATE_PRESSED + else: + state = AUI_BUTTON_STATE_HOVER + else: + if event.LeftDown(): + state = AUI_BUTTON_STATE_HOVER + + # now repaint the button with hover state + cdc = wx.ClientDC(self._frame) + + # if the frame has a toolbar, the client area + # origin will not be (0,0). + pt = self._frame.GetClientAreaOrigin() + if pt.x != 0 or pt.y != 0: + cdc.SetDeviceOrigin(pt.x, pt.y) + + if hit_test.pane: + self._art.DrawPaneButton(cdc, self._frame, + button_ui_part.button.button_id, + state, + button_ui_part.rect, hit_test.pane) + + + def OnLeftDown(self, event): + """ + Handles the ``wx.EVT_LEFT_DOWN`` event for L{AuiManager}. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + part = self.HitTest(*event.GetPosition()) + + if not part: + event.Skip() + return + + self._currentDragItem = -1 + + if part.type in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: + + if not self.CheckMovableSizer(part): + return + + self._action = actionResize + self._action_part = part + self._action_pane = None + self._action_rect = wx.Rect() + self._action_start = wx.Point(event.GetX(), event.GetY()) + self._action_offset = wx.Point(event.GetX() - part.rect.x, + event.GetY() - part.rect.y) + + # draw the resize hint + rect = wx.RectPS(self._frame.ClientToScreen(part.rect.GetPosition()), + part.rect.GetSize()) + + self._action_rect = wx.Rect(*rect) + + if not AuiManager_HasLiveResize(self): + if wx.Platform == "__WXMAC__": + dc = wx.ClientDC(self._frame) + else: + dc = wx.ScreenDC() + + DrawResizeHint(dc, rect) + + self._frame.CaptureMouse() + + elif part.type == AuiDockUIPart.typePaneButton: + if self.IsPaneButtonVisible(part): + self._action = actionClickButton + self._action_part = part + self._action_pane = None + self._action_start = wx.Point(*event.GetPosition()) + self._frame.CaptureMouse() + + self.RefreshButton(part) + + elif part.type in [AuiDockUIPart.typeCaption, AuiDockUIPart.typeGripper]: + + # if we are managing a AuiFloatingFrame window, then + # we are an embedded AuiManager inside the AuiFloatingFrame. + # We want to initiate a toolbar drag in our owner manager + if isinstance(part.pane.window.GetParent(), AuiFloatingFrame): + rootManager = GetManager(part.pane.window) + else: + rootManager = self + + offset = wx.Point(event.GetX() - part.rect.x, event.GetY() - part.rect.y) + rootManager.OnGripperClicked(part.pane.window, event.GetPosition(), offset) + + if wx.Platform != "__WXMAC__": + event.Skip() + + + def OnLeftDClick(self, event): + """ + Handles the ``wx.EVT_LEFT_DCLICK`` event for L{AuiManager}. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + part = self.HitTest(event.GetX(), event.GetY()) + + if part and part.type == AuiDockUIPart.typeCaption: + if isinstance(part.pane.window.GetParent(), AuiFloatingFrame): + rootManager = GetManager(part.pane.window) + else: + rootManager = self + + rootManager.OnCaptionDoubleClicked(part.pane.window) + + elif part and part.type in [AuiDockUIPart.typeDockSizer, AuiDockUIPart.typePaneSizer]: + # Handles double click on AuiNotebook sashes to unsplit + sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) + for child in part.cont_sizer.GetChildren(): + if child.IsSizer(): + win = child.GetSizer().GetContainingWindow() + if isinstance(win, auibook.AuiNotebook): + win.UnsplitDClick(part, sash_size, event.GetPosition()) + break + + event.Skip() + + + def DoEndResizeAction(self, event): + """ + Ends a resize action, or for live update, resizes the sash. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + clientPt = event.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + return self.RestrictResize(clientPt, screenPt, createDC=False) + + + def RestrictResize(self, clientPt, screenPt, createDC): + """ Common method between L{DoEndResizeAction} and L{OnLeftUp_Resize}. """ + + dock = self._action_part.dock + pane = self._action_part.pane + + if createDC: + if wx.Platform == "__WXMAC__": + dc = wx.ClientDC(self._frame) + else: + dc = wx.ScreenDC() + + DrawResizeHint(dc, self._action_rect) + self._action_rect = wx.Rect() + + newPos = clientPt - self._action_offset + + if self._action_part.type == AuiDockUIPart.typeDockSizer: + minPix, maxPix = self.CalculateDockSizerLimits(dock) + else: + if not self._action_part.pane: + return + minPix, maxPix = self.CalculatePaneSizerLimits(dock, pane) + + if self._action_part.orientation == wx.HORIZONTAL: + newPos.y = Clip(newPos.y, minPix, maxPix) + else: + newPos.x = Clip(newPos.x, minPix, maxPix) + + if self._action_part.type == AuiDockUIPart.typeDockSizer: + + partnerDock = self.GetPartnerDock(dock) + sash_size = self._art.GetMetric(AUI_DOCKART_SASH_SIZE) + new_dock_size = 0 + direction = dock.dock_direction + + if direction == AUI_DOCK_LEFT: + new_dock_size = newPos.x - dock.rect.x + + elif direction == AUI_DOCK_TOP: + new_dock_size = newPos.y - dock.rect.y + + elif direction == AUI_DOCK_RIGHT: + new_dock_size = dock.rect.x + dock.rect.width - newPos.x - sash_size + + elif direction == AUI_DOCK_BOTTOM: + new_dock_size = dock.rect.y + dock.rect.height - newPos.y - sash_size + + deltaDockSize = new_dock_size - dock.size + + if partnerDock: + if deltaDockSize > partnerDock.size - sash_size: + deltaDockSize = partnerDock.size - sash_size + + partnerDock.size -= deltaDockSize + + dock.size += deltaDockSize + self.Update() + + else: + + # determine the new pixel size that the user wants + # this will help us recalculate the pane's proportion + if dock.IsHorizontal(): + oldPixsize = pane.rect.width + newPixsize = oldPixsize + newPos.x - self._action_part.rect.x + + else: + oldPixsize = pane.rect.height + newPixsize = oldPixsize + newPos.y - self._action_part.rect.y + + totalPixsize, totalProportion = self.GetTotalPixSizeAndProportion(dock) + partnerPane = self.GetPartnerPane(dock, pane) + + # prevent division by zero + if totalPixsize <= 0 or totalProportion <= 0 or not partnerPane: + return + + # adjust for the surplus + while (oldPixsize > 0 and totalPixsize > 10 and \ + oldPixsize*totalProportion/totalPixsize < pane.dock_proportion): + + totalPixsize -= 1 + + # calculate the new proportion of the pane + + newProportion = newPixsize*totalProportion/totalPixsize + newProportion = Clip(newProportion, 1, totalProportion) + deltaProp = newProportion - pane.dock_proportion + + if partnerPane.dock_proportion - deltaProp < 1: + deltaProp = partnerPane.dock_proportion - 1 + newProportion = pane.dock_proportion + deltaProp + + # borrow the space from our neighbor pane to the + # right or bottom (depending on orientation) + partnerPane.dock_proportion -= deltaProp + pane.dock_proportion = newProportion + + self.Update() + + return True + + + def OnLeftUp(self, event): + """ + Handles the ``wx.EVT_LEFT_UP`` event for L{AuiManager}. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + if self._action == actionResize: +## self._frame.Freeze() + self.OnLeftUp_Resize(event) +## self._frame.Thaw() + + elif self._action == actionClickButton: + self.OnLeftUp_ClickButton(event) + + elif self._action == actionDragFloatingPane: + self.OnLeftUp_DragFloatingPane(event) + + elif self._action == actionDragToolbarPane: + self.OnLeftUp_DragToolbarPane(event) + + else: + event.Skip() + + if self._frame.HasCapture(): + self._frame.ReleaseMouse() + + self._action = actionNone + + + def OnMotion(self, event): + """ + Handles the ``wx.EVT_MOTION`` event for L{AuiManager}. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + if self._action == actionResize: + self.OnMotion_Resize(event) + + elif self._action == actionClickCaption: + self.OnMotion_ClickCaption(event) + + elif self._action == actionDragFloatingPane: + self.OnMotion_DragFloatingPane(event) + + elif self._action == actionDragToolbarPane: + self.OnMotion_DragToolbarPane(event) + + else: + self.OnMotion_Other(event) + + + def OnLeaveWindow(self, event): + """ + Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{AuiManager}. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + if self._hover_button: + self.RefreshButton(self._hover_button) + self._hover_button = None + + + def OnCaptureLost(self, event): + """ + Handles the ``wx.EVT_MOUSE_CAPTURE_LOST`` event for L{AuiManager}. + + :param `event`: a `wx.MouseCaptureLostEvent` to be processed. + """ + + # cancel the operation in progress, if any + if self._action != actionNone: + self._action = actionNone + self.HideHint() + + + def OnHintFadeTimer(self, event): + """ + Handles the ``wx.EVT_TIMER`` event for L{AuiManager}. + + :param `event`: a `wx.TimerEvent` to be processed. + """ + + if not self._hint_window or self._hint_fadeamt >= self._hint_fademax: + self._hint_fadetimer.Stop() + return + + self._hint_fadeamt += 4 + self._hint_window.SetTransparent(self._hint_fadeamt) + + + def OnMove(self, event): + """ + Handles the ``wx.EVT_MOVE`` event for L{AuiManager}. + + :param `event`: a `wx.MoveEvent` to be processed. + """ + + if event is not None: + event.Skip() + + if isinstance(self._frame, AuiFloatingFrame) and self._frame.IsShownOnScreen(): + return + + docked, hAlign, vAlign, monitor = self._is_docked + if docked: + self.Snap() + + for pane in self._panes: + if pane.IsSnappable(): + if pane.IsFloating() and pane.IsShown(): + self.SnapPane(pane, pane.floating_pos, pane.floating_size, True) + + + def OnSysColourChanged(self, event): + """ + Handles the ``wx.EVT_SYS_COLOUR_CHANGED`` event for L{AuiManager}. + + :param `event`: a `wx.SysColourChangedEvent` to be processed. + """ + + # This event is probably triggered by a theme change + # so we have to re-init the art provider. + if self._art: + self._art.Init() + + if self._frame: + self.Update() + self._frame.Refresh() + + + def OnChildFocus(self, event): + """ + Handles the ``wx.EVT_CHILD_FOCUS`` event for L{AuiManager}. + + :param `event`: a `wx.ChildFocusEvent` to be processed. + """ + + # when a child pane has it's focus set, we should change the + # pane's active state to reflect this. (this is only true if + # active panes are allowed by the owner) + + window = event.GetWindow() + if isinstance(window, wx.Dialog): + # Ignore EVT_CHILD_FOCUS events originating from dialogs not + # managed by AUI + rootManager = None + elif isinstance(window.GetParent(), AuiFloatingFrame): + rootManager = GetManager(window) + else: + rootManager = self + + if rootManager: + rootManager.ActivatePane(window) + + event.Skip() + + + def OnMotion_ClickCaption(self, event): + """ + Sub-handler for the L{OnMotion} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + clientPt = event.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + drag_x_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_X) + drag_y_threshold = wx.SystemSettings.GetMetric(wx.SYS_DRAG_Y) + + if not self._action_pane: + return + + # we need to check if the mouse is now being dragged + if not (abs(clientPt.x - self._action_start.x) > drag_x_threshold or \ + abs(clientPt.y - self._action_start.y) > drag_y_threshold): + + return + + # dragged -- we need to change the mouse action to 'drag' + if self._action_pane.IsToolbar(): + self._action = actionDragToolbarPane + self._action_window = self._action_pane.window + + elif self._action_pane.IsFloatable() and self._agwFlags & AUI_MGR_ALLOW_FLOATING: + + e = self.FireEvent(wxEVT_AUI_PANE_FLOATING, self._action_pane, canVeto=True) + if e.GetVeto(): + return + + self._action = actionDragFloatingPane + + # set initial float position + self._action_pane.floating_pos = screenPt - self._action_offset + + # float the window + if self._action_pane.IsMaximized(): + self.RestorePane(self._action_pane) + + self._action_pane.Hide() + self._action_pane.Float() + if wx.Platform == "__WXGTK__": + self._action_pane.Show() + + e = self.FireEvent(wxEVT_AUI_PANE_FLOATED, self._action_pane, canVeto=False) + + if not self._action_pane.frame: + self.Update() + + self._action_window = self._action_pane.window + + # adjust action offset for window frame + windowPt = self._action_pane.frame.GetRect().GetTopLeft() + originPt = self._action_pane.frame.ClientToScreen(wx.Point()) + self._toolbar_action_offset = originPt - windowPt + + if self._agwFlags & AUI_MGR_USE_NATIVE_MINIFRAMES: + originPt = windowPt + wx.Point(3, 3) + + self._action_offset += originPt - windowPt + + # action offset is used here to make it feel "natural" to the user + # to drag a docked pane and suddenly have it become a floating frame. + # Sometimes, however, the offset where the user clicked on the docked + # caption is bigger than the width of the floating frame itself, so + # in that case we need to set the action offset to a sensible value + frame_size = self._action_pane.frame.GetSize() + if self._action_offset.x > frame_size.x * 2 / 3: + self._action_offset.x = frame_size.x / 2 + if self._action_offset.y > frame_size.y * 2 / 3: + self._action_offset.y = frame_size.y / 2 + + self.OnMotion_DragFloatingPane(event) + if wx.Platform != "__WXGTK__": + self._action_pane.Show() + + self.Update() + + + def OnMotion_Resize(self, event): + """ + Sub-handler for the L{OnMotion} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + if AuiManager_HasLiveResize(self): + if self._currentDragItem != -1: + self._action_part = self._uiparts[self._currentDragItem] + else: + self._currentDragItem = self._uiparts.index(self._action_part) + + if self._frame.HasCapture(): + self._frame.ReleaseMouse() + + self.DoEndResizeAction(event) + self._frame.CaptureMouse() + return + + if not self._action_part or not self._action_part.dock or not self._action_part.orientation: + return + + clientPt = event.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + dock = self._action_part.dock + pos = self._action_part.rect.GetPosition() + + if self._action_part.type == AuiDockUIPart.typeDockSizer: + minPix, maxPix = self.CalculateDockSizerLimits(dock) + else: + if not self._action_part.pane: + return + + pane = self._action_part.pane + minPix, maxPix = self.CalculatePaneSizerLimits(dock, pane) + + if self._action_part.orientation == wx.HORIZONTAL: + pos.y = Clip(clientPt.y - self._action_offset.y, minPix, maxPix) + else: + pos.x = Clip(clientPt.x - self._action_offset.x, minPix, maxPix) + + hintrect = wx.RectPS(self._frame.ClientToScreen(pos), self._action_part.rect.GetSize()) + + if hintrect != self._action_rect: + + if wx.Platform == "__WXMAC__": + dc = wx.ClientDC(self._frame) + else: + dc = wx.ScreenDC() + + DrawResizeHint(dc, self._action_rect) + DrawResizeHint(dc, hintrect) + self._action_rect = wx.Rect(*hintrect) + + + def OnLeftUp_Resize(self, event): + """ + Sub-handler for the L{OnLeftUp} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + if self._currentDragItem != -1 and AuiManager_HasLiveResize(self): + self._action_part = self._uiparts[self._currentDragItem] + + if self._frame.HasCapture(): + self._frame.ReleaseMouse() + + self.DoEndResizeAction(event) + self._currentDragItem = -1 + return + + if not self._action_part or not self._action_part.dock: + return + + clientPt = event.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + return self.RestrictResize(clientPt, screenPt, createDC=True) + + + def OnLeftUp_ClickButton(self, event): + """ + Sub-handler for the L{OnLeftUp} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + self._hover_button = None + + if self._action_part: + self.RefreshButton(self._action_part) + + # make sure we're still over the item that was originally clicked + if self._action_part == self.HitTest(*event.GetPosition()): + + # fire button-click event + e = AuiManagerEvent(wxEVT_AUI_PANE_BUTTON) + e.SetManager(self) + e.SetPane(self._action_part.pane) + e.SetButton(self._action_part.button.button_id) + self.ProcessMgrEvent(e) + + + def CheckPaneMove(self, pane): + """ + Checks if a pane has moved by a visible amount. + + :param `pane`: an instance of L{AuiPaneInfo}. + """ + + win_rect = pane.frame.GetRect() + win_rect.x, win_rect.y = pane.floating_pos + + if win_rect == self._last_rect: + return False + + # skip the first move event + if self._last_rect.IsEmpty(): + self._last_rect = wx.Rect(*win_rect) + return False + + # skip if moving too fast to avoid massive redraws and + # jumping hint windows + if abs(win_rect.x - self._last_rect.x) > 10 or \ + abs(win_rect.y - self._last_rect.y) > 10: + self._last_rect = wx.Rect(*win_rect) + return False + + return True + + + def OnMotion_DragFloatingPane(self, eventOrPt): + """ + Sub-handler for the L{OnMotion} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + isPoint = False + if isinstance(eventOrPt, wx.Point): + clientPt = self._frame.ScreenToClient(eventOrPt) + screenPt = wx.Point(*eventOrPt) + isPoint = True + else: + clientPt = eventOrPt.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + framePos = wx.Point() + + # try to find the pane + pane = self.GetPane(self._action_window) + if not pane.IsOk(): + raise Exception("Pane window not found") + + # update floating position + if pane.IsFloating(): + diff = pane.floating_pos - (screenPt - self._action_offset) + pane.floating_pos = screenPt - self._action_offset + + framePos = pane.floating_pos + + # Move the pane window + if pane.frame: + + if diff.x != 0 or diff.y != 0: + if wx.Platform == "__WXMSW__" and (self._agwFlags & AUI_MGR_TRANSPARENT_DRAG) == 0: # and not self.CheckPaneMove(pane): + # return + # HACK: Terrible hack on wxMSW (!) + pane.frame.SetTransparent(254) + + self._from_move = True + pane.frame.Move(pane.floating_pos) + self._from_move = False + + if self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: + pane.frame.SetTransparent(150) + + # calculate the offset from the upper left-hand corner + # of the frame to the mouse pointer + action_offset = screenPt - framePos + + # is the pane dockable? + if not self.CanDockPanel(pane): + self.HideHint() + ShowDockingGuides(self._guides, False) + return + + for paneInfo in self._panes: + + if not paneInfo.IsDocked() or not paneInfo.IsShown(): + continue + if paneInfo.IsToolbar() or paneInfo.IsNotebookControl(): + continue + if paneInfo.IsMaximized(): + continue + + if paneInfo.IsNotebookPage(): + + notebookRoot = GetNotebookRoot(self._panes, paneInfo.notebook_id) + + if not notebookRoot or not notebookRoot.IsDocked(): + continue + + rc = paneInfo.window.GetScreenRect() + if rc.Contains(screenPt): + if rc.height < 20 or rc.width < 20: + return + + self.UpdateDockingGuides(paneInfo) + ShowDockingGuides(self._guides, True) + break + + self.DrawHintRect(pane.window, clientPt, action_offset) + + + def OnLeftUp_DragFloatingPane(self, eventOrPt): + """ + Sub-handler for the L{OnLeftUp} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + if isinstance(eventOrPt, wx.Point): + clientPt = self._frame.ScreenToClient(eventOrPt) + screenPt = wx.Point(*eventOrPt) + else: + clientPt = eventOrPt.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + # try to find the pane + paneInfo = self.GetPane(self._action_window) + if not paneInfo.IsOk(): + raise Exception("Pane window not found") + + ret = False + + if paneInfo.frame: + + # calculate the offset from the upper left-hand corner + # of the frame to the mouse pointer + framePos = paneInfo.frame.GetPosition() + action_offset = screenPt - framePos + + # is the pane dockable? + if self.CanDockPanel(paneInfo): + # do the drop calculation + indx = self._panes.index(paneInfo) + ret, paneInfo = self.DoDrop(self._docks, self._panes, paneInfo, clientPt, action_offset) + + if ret: + e = self.FireEvent(wxEVT_AUI_PANE_DOCKING, paneInfo, canVeto=True) + if e.GetVeto(): + self.HideHint() + ShowDockingGuides(self._guides, False) + return + + e = self.FireEvent(wxEVT_AUI_PANE_DOCKED, paneInfo, canVeto=False) + + if self._agwFlags & AUI_MGR_SMOOTH_DOCKING: + self.SmoothDock(paneInfo) + + self._panes[indx] = paneInfo + + # if the pane is still floating, update it's floating + # position (that we store) + if paneInfo.IsFloating(): + paneInfo.floating_pos = paneInfo.frame.GetPosition() + if paneInfo.frame._transparent != paneInfo.transparent or self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: + paneInfo.frame.SetTransparent(paneInfo.transparent) + paneInfo.frame._transparent = paneInfo.transparent + + elif self._has_maximized: + self.RestoreMaximizedPane() + + # reorder for dropping to a new notebook + # (caution: this code breaks the reference!) + tempPaneInfo = self.CopyTarget(paneInfo) + self._panes.remove(paneInfo) + self._panes.append(tempPaneInfo) + + if ret: + self.Update() + + self.HideHint() + ShowDockingGuides(self._guides, False) + + + def OnMotion_DragToolbarPane(self, eventOrPt): + """ + Sub-handler for the L{OnMotion} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + isPoint = False + if isinstance(eventOrPt, wx.Point): + clientPt = self._frame.ScreenToClient(eventOrPt) + screenPt = wx.Point(*eventOrPt) + isPoint = True + else: + clientPt = eventOrPt.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + pane = self.GetPane(self._action_window) + if not pane.IsOk(): + raise Exception("Pane window not found") + + pane.state |= AuiPaneInfo.actionPane + indx = self._panes.index(pane) + + ret = False + wasFloating = pane.IsFloating() + # is the pane dockable? + if self.CanDockPanel(pane): + # do the drop calculation + ret, pane = self.DoDrop(self._docks, self._panes, pane, clientPt, self._action_offset) + + # update floating position + if pane.IsFloating(): + pane.floating_pos = screenPt - self._toolbar_action_offset + + # move the pane window + if pane.frame: + if wx.Platform == "__WXMSW__" and (self._agwFlags & AUI_MGR_TRANSPARENT_DRAG) == 0: # and not self.CheckPaneMove(pane): + # return + # HACK: Terrible hack on wxMSW (!) + pane.frame.SetTransparent(254) + + self._from_move = True + pane.frame.Move(pane.floating_pos) + self._from_move = False + + if self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: + pane.frame.SetTransparent(150) + + self._panes[indx] = pane + if ret and wasFloating != pane.IsFloating() or (ret and not wasFloating): + wx.CallAfter(self.Update) + + # when release the button out of the window. + # TODO: a better fix is needed. + + if _VERSION_STRING < "2.9": + leftDown = wx.GetMouseState().LeftDown() + else: + leftDown = wx.GetMouseState().LeftIsDown() + + if not leftDown: + self._action = actionNone + self.OnLeftUp_DragToolbarPane(eventOrPt) + + + def OnMotion_Other(self, event): + """ + Sub-handler for the L{OnMotion} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + part = self.HitTest(*event.GetPosition()) + + if part and part.type == AuiDockUIPart.typePaneButton \ + and self.IsPaneButtonVisible(part): + if part != self._hover_button: + + if self._hover_button: + self.RefreshButton(self._hover_button) + + self._hover_button = part + self.RefreshButton(part) + + else: + + if self._hover_button: + self.RefreshButton(self._hover_button) + else: + event.Skip() + + self._hover_button = None + + + def OnLeftUp_DragToolbarPane(self, eventOrPt): + """ + Sub-handler for the L{OnLeftUp} event. + + :param `event`: a `wx.MouseEvent` to be processed. + """ + + isPoint = False + if isinstance(eventOrPt, wx.Point): + clientPt = self._frame.ScreenToClient(eventOrPt) + screenPt = wx.Point(*eventOrPt) + isPoint = True + else: + clientPt = eventOrPt.GetPosition() + screenPt = self._frame.ClientToScreen(clientPt) + + # try to find the pane + pane = self.GetPane(self._action_window) + if not pane.IsOk(): + raise Exception("Pane window not found") + + if pane.IsFloating(): + pane.floating_pos = pane.frame.GetPosition() + if pane.frame._transparent != pane.transparent or self._agwFlags & AUI_MGR_TRANSPARENT_DRAG: + pane.frame.SetTransparent(pane.transparent) + pane.frame._transparent = pane.transparent + + # save the new positions + docks = FindDocks(self._docks, pane.dock_direction, pane.dock_layer, pane.dock_row) + if len(docks) == 1: + dock = docks[0] + pane_positions, pane_sizes = self.GetPanePositionsAndSizes(dock) + + for i in xrange(len(dock.panes)): + dock.panes[i].dock_pos = pane_positions[i] + + pane.state &= ~AuiPaneInfo.actionPane + self.Update() + + + def OnPaneButton(self, event): + """ + Handles the ``EVT_AUI_PANE_BUTTON`` event for L{AuiManager}. + + :param `event`: a L{AuiManagerEvent} event to be processed. + """ + + if not event.pane: + raise Exception("Pane Info passed to AuiManager.OnPaneButton must be non-null") + + pane = event.pane + + if event.button == AUI_BUTTON_CLOSE: + + if isinstance(pane.window.GetParent(), AuiFloatingFrame): + rootManager = GetManager(pane.window) + else: + rootManager = self + + if rootManager != self: + self._frame.Close() + return + + # fire pane close event + e = AuiManagerEvent(wxEVT_AUI_PANE_CLOSE) + e.SetManager(self) + e.SetPane(event.pane) + self.ProcessMgrEvent(e) + + if not e.GetVeto(): + + # close the pane, but check that it + # still exists in our pane array first + # (the event handler above might have removed it) + + check = self.GetPane(pane.window) + if check.IsOk(): + self.ClosePane(pane) + + self.Update() + + # mn this performs the minimizing of a pane + elif event.button == AUI_BUTTON_MINIMIZE: + e = AuiManagerEvent(wxEVT_AUI_PANE_MINIMIZE) + e.SetManager(self) + e.SetPane(event.pane) + self.ProcessMgrEvent(e) + + if not e.GetVeto(): + self.MinimizePane(pane) + + elif event.button == AUI_BUTTON_MAXIMIZE_RESTORE and not pane.IsMaximized(): + + # fire pane close event + e = AuiManagerEvent(wxEVT_AUI_PANE_MAXIMIZE) + e.SetManager(self) + e.SetPane(event.pane) + self.ProcessMgrEvent(e) + + if not e.GetVeto(): + + self.MaximizePane(pane) + self.Update() + + elif event.button == AUI_BUTTON_MAXIMIZE_RESTORE and pane.IsMaximized(): + + # fire pane close event + e = AuiManagerEvent(wxEVT_AUI_PANE_RESTORE) + e.SetManager(self) + e.SetPane(event.pane) + self.ProcessMgrEvent(e) + + if not e.GetVeto(): + + self.RestorePane(pane) + self.Update() + + elif event.button == AUI_BUTTON_PIN: + + if self._agwFlags & AUI_MGR_ALLOW_FLOATING and pane.IsFloatable(): + e = self.FireEvent(wxEVT_AUI_PANE_FLOATING, pane, canVeto=True) + if e.GetVeto(): + return + + pane.Float() + e = self.FireEvent(wxEVT_AUI_PANE_FLOATED, pane, canVeto=False) + + self.Update() + + + def MinimizePane(self, paneInfo): + """ + Minimizes a pane in a newly and automatically created L{AuiToolBar}. + + Clicking on the minimize button causes a new L{AuiToolBar} to be created + and added to the frame manager (currently the implementation is such that + panes at West will have a toolbar at the right, panes at South will have + toolbars at the bottom etc...) and the pane is hidden in the manager. + + Clicking on the restore button on the newly created toolbar will result in the + toolbar being removed and the original pane being restored. + + :param `paneInfo`: a L{AuiPaneInfo} instance for the pane to be minimized. + """ + + if not paneInfo.IsToolbar(): + + if paneInfo.IsMinimized(): + # We are already minimized + return + + # Basically the idea is this. + # + # 1) create a toolbar, with a restore button + # + # 2) place the new toolbar in the toolbar area representative of the location of the pane + # (NORTH/SOUTH/EAST/WEST, central area always to the right) + # + # 3) Hide the minimizing pane + + + # personalize the toolbar style + tbStyle = AUI_TB_DEFAULT_STYLE + posMask = paneInfo.minimize_mode & AUI_MINIMIZE_POS_MASK + captMask = paneInfo.minimize_mode & AUI_MINIMIZE_CAPT_MASK + dockDirection = paneInfo.dock_direction + if captMask != 0: + tbStyle |= AUI_TB_TEXT + if posMask == AUI_MINIMIZE_POS_SMART: + if paneInfo.dock_direction in [AUI_DOCK_TOP, AUI_DOCK_BOTTOM]: + tbStyle |= AUI_TB_HORZ_LAYOUT + + elif paneInfo.dock_direction in [AUI_DOCK_LEFT, AUI_DOCK_RIGHT, AUI_DOCK_CENTER]: + tbStyle |= AUI_TB_VERTICAL + if captMask == AUI_MINIMIZE_CAPT_SMART: + tbStyle |= AUI_TB_CLOCKWISE + + elif posMask in [AUI_MINIMIZE_POS_TOP, AUI_MINIMIZE_POS_BOTTOM]: + tbStyle |= AUI_TB_HORZ_LAYOUT + if posMask == AUI_MINIMIZE_POS_TOP: + dockDirection = AUI_DOCK_TOP + else: + dockDirection = AUI_DOCK_BOTTOM + + else: + tbStyle |= AUI_TB_VERTICAL + if captMask == AUI_MINIMIZE_CAPT_SMART: + tbStyle |= AUI_TB_CLOCKWISE + if posMask == AUI_MINIMIZE_POS_LEFT: + dockDirection = AUI_DOCK_LEFT + elif posMask == AUI_MINIMIZE_POS_RIGHT: + dockDirection = AUI_DOCK_RIGHT + elif posMask == AUI_MINIMIZE_POS_BOTTOM: + dockDirection = AUI_DOCK_BOTTOM + + # Create a new toolbar + # give it the same name as the minimized pane with _min appended + + win_rect = paneInfo.window.GetScreenRect() + + minimize_toolbar = auibar.AuiToolBar(self.GetManagedWindow(), agwStyle=tbStyle) + minimize_toolbar.Hide() + minimize_toolbar.SetToolBitmapSize(wx.Size(16, 16)) + + if paneInfo.icon and paneInfo.icon.IsOk(): + restore_bitmap = paneInfo.icon + else: + restore_bitmap = self._art._restore_bitmap + + minimize_toolbar.AddSimpleTool(ID_RESTORE_FRAME, paneInfo.caption, restore_bitmap, "Restore " + paneInfo.caption) + minimize_toolbar.SetAuiManager(self) + minimize_toolbar.Realize() + toolpanelname = paneInfo.name + "_min" + + if paneInfo.IsMaximized(): + paneInfo.SetFlag(paneInfo.wasMaximized, True) + + if dockDirection == AUI_DOCK_TOP: + self.AddPane(minimize_toolbar, AuiPaneInfo(). \ + Name(toolpanelname).Caption(paneInfo.caption). \ + ToolbarPane().Top().BottomDockable(False). \ + LeftDockable(False).RightDockable(False).DestroyOnClose()) + + elif dockDirection == AUI_DOCK_BOTTOM: + self.AddPane(minimize_toolbar, AuiPaneInfo(). \ + Name(toolpanelname).Caption(paneInfo.caption). \ + ToolbarPane().Bottom().TopDockable(False). \ + LeftDockable(False).RightDockable(False).DestroyOnClose()) + + elif dockDirection == AUI_DOCK_LEFT: + self.AddPane(minimize_toolbar, AuiPaneInfo(). \ + Name(toolpanelname).Caption(paneInfo.caption). \ + ToolbarPane().Left().TopDockable(False). \ + BottomDockable(False).RightDockable(False).DestroyOnClose()) + + elif dockDirection in [AUI_DOCK_RIGHT, AUI_DOCK_CENTER]: + self.AddPane(minimize_toolbar, AuiPaneInfo(). \ + Name(toolpanelname).Caption(paneInfo.caption). \ + ToolbarPane().Right().TopDockable(False). \ + LeftDockable(False).BottomDockable(False).DestroyOnClose()) + + arr = FindDocks(self._docks, paneInfo.dock_direction, paneInfo.dock_layer, paneInfo.dock_row) + + if arr: + dock = arr[0] + paneInfo.previousDockSize = dock.size + + paneInfo.previousDockPos = paneInfo.dock_pos + + # mark ourselves minimized + paneInfo.Minimize() + paneInfo.Show(False) + self._has_minimized = True + # last, hide the window + if paneInfo.window and paneInfo.window.IsShown(): + paneInfo.window.Show(False) + + minimize_toolbar.Show() + self.Update() + if self._agwFlags & AUI_MGR_ANIMATE_FRAMES: + self.AnimateDocking(win_rect, minimize_toolbar.GetScreenRect()) + + + def OnRestoreMinimizedPane(self, event): + """ + Handles the ``EVT_AUI_PANE_MIN_RESTORE`` event for L{AuiManager}. + + :param `event`: an instance of L{AuiManagerEvent} to be processed. + """ + + self.RestoreMinimizedPane(event.pane) + + + def OnPaneDocked(self, event): + """ + Handles the ``EVT_AUI_PANE_DOCKED`` event for L{AuiManager}. + + :param `event`: an instance of L{AuiManagerEvent} to be processed. + """ + + event.Skip() + self.RemoveAutoNBCaption(event.GetPane()) + + + def CreateNotebookBase(self, panes, paneInfo): + """ + Creates an auto-notebook base from a pane, and then add that pane as a page. + + :param `panes`: Set of panes to append new notebook base pane to + :param `paneInfo`: L{AuiPaneInfo} instance to convert to new notebook. + """ + + # Create base notebook pane ... + nbid = len(self._notebooks) + + baseInfo = AuiPaneInfo() + baseInfo.SetDockPos(paneInfo).NotebookControl(nbid). \ + CloseButton(False).SetNameFromNotebookId(). \ + NotebookDockable(False).Floatable(paneInfo.IsFloatable()) + baseInfo.best_size = paneInfo.best_size + panes.append(baseInfo) + + # add original pane as tab ... + paneInfo.NotebookPage(nbid) + + def RemoveAutoNBCaption(self, pane): + """ + Removes the caption on newly created automatic notebooks. + + :param `pane`: an instance of L{AuiPaneInfo} (the target notebook). + """ + + if self._agwFlags & AUI_MGR_AUTONB_NO_CAPTION == 0: + return False + + def RemoveCaption(): + """ Sub-function used to remove the pane caption on automatic notebooks. """ + + if pane.HasNotebook(): + notebook = self._notebooks[pane.notebook_id] + self.GetPane(notebook).CaptionVisible(False).PaneBorder(False) + self.Update() + + # it seems the notebook isnt created by this stage, so remove + # the caption a moment later + wx.CallAfter(RemoveCaption) + return True + + + def RestoreMinimizedPane(self, paneInfo): + """ + Restores a previously minimized pane. + + :param `paneInfo`: a L{AuiPaneInfo} instance for the pane to be restored. + """ + + panename = paneInfo.name + panename = panename[0:-4] + pane = self.GetPane(panename) + + pane.SetFlag(pane.needsRestore, True) + + if not pane.IsOk(): + panename = paneInfo.name + pane = self.GetPane(panename) + paneInfo = self.GetPane(panename + "_min") + if not paneInfo.IsOk(): + # Already minimized + return + + if pane.IsOk(): + if not pane.IsMinimized(): + return + + + if pane.HasFlag(pane.wasMaximized): + + self.SavePreviousDockSizes(pane) + + + self.ShowPane(pane.window, True) + pane.Show(True) + self._has_minimized = False + pane.SetFlag(pane.optionMinimized, False) + paneInfo.window.Show(False) + self.DetachPane(paneInfo.window) + paneInfo.Show(False) + paneInfo.Hide() + + self.Update() + + + def AnimateDocking(self, win_rect, pane_rect): + """ + Animates the minimization/docking of a pane a la Eclipse, using a `wx.ScreenDC` + to draw a "moving docking rectangle" on the screen. + + :param `win_rect`: the original pane screen rectangle; + :param `pane_rect`: the newly created toolbar/pane screen rectangle. + + :note: This functionality is not available on wxMAC as this platform doesn't have + the ability to use `wx.ScreenDC` to draw on-screen and on Windows > Vista. + """ + + if wx.Platform == "__WXMAC__": + # No wx.ScreenDC on the Mac... + return + if wx.Platform == "__WXMSW__" and wx.GetOsVersion()[1] > 5: + # No easy way to handle this on Vista... + return + + xstart, ystart = win_rect.x, win_rect.y + xend, yend = pane_rect.x, pane_rect.y + + step = self.GetAnimationStep() + + wstep = int(abs(win_rect.width - pane_rect.width)/step) + hstep = int(abs(win_rect.height - pane_rect.height)/step) + xstep = int(win_rect.x - pane_rect.x)/step + ystep = int(win_rect.y - pane_rect.y)/step + + dc = wx.ScreenDC() + dc.SetLogicalFunction(wx.INVERT) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.SetPen(wx.LIGHT_GREY_PEN) + + for i in xrange(int(step)): + width, height = win_rect.width - i*wstep, win_rect.height - i*hstep + x, y = xstart - i*xstep, ystart - i*ystep + new_rect = wx.Rect(x, y, width, height) + dc.DrawRoundedRectangleRect(new_rect, 3) + wx.SafeYield() + wx.MilliSleep(10) + dc.DrawRoundedRectangleRect(new_rect, 3) + + + def SmoothDock(self, paneInfo): + """ + This method implements a smooth docking effect for floating panes, similar to + what the PyQT library does with its floating windows. + + :param `paneInfo`: an instance of L{AuiPaneInfo}. + + :note: The smooth docking effect can only be used if you set the ``AUI_MGR_SMOOTH_DOCKING`` + style to L{AuiManager}. + """ + + if paneInfo.IsToolbar(): + return + + if not paneInfo.frame or self._hint_rect.IsEmpty(): + return + + hint_rect = self._hint_rect + win_rect = paneInfo.frame.GetScreenRect() + + xstart, ystart = win_rect.x, win_rect.y + xend, yend = hint_rect.x, hint_rect.y + + step = self.GetAnimationStep()/3 + + wstep = int((win_rect.width - hint_rect.width)/step) + hstep = int((win_rect.height - hint_rect.height)/step) + xstep = int((win_rect.x - hint_rect.x))/step + ystep = int((win_rect.y - hint_rect.y))/step + + for i in xrange(int(step)): + width, height = win_rect.width - i*wstep, win_rect.height - i*hstep + x, y = xstart - i*xstep, ystart - i*ystep + new_rect = wx.Rect(x, y, width, height) + paneInfo.frame.SetRect(new_rect) + wx.MilliSleep(10) + + + def SetSnapLimits(self, x, y): + """ + Modifies the snap limits used when snapping the `managed_window` to the screen + (using L{SnapToScreen}) or when snapping the floating panes to one side of the + `managed_window` (using L{SnapPane}). + + To change the limit after which the `managed_window` or the floating panes are + automatically stickled to the screen border (or to the `managed_window` side), + set these two variables. Default values are 15 pixels. + + :param `x`: the minimum horizontal distance below which the snap occurs; + :param `y`: the minimum vertical distance below which the snap occurs. + """ + + self._snap_limits = (x, y) + self.Snap() + + + def Snap(self): + """ + Snaps the main frame to specified position on the screen. + + :see: L{SnapToScreen} + """ + + snap, hAlign, vAlign, monitor = self._is_docked + if not snap: + return + + managed_window = self.GetManagedWindow() + snap_pos = self.GetSnapPosition() + wnd_pos = managed_window.GetPosition() + snapX, snapY = self._snap_limits + + if abs(snap_pos.x - wnd_pos.x) < snapX and abs(snap_pos.y - wnd_pos.y) < snapY: + managed_window.SetPosition(snap_pos) + + + def SnapToScreen(self, snap=True, monitor=0, hAlign=wx.RIGHT, vAlign=wx.TOP): + """ + Snaps the main frame to specified position on the screen. + + :param `snap`: whether to snap the main frame or not; + :param `monitor`: the monitor display in which snapping the window; + :param `hAlign`: the horizontal alignment of the snapping position; + :param `vAlign`: the vertical alignment of the snapping position. + """ + + if not snap: + self._is_docked = (False, wx.RIGHT, wx.TOP, 0) + return + + displayCount = wx.Display.GetCount() + if monitor > displayCount: + raise Exception("Invalid monitor selected: you only have %d monitors"%displayCount) + + self._is_docked = (True, hAlign, vAlign, monitor) + self.GetManagedWindow().SetPosition(self.GetSnapPosition()) + + + def GetSnapPosition(self): + """ Returns the main frame snapping position. """ + + snap, hAlign, vAlign, monitor = self._is_docked + + display = wx.Display(monitor) + area = display.GetClientArea() + size = self.GetManagedWindow().GetSize() + + pos = wx.Point() + if hAlign == wx.LEFT: + pos.x = area.x + elif hAlign == wx.CENTER: + pos.x = area.x + (area.width - size.x)/2 + else: + pos.x = area.x + area.width - size.x + + if vAlign == wx.TOP: + pos.y = area.y + elif vAlign == wx.CENTER: + pos.y = area.y + (area.height - size.y)/2 + else: + pos.y = area.y + area.height - size.y + + return pos + + + def GetAnimationStep(self): + """ Returns the animation step speed (a float) to use in L{AnimateDocking}. """ + + return self._animation_step + + + def SetAnimationStep(self, step): + """ + Sets the animation step speed (a float) to use in L{AnimateDocking}. + + :param `step`: a floating point value for the animation speed. + """ + + self._animation_step = float(step) + + + def RequestUserAttention(self, pane_window): + """ + Requests the user attention by intermittently highlighting the pane caption. + + :param `pane_window`: a `wx.Window` derived window, managed by the pane. + """ + + # try to find the pane + paneInfo = self.GetPane(pane_window) + if not paneInfo.IsOk(): + raise Exception("Pane window not found") + + dc = wx.ClientDC(self._frame) + + # if the frame is about to be deleted, don't bother + if not self._frame or self._frame.IsBeingDeleted(): + return + + if not self._frame.GetSizer(): + return + + for part in self._uiparts: + if part.pane == paneInfo: + self._art.RequestUserAttention(dc, self._frame, part.pane.caption, part.rect, part.pane) + self._frame.RefreshRect(part.rect, True) + break + + + def StartPreviewTimer(self, toolbar): + """ + Starts a timer for sliding in and out a minimized pane. + + :param `toolbar`: the L{AuiToolBar} containing the minimized pane tool. + """ + + toolbar_pane = self.GetPane(toolbar) + toolbar_name = toolbar_pane.name + + pane_name = toolbar_name[0:-4] + + self._sliding_pane = self.GetPane(pane_name) + self._sliding_rect = toolbar.GetScreenRect() + self._sliding_direction = toolbar_pane.dock_direction + self._sliding_frame = None + + self._preview_timer.Start(1000, wx.TIMER_ONE_SHOT) + + + def StopPreviewTimer(self): + """ Stops a timer for sliding in and out a minimized pane. """ + + if self._preview_timer.IsRunning(): + self._preview_timer.Stop() + + self.SlideOut() + self._sliding_pane = None + + + def SlideIn(self, event): + """ + Handles the ``wx.EVT_TIMER`` event for L{AuiManager}. + + :param `event`: a `wx.TimerEvent` to be processed. + + :note: This is used solely for sliding in and out minimized panes. + """ + + window = self._sliding_pane.window + self._sliding_frame = wx.MiniFrame(None, -1, title=_("Pane Preview"), + style=wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP | + wx.FRAME_NO_TASKBAR | wx.CAPTION) + window.Reparent(self._sliding_frame) + self._sliding_frame.SetSize((0, 0)) + window.Show() + self._sliding_frame.Show() + + size = window.GetBestSize() + + startX, startY, stopX, stopY = GetSlidingPoints(self._sliding_rect, size, self._sliding_direction) + + step = stopX/10 + window_size = 0 + + for i in xrange(0, stopX, step): + window_size = i + self._sliding_frame.SetDimensions(startX, startY, window_size, stopY) + self._sliding_frame.Refresh() + self._sliding_frame.Update() + wx.MilliSleep(10) + + self._sliding_frame.SetDimensions(startX, startY, stopX, stopY) + self._sliding_frame.Refresh() + self._sliding_frame.Update() + + + def SlideOut(self): + """ + Slides out a preview of a minimized pane. + + :note: This is used solely for sliding in and out minimized panes. + """ + + if not self._sliding_frame: + return + + window = self._sliding_frame.GetChildren()[0] + size = window.GetBestSize() + + startX, startY, stopX, stopY = GetSlidingPoints(self._sliding_rect, size, self._sliding_direction) + + step = stopX/10 + window_size = 0 + + for i in xrange(stopX, 0, -step): + window_size = i + self._sliding_frame.SetDimensions(startX, startY, window_size, stopY) + self._sliding_frame.Refresh() + self._sliding_frame.Update() + self._frame.RefreshRect(wx.Rect(startX+window_size, startY, step, stopY)) + self._frame.Update() + wx.MilliSleep(10) + + self._sliding_frame.SetDimensions(startX, startY, 0, stopY) + + window.Hide() + window.Reparent(self._frame) + + self._sliding_frame.Hide() + self._sliding_frame.Destroy() + self._sliding_frame = None + self._sliding_pane = None + + +class AuiManager_DCP(AuiManager): + """ + A class similar to L{AuiManager} but with a Dummy Center Pane (**DCP**). + The code for this class is still flickery due to the call to `wx.CallAfter` + and the double-update call. + """ + + def __init__(self, *args, **keys): + + AuiManager.__init__(self, *args, **keys) + self.hasDummyPane = False + + + def _createDummyPane(self): + """ Creates a Dummy Center Pane (**DCP**). """ + + if self.hasDummyPane: + return + + self.hasDummyPane = True + dummy = wx.Panel(self.GetManagedWindow()) + info = AuiPaneInfo().CenterPane().NotebookDockable(True).Name('dummyCenterPane').DestroyOnClose(True) + self.AddPane(dummy, info) + + + def _destroyDummyPane(self): + """ Destroys the Dummy Center Pane (**DCP**). """ + + if not self.hasDummyPane: + return + + self.hasDummyPane = False + self.ClosePane(self.GetPane('dummyCenterPane')) + + + def Update(self): + """ + This method is called after any number of changes are made to any of the + managed panes. L{Update} must be invoked after L{AuiManager.AddPane} or L{AuiManager.InsertPane} are + called in order to "realize" or "commit" the changes. + + In addition, any number of changes may be made to L{AuiPaneInfo} structures + (retrieved with L{AuiManager.GetPane}), but to realize the changes, L{Update} + must be called. This construction allows pane flicker to be avoided by updating + the whole layout at one time. + """ + + AuiManager.Update(self) + + # check if there's already a center pane (except our dummy pane) + dummyCenterPane = self.GetPane('dummyCenterPane') + haveCenterPane = any((pane != dummyCenterPane) and (pane.dock_direction == AUI_DOCK_CENTER) and + not pane.IsFloating() and pane.IsShown() for pane in self.GetAllPanes()) + if haveCenterPane: + if self.hasDummyPane: + # there's our dummy pane and also another center pane, therefor let's remove our dummy + def do(): + self._destroyDummyPane() + self.Update() + wx.CallAfter(do) + else: + # if we get here, there's no center pane, create our dummy + if not self.hasDummyPane: + self._createDummyPane() + + diff --git a/autres/aui/tabart.py b/autres/aui/tabart.py new file mode 100644 index 0000000..60b8e01 --- /dev/null +++ b/autres/aui/tabart.py @@ -0,0 +1,2777 @@ +""" +Tab art provider code - a tab provider provides all drawing functionality to +the L{AuiNotebook}. This allows the L{AuiNotebook} to have a plugable look-and-feel. + +By default, a L{AuiNotebook} uses an instance of this class called L{AuiDefaultTabArt} +which provides bitmap art and a colour scheme that is adapted to the major platforms' +look. You can either derive from that class to alter its behaviour or write a +completely new tab art class. Call L{AuiNotebook.SetArtProvider} to make use this +new tab art. +""" + +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx + +if wx.Platform == '__WXMAC__': + import Carbon.Appearance + +from aui_utilities import BitmapFromBits, StepColour, IndentPressedBitmap, ChopText +from aui_utilities import GetBaseColour, DrawMACCloseButton, LightColour, TakeScreenShot +from aui_utilities import CopyAttributes + +from aui_constants import * + + +# -- GUI helper classes and functions -- +class AuiCommandCapture(wx.PyEvtHandler): + """ A class to handle the dropdown window menu. """ + + def __init__(self): + """ Default class constructor. """ + + wx.PyEvtHandler.__init__(self) + self._last_id = 0 + + + def GetCommandId(self): + """ Returns the event command identifier. """ + + return self._last_id + + + def ProcessEvent(self, event): + """ + Processes an event, searching event tables and calling zero or more suitable + event handler function(s). + + :param `event`: the event to process. + + :note: Normally, your application would not call this function: it is called + in the wxPython implementation to dispatch incoming user interface events + to the framework (and application). + However, you might need to call it if implementing new functionality (such as + a new control) where you define new event types, as opposed to allowing the + user to override functions. + + An instance where you might actually override the L{ProcessEvent} function is where + you want to direct event processing to event handlers not normally noticed by + wxPython. For example, in the document/view architecture, documents and views + are potential event handlers. When an event reaches a frame, L{ProcessEvent} will + need to be called on the associated document and view in case event handler + functions are associated with these objects. + + The normal order of event table searching is as follows: + + 1. If the object is disabled (via a call to `SetEvtHandlerEnabled`) the function + skips to step (6). + 2. If the object is a `wx.Window`, L{ProcessEvent} is recursively called on the window's + `wx.Validator`. If this returns ``True``, the function exits. + 3. wxWidgets `SearchEventTable` is called for this event handler. If this fails, the + base class table is tried, and so on until no more tables exist or an appropriate + function was found, in which case the function exits. + 4. The search is applied down the entire chain of event handlers (usually the chain + has a length of one). If this succeeds, the function exits. + 5. If the object is a `wx.Window` and the event is a `wx.CommandEvent`, L{ProcessEvent} is + recursively applied to the parent window's event handler. If this returns ``True``, + the function exits. + 6. Finally, L{ProcessEvent} is called on the `wx.App` object. + """ + + if event.GetEventType() == wx.wxEVT_COMMAND_MENU_SELECTED: + self._last_id = event.GetId() + return True + + if self.GetNextHandler(): + return self.GetNextHandler().ProcessEvent(event) + + return False + + +class AuiDefaultTabArt(object): + """ + Tab art provider code - a tab provider provides all drawing functionality to + the L{AuiNotebook}. This allows the L{AuiNotebook} to have a plugable look-and-feel. + + By default, a L{AuiNotebook} uses an instance of this class called L{AuiDefaultTabArt} + which provides bitmap art and a colour scheme that is adapted to the major platforms' + look. You can either derive from that class to alter its behaviour or write a + completely new tab art class. Call L{AuiNotebook.SetArtProvider} to make use this + new tab art. + """ + + def __init__(self): + """ Default class constructor. """ + + self._normal_font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) + self._selected_font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) + self._selected_font.SetWeight(wx.BOLD) + self._measuring_font = self._selected_font + + self._fixed_tab_width = 100 + self._tab_ctrl_height = 0 + self._buttonRect = wx.Rect() + + self.SetDefaultColours() + + if wx.Platform == "__WXMAC__": + bmp_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW) + self._active_close_bmp = DrawMACCloseButton(bmp_colour) + self._disabled_close_bmp = DrawMACCloseButton(wx.Colour(128, 128, 128)) + else: + self._active_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.BLACK) + self._disabled_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.Colour(128, 128, 128)) + + self._hover_close_bmp = self._active_close_bmp + self._pressed_close_bmp = self._active_close_bmp + + self._active_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.BLACK) + self._disabled_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.Colour(128, 128, 128)) + + self._active_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.BLACK) + self._disabled_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.Colour(128, 128, 128)) + + self._active_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.BLACK) + self._disabled_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.Colour(128, 128, 128)) + + if wx.Platform == "__WXMAC__": + # Get proper highlight colour for focus rectangle from the + # current Mac theme. kThemeBrushFocusHighlight is + # available on Mac OS 8.5 and higher + if hasattr(wx, 'MacThemeColour'): + c = wx.MacThemeColour(Carbon.Appearance.kThemeBrushFocusHighlight) + else: + brush = wx.Brush(wx.BLACK) + brush.MacSetTheme(Carbon.Appearance.kThemeBrushFocusHighlight) + c = brush.GetColour() + self._focusPen = wx.Pen(c, 2, wx.SOLID) + else: + self._focusPen = wx.Pen(wx.BLACK, 1, wx.USER_DASH) + self._focusPen.SetDashes([1, 1]) + self._focusPen.SetCap(wx.CAP_BUTT) + + + def SetBaseColour(self, base_colour): + """ + Sets a new base colour. + + :param `base_colour`: an instance of `wx.Colour`. + """ + + self._base_colour = base_colour + self._base_colour_pen = wx.Pen(self._base_colour) + self._base_colour_brush = wx.Brush(self._base_colour) + + + def SetDefaultColours(self, base_colour=None): + """ + Sets the default colours, which are calculated from the given base colour. + + :param `base_colour`: an instance of `wx.Colour`. If defaulted to ``None``, a colour + is generated accordingly to the platform and theme. + """ + + if base_colour is None: + base_colour = GetBaseColour() + + self.SetBaseColour( base_colour ) + self._border_colour = StepColour(base_colour, 75) + self._border_pen = wx.Pen(self._border_colour) + + self._background_top_colour = StepColour(self._base_colour, 90) + self._background_bottom_colour = StepColour(self._base_colour, 170) + + self._tab_top_colour = self._base_colour + self._tab_bottom_colour = wx.WHITE + self._tab_gradient_highlight_colour = wx.WHITE + + self._tab_inactive_top_colour = self._base_colour + self._tab_inactive_bottom_colour = StepColour(self._tab_inactive_top_colour, 160) + + self._tab_text_colour = lambda page: page.text_colour + self._tab_disabled_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT) + + + def Clone(self): + """ Clones the art object. """ + + art = type(self)() + art.SetNormalFont(self.GetNormalFont()) + art.SetSelectedFont(self.GetSelectedFont()) + art.SetMeasuringFont(self.GetMeasuringFont()) + + art = CopyAttributes(art, self) + return art + + + def SetAGWFlags(self, agwFlags): + """ + Sets the tab art flags. + + :param `agwFlags`: a combination of the following values: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook + ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. + ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. + ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook + ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab + ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging + ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control + ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width + ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed + ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available + ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar + ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab + ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs + ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click + ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks + ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present + ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows + ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items + ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) + ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages + ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) + ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs + ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle + ==================================== ================================== + + """ + + self._agwFlags = agwFlags + + + def GetAGWFlags(self): + """ + Returns the tab art flags. + + :see: L{SetAGWFlags} for a list of possible return values. + """ + + return self._agwFlags + + + def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): + """ + Sets the tab sizing information. + + :param `tab_ctrl_size`: the size of the tab control area; + :param `tab_count`: the number of tabs; + :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths + to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. + """ + + self._fixed_tab_width = 100 + minTabWidth, maxTabWidth = minMaxTabWidth + + tot_width = tab_ctrl_size.x - self.GetIndentSize() - 4 + agwFlags = self.GetAGWFlags() + + if agwFlags & AUI_NB_CLOSE_BUTTON: + tot_width -= self._active_close_bmp.GetWidth() + if agwFlags & AUI_NB_WINDOWLIST_BUTTON: + tot_width -= self._active_windowlist_bmp.GetWidth() + + if tab_count > 0: + self._fixed_tab_width = tot_width/tab_count + + if self._fixed_tab_width < 100: + self._fixed_tab_width = 100 + + if self._fixed_tab_width > tot_width/2: + self._fixed_tab_width = tot_width/2 + + if self._fixed_tab_width > 220: + self._fixed_tab_width = 220 + + if minTabWidth > -1: + self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) + if maxTabWidth > -1: + self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) + + self._tab_ctrl_height = tab_ctrl_size.y + + + def DrawBackground(self, dc, wnd, rect): + """ + Draws the tab area background. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `rect`: the tab control rectangle. + """ + + self._buttonRect = wx.Rect() + + # draw background + agwFlags = self.GetAGWFlags() + if agwFlags & AUI_NB_BOTTOM: + r = wx.Rect(rect.x, rect.y, rect.width+2, rect.height) + + # TODO: else if (agwFlags & AUI_NB_LEFT) + # TODO: else if (agwFlags & AUI_NB_RIGHT) + else: #for AUI_NB_TOP + r = wx.Rect(rect.x, rect.y, rect.width+2, rect.height-3) + + dc.GradientFillLinear(r, self._background_top_colour, self._background_bottom_colour, wx.SOUTH) + + # draw base lines + + dc.SetPen(self._border_pen) + y = rect.GetHeight() + w = rect.GetWidth() + + if agwFlags & AUI_NB_BOTTOM: + dc.SetBrush(wx.Brush(self._background_bottom_colour)) + dc.DrawRectangle(-1, 0, w+2, 4) + + # TODO: else if (agwFlags & AUI_NB_LEFT) + # TODO: else if (agwFlags & AUI_NB_RIGHT) + + else: # for AUI_NB_TOP + dc.SetBrush(self._base_colour_brush) + dc.DrawRectangle(-1, y-4, w+2, 4) + + + def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): + """ + Draws a single tab. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `page`: the tab control page associated with the tab; + :param `in_rect`: rectangle the tab should be confined to; + :param `close_button_state`: the state of the close button on the tab; + :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. + """ + + # if the caption is empty, measure some temporary text + caption = page.caption + if not caption: + caption = "Xj" + + dc.SetFont(self._selected_font) + selected_textx, selected_texty, dummy = dc.GetMultiLineTextExtent(caption) + + dc.SetFont(self._normal_font) + normal_textx, normal_texty, dummy = dc.GetMultiLineTextExtent(caption) + + control = page.control + + # figure out the size of the tab + tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, + page.active, close_button_state, control) + + tab_height = self._tab_ctrl_height - 3 + tab_width = tab_size[0] + tab_x = in_rect.x + tab_y = in_rect.y + in_rect.height - tab_height + + caption = page.caption + + # select pen, brush and font for the tab to be drawn + + if page.active: + + dc.SetFont(self._selected_font) + textx, texty = selected_textx, selected_texty + + else: + + dc.SetFont(self._normal_font) + textx, texty = normal_textx, normal_texty + + if not page.enabled: + dc.SetTextForeground(self._tab_disabled_text_colour) + pagebitmap = page.dis_bitmap + else: + dc.SetTextForeground(self._tab_text_colour(page)) + pagebitmap = page.bitmap + + # create points that will make the tab outline + + clip_width = tab_width + if tab_x + clip_width > in_rect.x + in_rect.width: + clip_width = in_rect.x + in_rect.width - tab_x + + # since the above code above doesn't play well with WXDFB or WXCOCOA, + # we'll just use a rectangle for the clipping region for now -- + dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3) + + border_points = [wx.Point() for i in xrange(6)] + agwFlags = self.GetAGWFlags() + + if agwFlags & AUI_NB_BOTTOM: + + border_points[0] = wx.Point(tab_x, tab_y) + border_points[1] = wx.Point(tab_x, tab_y+tab_height-6) + border_points[2] = wx.Point(tab_x+2, tab_y+tab_height-4) + border_points[3] = wx.Point(tab_x+tab_width-2, tab_y+tab_height-4) + border_points[4] = wx.Point(tab_x+tab_width, tab_y+tab_height-6) + border_points[5] = wx.Point(tab_x+tab_width, tab_y) + + else: #if (agwFlags & AUI_NB_TOP) + + border_points[0] = wx.Point(tab_x, tab_y+tab_height-4) + border_points[1] = wx.Point(tab_x, tab_y+2) + border_points[2] = wx.Point(tab_x+2, tab_y) + border_points[3] = wx.Point(tab_x+tab_width-2, tab_y) + border_points[4] = wx.Point(tab_x+tab_width, tab_y+2) + border_points[5] = wx.Point(tab_x+tab_width, tab_y+tab_height-4) + + # TODO: else if (agwFlags & AUI_NB_LEFT) + # TODO: else if (agwFlags & AUI_NB_RIGHT) + + drawn_tab_yoff = border_points[1].y + drawn_tab_height = border_points[0].y - border_points[1].y + + if page.active: + + # draw active tab + + # draw base background colour + r = wx.Rect(tab_x, tab_y, tab_width, tab_height) + dc.SetPen(self._base_colour_pen) + dc.SetBrush(self._base_colour_brush) + dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4) + + # this white helps fill out the gradient at the top of the tab + dc.SetPen( wx.Pen(self._tab_gradient_highlight_colour) ) + dc.SetBrush( wx.Brush(self._tab_gradient_highlight_colour) ) + dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4) + + # these two points help the rounded corners appear more antialiased + dc.SetPen(self._base_colour_pen) + dc.DrawPoint(r.x+2, r.y+1) + dc.DrawPoint(r.x+r.width-2, r.y+1) + + # set rectangle down a bit for gradient drawing + r.SetHeight(r.GetHeight()/2) + r.x += 2 + r.width -= 2 + r.y += r.height + r.y -= 2 + + # draw gradient background + top_colour = self._tab_bottom_colour + bottom_colour = self._tab_top_colour + dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) + + else: + + # draw inactive tab + + r = wx.Rect(tab_x, tab_y+1, tab_width, tab_height-3) + + # start the gradent up a bit and leave the inside border inset + # by a pixel for a 3D look. Only the top half of the inactive + # tab will have a slight gradient + r.x += 3 + r.y += 1 + r.width -= 4 + r.height /= 2 + r.height -= 1 + + # -- draw top gradient fill for glossy look + top_colour = self._tab_inactive_top_colour + bottom_colour = self._tab_inactive_bottom_colour + dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) + + r.y += r.height + r.y -= 1 + + # -- draw bottom fill for glossy look + top_colour = self._tab_inactive_bottom_colour + bottom_colour = self._tab_inactive_bottom_colour + dc.GradientFillLinear(r, top_colour, bottom_colour, wx.SOUTH) + + # draw tab outline + dc.SetPen(self._border_pen) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.DrawPolygon(border_points) + + # there are two horizontal grey lines at the bottom of the tab control, + # this gets rid of the top one of those lines in the tab control + if page.active: + + if agwFlags & AUI_NB_BOTTOM: + dc.SetPen(wx.Pen(self._background_bottom_colour)) + + # TODO: else if (agwFlags & AUI_NB_LEFT) + # TODO: else if (agwFlags & AUI_NB_RIGHT) + else: # for AUI_NB_TOP + dc.SetPen(self._base_colour_pen) + + dc.DrawLine(border_points[0].x+1, + border_points[0].y, + border_points[5].x, + border_points[5].y) + + text_offset = tab_x + 8 + close_button_width = 0 + + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + close_button_width = self._active_close_bmp.GetWidth() + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + text_offset += close_button_width - 5 + + bitmap_offset = 0 + + if pagebitmap.IsOk(): + + bitmap_offset = tab_x + 8 + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: + bitmap_offset += close_button_width - 5 + + # draw bitmap + dc.DrawBitmap(pagebitmap, + bitmap_offset, + drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2), + True) + + text_offset = bitmap_offset + pagebitmap.GetWidth() + text_offset += 3 # bitmap padding + + else: + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: + text_offset = tab_x + 8 + + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) + + ypos = drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1 + + offset_focus = text_offset + if control is not None: + if control.GetPosition() != wx.Point(text_offset+1, ypos): + control.SetPosition(wx.Point(text_offset+1, ypos)) + + if not control.IsShown(): + control.Show() + + if paint_control: + bmp = TakeScreenShot(control.GetScreenRect()) + dc.DrawBitmap(bmp, text_offset+1, ypos, True) + + controlW, controlH = control.GetSize() + text_offset += controlW + 4 + textx += controlW + 4 + + # draw tab text + rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) + dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) + + # draw focus rectangle + if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: + self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff, drawn_tab_height, rectx, recty) + + out_button_rect = wx.Rect() + + # draw close button if necessary + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + + bmp = self._disabled_close_bmp + + if close_button_state == AUI_BUTTON_STATE_HOVER: + bmp = self._hover_close_bmp + elif close_button_state == AUI_BUTTON_STATE_PRESSED: + bmp = self._pressed_close_bmp + + shift = (agwFlags & AUI_NB_BOTTOM and [1] or [0])[0] + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + rect = wx.Rect(tab_x + 4, tab_y + (tab_height - bmp.GetHeight())/2 - shift, + close_button_width, tab_height) + else: + rect = wx.Rect(tab_x + tab_width - close_button_width - 1, + tab_y + (tab_height - bmp.GetHeight())/2 - shift, + close_button_width, tab_height) + + rect = IndentPressedBitmap(rect, close_button_state) + dc.DrawBitmap(bmp, rect.x, rect.y, True) + + out_button_rect = rect + + out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) + + dc.DestroyClippingRegion() + + return out_tab_rect, out_button_rect, x_extent + + + def SetCustomButton(self, bitmap_id, button_state, bmp): + """ + Sets a custom bitmap for the close, left, right and window list + buttons. + + :param `bitmap_id`: the button identifier; + :param `button_state`: the button state; + :param `bmp`: the custom bitmap to use for the button. + """ + + if bitmap_id == AUI_BUTTON_CLOSE: + if button_state == AUI_BUTTON_STATE_NORMAL: + self._active_close_bmp = bmp + self._hover_close_bmp = self._active_close_bmp + self._pressed_close_bmp = self._active_close_bmp + self._disabled_close_bmp = self._active_close_bmp + + elif button_state == AUI_BUTTON_STATE_HOVER: + self._hover_close_bmp = bmp + elif button_state == AUI_BUTTON_STATE_PRESSED: + self._pressed_close_bmp = bmp + else: + self._disabled_close_bmp = bmp + + elif bitmap_id == AUI_BUTTON_LEFT: + if button_state & AUI_BUTTON_STATE_DISABLED: + self._disabled_left_bmp = bmp + else: + self._active_left_bmp = bmp + + elif bitmap_id == AUI_BUTTON_RIGHT: + if button_state & AUI_BUTTON_STATE_DISABLED: + self._disabled_right_bmp = bmp + else: + self._active_right_bmp = bmp + + elif bitmap_id == AUI_BUTTON_WINDOWLIST: + if button_state & AUI_BUTTON_STATE_DISABLED: + self._disabled_windowlist_bmp = bmp + else: + self._active_windowlist_bmp = bmp + + + def GetIndentSize(self): + """ Returns the tabs indent size. """ + + return 5 + + + def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): + """ + Returns the tab size for the given caption, bitmap and button state. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `caption`: the tab text caption; + :param `bitmap`: the bitmap displayed on the tab; + :param `active`: whether the tab is selected or not; + :param `close_button_state`: the state of the close button on the tab; + :param `control`: a `wx.Window` instance inside a tab (or ``None``). + """ + + dc.SetFont(self._measuring_font) + measured_textx, measured_texty, dummy = dc.GetMultiLineTextExtent(caption) + + # add padding around the text + tab_width = measured_textx + tab_height = measured_texty + + # if the close button is showing, add space for it + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + tab_width += self._active_close_bmp.GetWidth() + 3 + + # if there's a bitmap, add space for it + if bitmap.IsOk(): + tab_width += bitmap.GetWidth() + tab_width += 3 # right side bitmap padding + tab_height = max(tab_height, bitmap.GetHeight()) + + # add padding + tab_width += 16 + tab_height += 10 + + agwFlags = self.GetAGWFlags() + if agwFlags & AUI_NB_TAB_FIXED_WIDTH: + tab_width = self._fixed_tab_width + + if control is not None: + tab_width += control.GetSize().GetWidth() + 4 + + x_extent = tab_width + + return (tab_width, tab_height), x_extent + + + def DrawButton(self, dc, wnd, in_rect, button, orientation): + """ + Draws a button on the tab or on the tab area, depending on the button identifier. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `in_rect`: rectangle the tab should be confined to; + :param `button`: an instance of the button class; + :param `orientation`: the tab orientation. + """ + + bitmap_id, button_state = button.id, button.cur_state + + if bitmap_id == AUI_BUTTON_CLOSE: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_close_bmp + elif button_state & AUI_BUTTON_STATE_HOVER: + bmp = self._hover_close_bmp + elif button_state & AUI_BUTTON_STATE_PRESSED: + bmp = self._pressed_close_bmp + else: + bmp = self._active_close_bmp + + elif bitmap_id == AUI_BUTTON_LEFT: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_left_bmp + else: + bmp = self._active_left_bmp + + elif bitmap_id == AUI_BUTTON_RIGHT: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_right_bmp + else: + bmp = self._active_right_bmp + + elif bitmap_id == AUI_BUTTON_WINDOWLIST: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_windowlist_bmp + else: + bmp = self._active_windowlist_bmp + + else: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = button.dis_bitmap + else: + bmp = button.bitmap + + if not bmp.IsOk(): + return + + rect = wx.Rect(*in_rect) + + if orientation == wx.LEFT: + + rect.SetX(in_rect.x) + rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)) + rect.SetWidth(bmp.GetWidth()) + rect.SetHeight(bmp.GetHeight()) + + else: + + rect = wx.Rect(in_rect.x + in_rect.width - bmp.GetWidth(), + ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), + bmp.GetWidth(), bmp.GetHeight()) + + rect = IndentPressedBitmap(rect, button_state) + dc.DrawBitmap(bmp, rect.x, rect.y, True) + + out_rect = rect + + if bitmap_id == AUI_BUTTON_RIGHT: + self._buttonRect = wx.Rect(rect.x, rect.y, 30, rect.height) + + return out_rect + + + def DrawFocusRectangle(self, dc, page, wnd, draw_text, text_offset, bitmap_offset, drawn_tab_yoff, drawn_tab_height, textx, texty): + """ + Draws the focus rectangle on a tab. + + :param `dc`: a `wx.DC` device context; + :param `page`: the page associated with the tab; + :param `wnd`: a `wx.Window` instance object; + :param `draw_text`: the text that has been drawn on the tab; + :param `text_offset`: the text offset on the tab; + :param `bitmap_offset`: the bitmap offset on the tab; + :param `drawn_tab_yoff`: the y offset of the tab text; + :param `drawn_tab_height`: the height of the tab; + :param `textx`: the x text extent; + :param `texty`: the y text extent. + """ + + if self.GetAGWFlags() & AUI_NB_NO_TAB_FOCUS: + return + + if page.active and wx.Window.FindFocus() == wnd: + + focusRectText = wx.Rect(text_offset, (drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2)), + textx, texty) + + if page.bitmap.IsOk(): + focusRectBitmap = wx.Rect(bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), + page.bitmap.GetWidth(), page.bitmap.GetHeight()) + + if page.bitmap.IsOk() and draw_text == "": + focusRect = wx.Rect(*focusRectBitmap) + elif not page.bitmap.IsOk() and draw_text != "": + focusRect = wx.Rect(*focusRectText) + elif page.bitmap.IsOk() and draw_text != "": + focusRect = focusRectText.Union(focusRectBitmap) + + focusRect.Inflate(2, 2) + + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.SetPen(self._focusPen) + dc.DrawRoundedRectangleRect(focusRect, 2) + + + def GetBestTabCtrlSize(self, wnd, pages, required_bmp_size): + """ + Returns the best tab control size. + + :param `wnd`: a `wx.Window` instance object; + :param `pages`: the pages associated with the tabs; + :param `required_bmp_size`: the size of the bitmap on the tabs. + """ + + dc = wx.ClientDC(wnd) + dc.SetFont(self._measuring_font) + + # sometimes a standard bitmap size needs to be enforced, especially + # if some tabs have bitmaps and others don't. This is important because + # it prevents the tab control from resizing when tabs are added. + + measure_bmp = wx.NullBitmap + + if required_bmp_size.IsFullySpecified(): + measure_bmp = wx.EmptyBitmap(required_bmp_size.x, + required_bmp_size.y) + + max_y = 0 + + for page in pages: + + if measure_bmp.IsOk(): + bmp = measure_bmp + else: + bmp = page.bitmap + + # we don't use the caption text because we don't + # want tab heights to be different in the case + # of a very short piece of text on one tab and a very + # tall piece of text on another tab + s, x_ext = self.GetTabSize(dc, wnd, page.caption, bmp, True, AUI_BUTTON_STATE_HIDDEN, None) + max_y = max(max_y, s[1]) + + if page.control: + controlW, controlH = page.control.GetSize() + max_y = max(max_y, controlH+4) + + return max_y + 2 + + + def SetNormalFont(self, font): + """ + Sets the normal font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._normal_font = font + + + def SetSelectedFont(self, font): + """ + Sets the selected tab font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._selected_font = font + + + def SetMeasuringFont(self, font): + """ + Sets the font for calculating text measurements. + + :param `font`: a `wx.Font` object. + """ + + self._measuring_font = font + + + def GetNormalFont(self): + """ Returns the normal font for drawing tab labels. """ + + return self._normal_font + + + def GetSelectedFont(self): + """ Returns the selected tab font for drawing tab labels. """ + + return self._selected_font + + + def GetMeasuringFont(self): + """ Returns the font for calculating text measurements. """ + + return self._measuring_font + + + def ShowDropDown(self, wnd, pages, active_idx): + """ + Shows the drop-down window menu on the tab area. + + :param `wnd`: a `wx.Window` derived window instance; + :param `pages`: the pages associated with the tabs; + :param `active_idx`: the active tab index. + """ + + useImages = self.GetAGWFlags() & AUI_NB_USE_IMAGES_DROPDOWN + menuPopup = wx.Menu() + + longest = 0 + for i, page in enumerate(pages): + + caption = page.caption + + # if there is no caption, make it a space. This will prevent + # an assert in the menu code. + if caption == "": + caption = " " + + # Save longest caption width for calculating menu width with + width = wnd.GetTextExtent(caption)[0] + if width > longest: + longest = width + + if useImages: + menuItem = wx.MenuItem(menuPopup, 1000+i, caption) + if page.bitmap: + menuItem.SetBitmap(page.bitmap) + + menuPopup.AppendItem(menuItem) + + else: + + menuPopup.AppendCheckItem(1000+i, caption) + + menuPopup.Enable(1000+i, page.enabled) + + if active_idx != -1 and not useImages: + + menuPopup.Check(1000+active_idx, True) + + # find out the screen coordinate at the bottom of the tab ctrl + cli_rect = wnd.GetClientRect() + + # Calculate the approximate size of the popupmenu for setting the + # position of the menu when its shown. + # Account for extra padding on left/right of text on mac menus + if wx.Platform in ['__WXMAC__', '__WXMSW__']: + longest += 32 + + # Bitmap/Checkmark width + padding + longest += 20 + + if self.GetAGWFlags() & AUI_NB_CLOSE_BUTTON: + longest += 16 + + pt = wx.Point(cli_rect.x + cli_rect.GetWidth() - longest, + cli_rect.y + cli_rect.height) + + cc = AuiCommandCapture() + wnd.PushEventHandler(cc) + wnd.PopupMenu(menuPopup, pt) + command = cc.GetCommandId() + wnd.PopEventHandler(True) + + if command >= 1000: + return command - 1000 + + return -1 + + +class AuiSimpleTabArt(object): + """ A simple-looking implementation of a tab art. """ + + def __init__(self): + """ Default class constructor. """ + + self._normal_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + self._selected_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + self._selected_font.SetWeight(wx.BOLD) + self._measuring_font = self._selected_font + + self._agwFlags = 0 + self._fixed_tab_width = 100 + + base_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE) + + background_colour = base_colour + normaltab_colour = base_colour + selectedtab_colour = wx.WHITE + + self._bkbrush = wx.Brush(background_colour) + self._normal_bkbrush = wx.Brush(normaltab_colour) + self._normal_bkpen = wx.Pen(normaltab_colour) + self._selected_bkbrush = wx.Brush(selectedtab_colour) + self._selected_bkpen = wx.Pen(selectedtab_colour) + + self._active_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.BLACK) + self._disabled_close_bmp = BitmapFromBits(nb_close_bits, 16, 16, wx.Colour(128, 128, 128)) + + self._active_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.BLACK) + self._disabled_left_bmp = BitmapFromBits(nb_left_bits, 16, 16, wx.Colour(128, 128, 128)) + + self._active_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.BLACK) + self._disabled_right_bmp = BitmapFromBits(nb_right_bits, 16, 16, wx.Colour(128, 128, 128)) + + self._active_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.BLACK) + self._disabled_windowlist_bmp = BitmapFromBits(nb_list_bits, 16, 16, wx.Colour(128, 128, 128)) + + + def Clone(self): + """ Clones the art object. """ + + art = type(self)() + art.SetNormalFont(self.GetNormalFont()) + art.SetSelectedFont(self.GetSelectedFont()) + art.SetMeasuringFont(self.GetMeasuringFont()) + + art = CopyAttributes(art, self) + return art + + + def SetAGWFlags(self, agwFlags): + """ + Sets the tab art flags. + + :param `agwFlags`: a combination of the following values: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook + ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. + ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. + ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook + ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab + ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging + ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control + ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width + ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed + ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available + ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar + ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab + ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs + ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click + ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks + ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present + ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows + ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items + ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) + ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages + ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) + ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs + ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle + ==================================== ================================== + + """ + + self._agwFlags = agwFlags + + + def GetAGWFlags(self): + """ + Returns the tab art flags. + + :see: L{SetAGWFlags} for a list of possible return values. + """ + + return self._agwFlags + + + def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): + """ + Sets the tab sizing information. + + :param `tab_ctrl_size`: the size of the tab control area; + :param `tab_count`: the number of tabs; + :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths + to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. + """ + + self._fixed_tab_width = 100 + minTabWidth, maxTabWidth = minMaxTabWidth + + tot_width = tab_ctrl_size.x - self.GetIndentSize() - 4 + + if self._agwFlags & AUI_NB_CLOSE_BUTTON: + tot_width -= self._active_close_bmp.GetWidth() + if self._agwFlags & AUI_NB_WINDOWLIST_BUTTON: + tot_width -= self._active_windowlist_bmp.GetWidth() + + if tab_count > 0: + self._fixed_tab_width = tot_width/tab_count + + if self._fixed_tab_width < 100: + self._fixed_tab_width = 100 + + if self._fixed_tab_width > tot_width/2: + self._fixed_tab_width = tot_width/2 + + if self._fixed_tab_width > 220: + self._fixed_tab_width = 220 + + if minTabWidth > -1: + self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) + if maxTabWidth > -1: + self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) + + self._tab_ctrl_height = tab_ctrl_size.y + + + def DrawBackground(self, dc, wnd, rect): + """ + Draws the tab area background. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `rect`: the tab control rectangle. + """ + + # draw background + dc.SetBrush(self._bkbrush) + dc.SetPen(wx.TRANSPARENT_PEN) + dc.DrawRectangle(-1, -1, rect.GetWidth()+2, rect.GetHeight()+2) + + # draw base line + dc.SetPen(wx.GREY_PEN) + dc.DrawLine(0, rect.GetHeight()-1, rect.GetWidth(), rect.GetHeight()-1) + + + def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): + """ + Draws a single tab. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `page`: the tab control page associated with the tab; + :param `in_rect`: rectangle the tab should be confined to; + :param `close_button_state`: the state of the close button on the tab; + :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. + """ + + # if the caption is empty, measure some temporary text + caption = page.caption + if caption == "": + caption = "Xj" + + agwFlags = self.GetAGWFlags() + + dc.SetFont(self._selected_font) + selected_textx, selected_texty, dummy = dc.GetMultiLineTextExtent(caption) + + dc.SetFont(self._normal_font) + normal_textx, normal_texty, dummy = dc.GetMultiLineTextExtent(caption) + + control = page.control + + # figure out the size of the tab + tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, + page.active, close_button_state, control) + + tab_height = tab_size[1] + tab_width = tab_size[0] + tab_x = in_rect.x + tab_y = in_rect.y + in_rect.height - tab_height + + caption = page.caption + # select pen, brush and font for the tab to be drawn + + if page.active: + + dc.SetPen(self._selected_bkpen) + dc.SetBrush(self._selected_bkbrush) + dc.SetFont(self._selected_font) + textx = selected_textx + texty = selected_texty + + else: + + dc.SetPen(self._normal_bkpen) + dc.SetBrush(self._normal_bkbrush) + dc.SetFont(self._normal_font) + textx = normal_textx + texty = normal_texty + + if not page.enabled: + dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) + else: + dc.SetTextForeground(page.text_colour) + + # -- draw line -- + + points = [wx.Point() for i in xrange(7)] + points[0].x = tab_x + points[0].y = tab_y + tab_height - 1 + points[1].x = tab_x + tab_height - 3 + points[1].y = tab_y + 2 + points[2].x = tab_x + tab_height + 3 + points[2].y = tab_y + points[3].x = tab_x + tab_width - 2 + points[3].y = tab_y + points[4].x = tab_x + tab_width + points[4].y = tab_y + 2 + points[5].x = tab_x + tab_width + points[5].y = tab_y + tab_height - 1 + points[6] = points[0] + + dc.SetClippingRect(in_rect) + dc.DrawPolygon(points) + + dc.SetPen(wx.GREY_PEN) + dc.DrawLines(points) + + close_button_width = 0 + + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + + close_button_width = self._active_close_bmp.GetWidth() + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + if control: + text_offset = tab_x + (tab_height/2) + close_button_width - (textx/2) - 2 + else: + text_offset = tab_x + (tab_height/2) + ((tab_width+close_button_width)/2) - (textx/2) - 2 + else: + if control: + text_offset = tab_x + (tab_height/2) + close_button_width - (textx/2) + else: + text_offset = tab_x + (tab_height/2) + ((tab_width-close_button_width)/2) - (textx/2) + + else: + + text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2) + if control: + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + text_offset = tab_x + (tab_height/3) - (textx/2) + close_button_width + 2 + else: + text_offset = tab_x + (tab_height/3) - (textx/2) + + # set minimum text offset + if text_offset < tab_x + tab_height: + text_offset = tab_x + tab_height + + # chop text if necessary + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x)) + else: + draw_text = ChopText(dc, caption, + tab_width - (text_offset-tab_x) - close_button_width) + + ypos = (tab_y + tab_height)/2 - (texty/2) + 1 + + if control is not None: + if control.GetPosition() != wx.Point(text_offset+1, ypos): + control.SetPosition(wx.Point(text_offset+1, ypos)) + + if not control.IsShown(): + control.Show() + + if paint_control: + bmp = TakeScreenShot(control.GetScreenRect()) + dc.DrawBitmap(bmp, text_offset+1, ypos, True) + + controlW, controlH = control.GetSize() + text_offset += controlW + 4 + + # draw tab text + rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) + dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) + + # draw focus rectangle + if page.active and wx.Window.FindFocus() == wnd and (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: + + focusRect = wx.Rect(text_offset, ((tab_y + tab_height)/2 - (texty/2) + 1), + selected_textx, selected_texty) + + focusRect.Inflate(2, 2) + # TODO: + # This should be uncommented when DrawFocusRect will become + # available in wxPython + # wx.RendererNative.Get().DrawFocusRect(wnd, dc, focusRect, 0) + + out_button_rect = wx.Rect() + # draw close button if necessary + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + + if page.active: + bmp = self._active_close_bmp + else: + bmp = self._disabled_close_bmp + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + rect = wx.Rect(tab_x + tab_height - 2, + tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, + close_button_width, tab_height - 1) + else: + rect = wx.Rect(tab_x + tab_width - close_button_width - 1, + tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, + close_button_width, tab_height - 1) + + self.DrawButtons(dc, rect, bmp, wx.WHITE, close_button_state) + out_button_rect = wx.Rect(*rect) + + out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) + dc.DestroyClippingRegion() + + return out_tab_rect, out_button_rect, x_extent + + + def DrawButtons(self, dc, _rect, bmp, bkcolour, button_state): + """ + Convenience method to draw tab buttons. + + :param `dc`: a `wx.DC` device context; + :param `_rect`: the tab rectangle; + :param `bmp`: the tab bitmap; + :param `bkcolour`: the tab background colour; + :param `button_state`: the state of the tab button. + """ + + rect = wx.Rect(*_rect) + + if button_state == AUI_BUTTON_STATE_PRESSED: + rect.x += 1 + rect.y += 1 + + if button_state in [AUI_BUTTON_STATE_HOVER, AUI_BUTTON_STATE_PRESSED]: + dc.SetBrush(wx.Brush(StepColour(bkcolour, 120))) + dc.SetPen(wx.Pen(StepColour(bkcolour, 75))) + + # draw the background behind the button + dc.DrawRectangle(rect.x, rect.y, 15, 15) + + # draw the button itself + dc.DrawBitmap(bmp, rect.x, rect.y, True) + + + def GetIndentSize(self): + """ Returns the tabs indent size. """ + + return 0 + + + def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): + """ + Returns the tab size for the given caption, bitmap and button state. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `caption`: the tab text caption; + :param `bitmap`: the bitmap displayed on the tab; + :param `active`: whether the tab is selected or not; + :param `close_button_state`: the state of the close button on the tab; + :param `control`: a `wx.Window` instance inside a tab (or ``None``). + """ + + dc.SetFont(self._measuring_font) + measured_textx, measured_texty, dummy = dc.GetMultiLineTextExtent(caption) + + tab_height = measured_texty + 4 + tab_width = measured_textx + tab_height + 5 + + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + tab_width += self._active_close_bmp.GetWidth() + + if self._agwFlags & AUI_NB_TAB_FIXED_WIDTH: + tab_width = self._fixed_tab_width + + if control is not None: + controlW, controlH = control.GetSize() + tab_width += controlW + 4 + + x_extent = tab_width - (tab_height/2) - 1 + + return (tab_width, tab_height), x_extent + + + def DrawButton(self, dc, wnd, in_rect, button, orientation): + """ + Draws a button on the tab or on the tab area, depending on the button identifier. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `in_rect`: rectangle the tab should be confined to; + :param `button`: an instance of the button class; + :param `orientation`: the tab orientation. + """ + + bitmap_id, button_state = button.id, button.cur_state + + if bitmap_id == AUI_BUTTON_CLOSE: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_close_bmp + else: + bmp = self._active_close_bmp + + elif bitmap_id == AUI_BUTTON_LEFT: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_left_bmp + else: + bmp = self._active_left_bmp + + elif bitmap_id == AUI_BUTTON_RIGHT: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_right_bmp + else: + bmp = self._active_right_bmp + + elif bitmap_id == AUI_BUTTON_WINDOWLIST: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = self._disabled_windowlist_bmp + else: + bmp = self._active_windowlist_bmp + + else: + if button_state & AUI_BUTTON_STATE_DISABLED: + bmp = button.dis_bitmap + else: + bmp = button.bitmap + + if not bmp.IsOk(): + return + + rect = wx.Rect(*in_rect) + + if orientation == wx.LEFT: + + rect.SetX(in_rect.x) + rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)) + rect.SetWidth(bmp.GetWidth()) + rect.SetHeight(bmp.GetHeight()) + + else: + + rect = wx.Rect(in_rect.x + in_rect.width - bmp.GetWidth(), + ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), + bmp.GetWidth(), bmp.GetHeight()) + + self.DrawButtons(dc, rect, bmp, wx.WHITE, button_state) + + out_rect = wx.Rect(*rect) + return out_rect + + + def ShowDropDown(self, wnd, pages, active_idx): + """ + Shows the drop-down window menu on the tab area. + + :param `wnd`: a `wx.Window` derived window instance; + :param `pages`: the pages associated with the tabs; + :param `active_idx`: the active tab index. + """ + + menuPopup = wx.Menu() + useImages = self.GetAGWFlags() & AUI_NB_USE_IMAGES_DROPDOWN + + for i, page in enumerate(pages): + + if useImages: + menuItem = wx.MenuItem(menuPopup, 1000+i, page.caption) + if page.bitmap: + menuItem.SetBitmap(page.bitmap) + + menuPopup.AppendItem(menuItem) + + else: + + menuPopup.AppendCheckItem(1000+i, page.caption) + + menuPopup.Enable(1000+i, page.enabled) + + if active_idx != -1 and not useImages: + menuPopup.Check(1000+active_idx, True) + + # find out where to put the popup menu of window + # items. Subtract 100 for now to center the menu + # a bit, until a better mechanism can be implemented + pt = wx.GetMousePosition() + pt = wnd.ScreenToClient(pt) + + if pt.x < 100: + pt.x = 0 + else: + pt.x -= 100 + + # find out the screen coordinate at the bottom of the tab ctrl + cli_rect = wnd.GetClientRect() + pt.y = cli_rect.y + cli_rect.height + + cc = AuiCommandCapture() + wnd.PushEventHandler(cc) + wnd.PopupMenu(menuPopup, pt) + command = cc.GetCommandId() + wnd.PopEventHandler(True) + + if command >= 1000: + return command-1000 + + return -1 + + + def GetBestTabCtrlSize(self, wnd, pages, required_bmp_size): + """ + Returns the best tab control size. + + :param `wnd`: a `wx.Window` instance object; + :param `pages`: the pages associated with the tabs; + :param `required_bmp_size`: the size of the bitmap on the tabs. + """ + + dc = wx.ClientDC(wnd) + dc.SetFont(self._measuring_font) + s, x_extent = self.GetTabSize(dc, wnd, "ABCDEFGHIj", wx.NullBitmap, True, + AUI_BUTTON_STATE_HIDDEN, None) + + max_y = s[1] + + for page in pages: + if page.control: + controlW, controlH = page.control.GetSize() + max_y = max(max_y, controlH+4) + + textx, texty, dummy = dc.GetMultiLineTextExtent(page.caption) + max_y = max(max_y, texty) + + return max_y + 3 + + + def SetNormalFont(self, font): + """ + Sets the normal font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._normal_font = font + + + def SetSelectedFont(self, font): + """ + Sets the selected tab font for drawing tab labels. + + :param `font`: a `wx.Font` object. + """ + + self._selected_font = font + + + def SetMeasuringFont(self, font): + """ + Sets the font for calculating text measurements. + + :param `font`: a `wx.Font` object. + """ + + self._measuring_font = font + + + def GetNormalFont(self): + """ Returns the normal font for drawing tab labels. """ + + return self._normal_font + + + def GetSelectedFont(self): + """ Returns the selected tab font for drawing tab labels. """ + + return self._selected_font + + + def GetMeasuringFont(self): + """ Returns the font for calculating text measurements. """ + + return self._measuring_font + + + def SetCustomButton(self, bitmap_id, button_state, bmp): + """ + Sets a custom bitmap for the close, left, right and window list + buttons. + + :param `bitmap_id`: the button identifier; + :param `button_state`: the button state; + :param `bmp`: the custom bitmap to use for the button. + """ + + if bitmap_id == AUI_BUTTON_CLOSE: + if button_state == AUI_BUTTON_STATE_NORMAL: + self._active_close_bmp = bmp + self._hover_close_bmp = self._active_close_bmp + self._pressed_close_bmp = self._active_close_bmp + self._disabled_close_bmp = self._active_close_bmp + + elif button_state == AUI_BUTTON_STATE_HOVER: + self._hover_close_bmp = bmp + elif button_state == AUI_BUTTON_STATE_PRESSED: + self._pressed_close_bmp = bmp + else: + self._disabled_close_bmp = bmp + + elif bitmap_id == AUI_BUTTON_LEFT: + if button_state & AUI_BUTTON_STATE_DISABLED: + self._disabled_left_bmp = bmp + else: + self._active_left_bmp = bmp + + elif bitmap_id == AUI_BUTTON_RIGHT: + if button_state & AUI_BUTTON_STATE_DISABLED: + self._disabled_right_bmp = bmp + else: + self._active_right_bmp = bmp + + elif bitmap_id == AUI_BUTTON_WINDOWLIST: + if button_state & AUI_BUTTON_STATE_DISABLED: + self._disabled_windowlist_bmp = bmp + else: + self._active_windowlist_bmp = bmp + + +class VC71TabArt(AuiDefaultTabArt): + """ A class to draw tabs using the Visual Studio 2003 (VC71) style. """ + + def __init__(self): + """ Default class constructor. """ + + AuiDefaultTabArt.__init__(self) + + + def Clone(self): + """ Clones the art object. """ + + art = type(self)() + art.SetNormalFont(self.GetNormalFont()) + art.SetSelectedFont(self.GetSelectedFont()) + art.SetMeasuringFont(self.GetMeasuringFont()) + + art = CopyAttributes(art, self) + return art + + + def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): + """ + Draws a single tab. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `page`: the tab control page associated with the tab; + :param `in_rect`: rectangle the tab should be confined to; + :param `close_button_state`: the state of the close button on the tab; + :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. + """ + + # Visual studio 7.1 style + # This code is based on the renderer included in FlatNotebook + + # figure out the size of the tab + + control = page.control + tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, + close_button_state, control) + + tab_height = self._tab_ctrl_height - 3 + tab_width = tab_size[0] + tab_x = in_rect.x + tab_y = in_rect.y + in_rect.height - tab_height + clip_width = tab_width + + if tab_x + clip_width > in_rect.x + in_rect.width - 4: + clip_width = (in_rect.x + in_rect.width) - tab_x - 4 + + dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3) + agwFlags = self.GetAGWFlags() + + if agwFlags & AUI_NB_BOTTOM: + tab_y -= 1 + + dc.SetPen((page.active and [wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DHIGHLIGHT))] or \ + [wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW))])[0]) + dc.SetBrush((page.active and [wx.Brush(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE))] or \ + [wx.TRANSPARENT_BRUSH])[0]) + + if page.active: + + tabH = tab_height - 2 + dc.DrawRectangle(tab_x, tab_y, tab_width, tabH) + + rightLineY1 = (agwFlags & AUI_NB_BOTTOM and [vertical_border_padding - 2] or \ + [vertical_border_padding - 1])[0] + rightLineY2 = tabH + 3 + dc.SetPen(wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW))) + dc.DrawLine(tab_x + tab_width - 1, rightLineY1 + 1, tab_x + tab_width - 1, rightLineY2) + + if agwFlags & AUI_NB_BOTTOM: + dc.DrawLine(tab_x + 1, rightLineY2 - 3 , tab_x + tab_width - 1, rightLineY2 - 3) + + dc.SetPen(wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW))) + dc.DrawLine(tab_x + tab_width, rightLineY1, tab_x + tab_width, rightLineY2) + + if agwFlags & AUI_NB_BOTTOM: + dc.DrawLine(tab_x, rightLineY2 - 2, tab_x + tab_width, rightLineY2 - 2) + + else: + + # We dont draw a rectangle for non selected tabs, but only + # vertical line on the right + blackLineY1 = (agwFlags & AUI_NB_BOTTOM and [vertical_border_padding + 2] or \ + [vertical_border_padding + 1])[0] + blackLineY2 = tab_height - 5 + dc.DrawLine(tab_x + tab_width, blackLineY1, tab_x + tab_width, blackLineY2) + + border_points = [0, 0] + + if agwFlags & AUI_NB_BOTTOM: + + border_points[0] = wx.Point(tab_x, tab_y) + border_points[1] = wx.Point(tab_x, tab_y + tab_height - 6) + + else: # if (agwFlags & AUI_NB_TOP) + + border_points[0] = wx.Point(tab_x, tab_y + tab_height - 4) + border_points[1] = wx.Point(tab_x, tab_y + 2) + + drawn_tab_yoff = border_points[1].y + drawn_tab_height = border_points[0].y - border_points[1].y + + text_offset = tab_x + 8 + close_button_width = 0 + + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + close_button_width = self._active_close_bmp.GetWidth() + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + text_offset += close_button_width - 5 + + if not page.enabled: + dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) + pagebitmap = page.dis_bitmap + else: + dc.SetTextForeground(page.text_colour) + pagebitmap = page.bitmap + + shift = 0 + if agwFlags & AUI_NB_BOTTOM: + shift = (page.active and [1] or [2])[0] + + bitmap_offset = 0 + if pagebitmap.IsOk(): + bitmap_offset = tab_x + 8 + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: + bitmap_offset += close_button_width - 5 + + # draw bitmap + dc.DrawBitmap(pagebitmap, bitmap_offset, + drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2) + shift, + True) + + text_offset = bitmap_offset + pagebitmap.GetWidth() + text_offset += 3 # bitmap padding + + else: + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: + text_offset = tab_x + 8 + + # if the caption is empty, measure some temporary text + caption = page.caption + + if caption == "": + caption = "Xj" + + if page.active: + dc.SetFont(self._selected_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + else: + dc.SetFont(self._normal_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) + + ypos = drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1 + shift + + offset_focus = text_offset + + if control is not None: + if control.GetPosition() != wx.Point(text_offset+1, ypos): + control.SetPosition(wx.Point(text_offset+1, ypos)) + + if not control.IsShown(): + control.Show() + + if paint_control: + bmp = TakeScreenShot(control.GetScreenRect()) + dc.DrawBitmap(bmp, text_offset+1, ypos, True) + + controlW, controlH = control.GetSize() + text_offset += controlW + 4 + textx += controlW + 4 + + # draw tab text + rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) + dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) + + out_button_rect = wx.Rect() + + # draw focus rectangle + if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: + self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff+shift, + drawn_tab_height+shift, rectx, recty) + + # draw 'x' on tab (if enabled) + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + close_button_width = self._active_close_bmp.GetWidth() + + bmp = self._disabled_close_bmp + + if close_button_state == AUI_BUTTON_STATE_HOVER: + bmp = self._hover_close_bmp + elif close_button_state == AUI_BUTTON_STATE_PRESSED: + bmp = self._pressed_close_bmp + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + rect = wx.Rect(tab_x + 4, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, + close_button_width, tab_height) + else: + rect = wx.Rect(tab_x + tab_width - close_button_width - 3, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, + close_button_width, tab_height) + + # Indent the button if it is pressed down: + rect = IndentPressedBitmap(rect, close_button_state) + dc.DrawBitmap(bmp, rect.x, rect.y, True) + + out_button_rect = rect + + out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) + dc.DestroyClippingRegion() + + return out_tab_rect, out_button_rect, x_extent + + +class FF2TabArt(AuiDefaultTabArt): + """ A class to draw tabs using the Firefox 2 (FF2) style. """ + + def __init__(self): + """ Default class constructor. """ + + AuiDefaultTabArt.__init__(self) + + + def Clone(self): + """ Clones the art object. """ + + art = type(self)() + art.SetNormalFont(self.GetNormalFont()) + art.SetSelectedFont(self.GetSelectedFont()) + art.SetMeasuringFont(self.GetMeasuringFont()) + + art = CopyAttributes(art, self) + return art + + + def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control): + """ + Returns the tab size for the given caption, bitmap and button state. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `caption`: the tab text caption; + :param `bitmap`: the bitmap displayed on the tab; + :param `active`: whether the tab is selected or not; + :param `close_button_state`: the state of the close button on the tab; + :param `control`: a `wx.Window` instance inside a tab (or ``None``). + """ + + tab_size, x_extent = AuiDefaultTabArt.GetTabSize(self, dc, wnd, caption, bitmap, + active, close_button_state, control) + + tab_width, tab_height = tab_size + + # add some vertical padding + tab_height += 2 + + return (tab_width, tab_height), x_extent + + + def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): + """ + Draws a single tab. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `page`: the tab control page associated with the tab; + :param `in_rect`: rectangle the tab should be confined to; + :param `close_button_state`: the state of the close button on the tab; + :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. + """ + + # Firefox 2 style + + control = page.control + + # figure out the size of the tab + tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, + page.active, close_button_state, control) + + tab_height = self._tab_ctrl_height - 2 + tab_width = tab_size[0] + tab_x = in_rect.x + tab_y = in_rect.y + in_rect.height - tab_height + + clip_width = tab_width + if tab_x + clip_width > in_rect.x + in_rect.width - 4: + clip_width = (in_rect.x + in_rect.width) - tab_x - 4 + + dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3) + + tabPoints = [wx.Point() for i in xrange(7)] + + adjust = 0 + if not page.active: + adjust = 1 + + agwFlags = self.GetAGWFlags() + + tabPoints[0].x = tab_x + 3 + tabPoints[0].y = (agwFlags & AUI_NB_BOTTOM and [3] or [tab_height - 2])[0] + + tabPoints[1].x = tabPoints[0].x + tabPoints[1].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - (vertical_border_padding + 2) - adjust] or \ + [(vertical_border_padding + 2) + adjust])[0] + + tabPoints[2].x = tabPoints[1].x+2 + tabPoints[2].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - vertical_border_padding - adjust] or \ + [vertical_border_padding + adjust])[0] + + tabPoints[3].x = tab_x + tab_width - 2 + tabPoints[3].y = tabPoints[2].y + + tabPoints[4].x = tabPoints[3].x + 2 + tabPoints[4].y = tabPoints[1].y + + tabPoints[5].x = tabPoints[4].x + tabPoints[5].y = tabPoints[0].y + + tabPoints[6].x = tabPoints[0].x + tabPoints[6].y = tabPoints[0].y + + rr = wx.RectPP(tabPoints[2], tabPoints[5]) + self.DrawTabBackground(dc, rr, page.active, (agwFlags & AUI_NB_BOTTOM) == 0) + + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW))) + + # Draw the tab as rounded rectangle + dc.DrawPolygon(tabPoints) + + if page.active: + dc.DrawLine(tabPoints[0].x + 1, tabPoints[0].y, tabPoints[5].x , tabPoints[0].y) + + drawn_tab_yoff = tabPoints[1].y + drawn_tab_height = tabPoints[0].y - tabPoints[2].y + + text_offset = tab_x + 8 + close_button_width = 0 + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + close_button_width = self._active_close_bmp.GetWidth() + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + text_offset += close_button_width - 4 + + if not page.enabled: + dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) + pagebitmap = page.dis_bitmap + else: + dc.SetTextForeground(page.text_colour) + pagebitmap = page.bitmap + + shift = -1 + if agwFlags & AUI_NB_BOTTOM: + shift = 2 + + bitmap_offset = 0 + if pagebitmap.IsOk(): + bitmap_offset = tab_x + 8 + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: + bitmap_offset += close_button_width - 4 + + # draw bitmap + dc.DrawBitmap(pagebitmap, bitmap_offset, + drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2) + shift, + True) + + text_offset = bitmap_offset + pagebitmap.GetWidth() + text_offset += 3 # bitmap padding + + else: + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: + text_offset = tab_x + 8 + + # if the caption is empty, measure some temporary text + caption = page.caption + if caption == "": + caption = "Xj" + + if page.active: + dc.SetFont(self._selected_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + else: + dc.SetFont(self._normal_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width + 1) + else: + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) + + ypos = drawn_tab_yoff + drawn_tab_height/2 - texty/2 - 1 + shift + + offset_focus = text_offset + + if control is not None: + if control.GetPosition() != wx.Point(text_offset+1, ypos): + control.SetPosition(wx.Point(text_offset+1, ypos)) + + if not control.IsShown(): + control.Show() + + if paint_control: + bmp = TakeScreenShot(control.GetScreenRect()) + dc.DrawBitmap(bmp, text_offset+1, ypos, True) + + controlW, controlH = control.GetSize() + text_offset += controlW + 4 + textx += controlW + 4 + + # draw tab text + rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) + dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) + + # draw focus rectangle + if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: + self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff+shift, + drawn_tab_height, rectx, recty) + + out_button_rect = wx.Rect() + # draw 'x' on tab (if enabled) + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + + close_button_width = self._active_close_bmp.GetWidth() + bmp = self._disabled_close_bmp + + if close_button_state == AUI_BUTTON_STATE_HOVER: + bmp = self._hover_close_bmp + elif close_button_state == AUI_BUTTON_STATE_PRESSED: + bmp = self._pressed_close_bmp + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + rect = wx.Rect(tab_x + 5, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, + close_button_width, tab_height) + else: + rect = wx.Rect(tab_x + tab_width - close_button_width - 3, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, + close_button_width, tab_height) + + # Indent the button if it is pressed down: + rect = IndentPressedBitmap(rect, close_button_state) + dc.DrawBitmap(bmp, rect.x, rect.y, True) + out_button_rect = rect + + out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) + dc.DestroyClippingRegion() + + return out_tab_rect, out_button_rect, x_extent + + + def DrawTabBackground(self, dc, rect, focus, upperTabs): + """ + Draws the tab background for the Firefox 2 style. + This is more consistent with L{FlatNotebook} than before. + + :param `dc`: a `wx.DC` device context; + :param `rect`: rectangle the tab should be confined to; + :param `focus`: whether the tab has focus or not; + :param `upperTabs`: whether the style is ``AUI_NB_TOP`` or ``AUI_NB_BOTTOM``. + """ + + # Define the rounded rectangle base on the given rect + # we need an array of 9 points for it + regPts = [wx.Point() for indx in xrange(9)] + + if focus: + if upperTabs: + leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*8) + rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*8) + else: + leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*5) + rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*5) + else: + leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) + rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 2)) + + # Define the top region + top = wx.RectPP(rect.GetTopLeft(), rightPt) + bottom = wx.RectPP(leftPt, rect.GetBottomRight()) + + topStartColour = wx.WHITE + + if not focus: + topStartColour = LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 50) + + topEndColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) + bottomStartColour = topEndColour + bottomEndColour = topEndColour + + # Incase we use bottom tabs, switch the colours + if upperTabs: + if focus: + dc.GradientFillLinear(top, topStartColour, topEndColour, wx.SOUTH) + dc.GradientFillLinear(bottom, bottomStartColour, bottomEndColour, wx.SOUTH) + else: + dc.GradientFillLinear(top, topEndColour , topStartColour, wx.SOUTH) + dc.GradientFillLinear(bottom, bottomStartColour, bottomEndColour, wx.SOUTH) + + else: + if focus: + dc.GradientFillLinear(bottom, topEndColour, bottomEndColour, wx.SOUTH) + dc.GradientFillLinear(top, topStartColour, topStartColour, wx.SOUTH) + else: + dc.GradientFillLinear(bottom, bottomStartColour, bottomEndColour, wx.SOUTH) + dc.GradientFillLinear(top, topEndColour, topStartColour, wx.SOUTH) + + dc.SetBrush(wx.TRANSPARENT_BRUSH) + + +class VC8TabArt(AuiDefaultTabArt): + """ A class to draw tabs using the Visual Studio 2005 (VC8) style. """ + + def __init__(self): + """ Default class constructor. """ + + AuiDefaultTabArt.__init__(self) + + + def Clone(self): + """ Clones the art object. """ + + art = type(self)() + art.SetNormalFont(self.GetNormalFont()) + art.SetSelectedFont(self.GetSelectedFont()) + art.SetMeasuringFont(self.GetMeasuringFont()) + + art = CopyAttributes(art, self) + return art + + + def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): + """ + Sets the tab sizing information. + + :param `tab_ctrl_size`: the size of the tab control area; + :param `tab_count`: the number of tabs; + :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths + to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. + """ + + AuiDefaultTabArt.SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth) + + minTabWidth, maxTabWidth = minMaxTabWidth + if minTabWidth > -1: + self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) + if maxTabWidth > -1: + self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) + + self._fixed_tab_width -= 5 + + + def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): + """ + Returns the tab size for the given caption, bitmap and button state. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `caption`: the tab text caption; + :param `bitmap`: the bitmap displayed on the tab; + :param `active`: whether the tab is selected or not; + :param `close_button_state`: the state of the close button on the tab; + :param `control`: a `wx.Window` instance inside a tab (or ``None``). + """ + + tab_size, x_extent = AuiDefaultTabArt.GetTabSize(self, dc, wnd, caption, bitmap, + active, close_button_state, control) + + tab_width, tab_height = tab_size + + # add some padding + tab_width += 10 + tab_height += 2 + + return (tab_width, tab_height), x_extent + + + def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): + """ + Draws a single tab. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `page`: the tab control page associated with the tab; + :param `in_rect`: rectangle the tab should be confined to; + :param `close_button_state`: the state of the close button on the tab; + :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. + """ + + # Visual Studio 8 style + + control = page.control + + # figure out the size of the tab + tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, + page.active, close_button_state, control) + + tab_height = self._tab_ctrl_height - 1 + tab_width = tab_size[0] + tab_x = in_rect.x + tab_y = in_rect.y + in_rect.height - tab_height + + clip_width = tab_width + 3 + if tab_x + clip_width > in_rect.x + in_rect.width - 4: + clip_width = (in_rect.x + in_rect.width) - tab_x - 4 + + tabPoints = [wx.Point() for i in xrange(8)] + + # If we draw the first tab or the active tab, + # we draw a full tab, else we draw a truncated tab + # + # X(2) X(3) + # X(1) X(4) + # + # X(5) + # + # X(0),(7) X(6) + # + # + + adjust = 0 + if not page.active: + adjust = 1 + + agwFlags = self.GetAGWFlags() + tabPoints[0].x = (agwFlags & AUI_NB_BOTTOM and [tab_x] or [tab_x + adjust])[0] + tabPoints[0].y = (agwFlags & AUI_NB_BOTTOM and [2] or [tab_height - 3])[0] + + tabPoints[1].x = tabPoints[0].x + tab_height - vertical_border_padding - 3 - adjust + tabPoints[1].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - (vertical_border_padding+2)] or \ + [(vertical_border_padding+2)])[0] + + tabPoints[2].x = tabPoints[1].x + 4 + tabPoints[2].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - vertical_border_padding] or \ + [vertical_border_padding])[0] + + tabPoints[3].x = tabPoints[2].x + tab_width - tab_height + vertical_border_padding + tabPoints[3].y = (agwFlags & AUI_NB_BOTTOM and [tab_height - vertical_border_padding] or \ + [vertical_border_padding])[0] + + tabPoints[4].x = tabPoints[3].x + 1 + tabPoints[4].y = (agwFlags & AUI_NB_BOTTOM and [tabPoints[3].y - 1] or [tabPoints[3].y + 1])[0] + + tabPoints[5].x = tabPoints[4].x + 1 + tabPoints[5].y = (agwFlags & AUI_NB_BOTTOM and [(tabPoints[4].y - 1)] or [tabPoints[4].y + 1])[0] + + tabPoints[6].x = tabPoints[2].x + tab_width - tab_height + 2 + vertical_border_padding + tabPoints[6].y = tabPoints[0].y + + tabPoints[7].x = tabPoints[0].x + tabPoints[7].y = tabPoints[0].y + + self.FillVC8GradientColour(dc, tabPoints, page.active) + + dc.SetBrush(wx.TRANSPARENT_BRUSH) + + dc.SetPen(wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNSHADOW))) + dc.DrawPolygon(tabPoints) + + if page.active: + # Delete the bottom line (or the upper one, incase we use wxBOTTOM) + dc.SetPen(wx.WHITE_PEN) + dc.DrawLine(tabPoints[0].x, tabPoints[0].y, tabPoints[6].x, tabPoints[6].y) + + dc.SetClippingRegion(tab_x, tab_y, clip_width + 2, tab_height - 3) + + drawn_tab_yoff = tabPoints[1].y + drawn_tab_height = tabPoints[0].y - tabPoints[2].y + + text_offset = tab_x + 20 + close_button_width = 0 + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + close_button_width = self._active_close_bmp.GetWidth() + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + text_offset += close_button_width + + if not page.enabled: + dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) + pagebitmap = page.dis_bitmap + else: + dc.SetTextForeground(page.text_colour) + pagebitmap = page.bitmap + + shift = 0 + if agwFlags & AUI_NB_BOTTOM: + shift = (page.active and [1] or [2])[0] + + bitmap_offset = 0 + if pagebitmap.IsOk(): + bitmap_offset = tab_x + 20 + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: + bitmap_offset += close_button_width + + # draw bitmap + dc.DrawBitmap(pagebitmap, bitmap_offset, + drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2) + shift, + True) + + text_offset = bitmap_offset + pagebitmap.GetWidth() + text_offset += 3 # bitmap padding + + else: + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: + text_offset = tab_x + tab_height + + # if the caption is empty, measure some temporary text + caption = page.caption + if caption == "": + caption = "Xj" + + if page.active: + dc.SetFont(self._selected_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + else: + dc.SetFont(self._normal_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x)) + else: + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) + + ypos = drawn_tab_yoff + drawn_tab_height/2 - texty/2 - 1 + shift + + offset_focus = text_offset + + if control is not None: + if control.GetPosition() != wx.Point(text_offset+1, ypos): + control.SetPosition(wx.Point(text_offset+1, ypos)) + + if not control.IsShown(): + control.Show() + + if paint_control: + bmp = TakeScreenShot(control.GetScreenRect()) + dc.DrawBitmap(bmp, text_offset+1, ypos, True) + + controlW, controlH = control.GetSize() + text_offset += controlW + 4 + textx += controlW + 4 + + # draw tab text + rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) + dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) + + # draw focus rectangle + if (agwFlags & AUI_NB_NO_TAB_FOCUS) == 0: + self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff+shift, + drawn_tab_height+shift, rectx, recty) + + out_button_rect = wx.Rect() + # draw 'x' on tab (if enabled) + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + + close_button_width = self._active_close_bmp.GetWidth() + bmp = self._disabled_close_bmp + + if close_button_state == AUI_BUTTON_STATE_HOVER: + bmp = self._hover_close_bmp + elif close_button_state == AUI_BUTTON_STATE_PRESSED: + bmp = self._pressed_close_bmp + + if page.active: + xpos = tab_x + tab_width - close_button_width + 3 + else: + xpos = tab_x + tab_width - close_button_width - 5 + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + rect = wx.Rect(tab_x + 20, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, + close_button_width, tab_height) + else: + rect = wx.Rect(xpos, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + shift, + close_button_width, tab_height) + + # Indent the button if it is pressed down: + rect = IndentPressedBitmap(rect, close_button_state) + dc.DrawBitmap(bmp, rect.x, rect.y, True) + out_button_rect = rect + + out_tab_rect = wx.Rect(tab_x, tab_y, x_extent, tab_height) + dc.DestroyClippingRegion() + + return out_tab_rect, out_button_rect, x_extent + + + def FillVC8GradientColour(self, dc, tabPoints, active): + """ + Fills the tab with the Visual Studio 2005 gradient background. + + :param `dc`: a `wx.DC` device context; + :param `tabPoints`: a list of `wx.Point` objects describing the tab shape; + :param `active`: whether the tab is selected or not. + """ + + xList = [pt.x for pt in tabPoints] + yList = [pt.y for pt in tabPoints] + + minx, maxx = min(xList), max(xList) + miny, maxy = min(yList), max(yList) + + rect = wx.Rect(minx, maxy, maxx-minx, miny-maxy+1) + region = wx.RegionFromPoints(tabPoints) + + if self._buttonRect.width > 0: + buttonRegion = wx.Region(*self._buttonRect) + region.XorRegion(buttonRegion) + + dc.SetClippingRegionAsRegion(region) + + if active: + bottom_colour = top_colour = wx.WHITE + else: + bottom_colour = StepColour(self._base_colour, 90) + top_colour = StepColour(self._base_colour, 170) + + dc.GradientFillLinear(rect, top_colour, bottom_colour, wx.SOUTH) + dc.DestroyClippingRegion() + + +class ChromeTabArt(AuiDefaultTabArt): + """ + A class to draw tabs using the Google Chrome browser style. + It uses custom bitmap to render the tabs, so that the look and feel is as close + as possible to the Chrome style. + """ + + def __init__(self): + """ Default class constructor. """ + + AuiDefaultTabArt.__init__(self) + + self.SetBitmaps(mirror=False) + + closeBmp = tab_close.GetBitmap() + closeHBmp = tab_close_h.GetBitmap() + closePBmp = tab_close_p.GetBitmap() + + self.SetCustomButton(AUI_BUTTON_CLOSE, AUI_BUTTON_STATE_NORMAL, closeBmp) + self.SetCustomButton(AUI_BUTTON_CLOSE, AUI_BUTTON_STATE_HOVER, closeHBmp) + self.SetCustomButton(AUI_BUTTON_CLOSE, AUI_BUTTON_STATE_PRESSED, closePBmp) + + + def SetAGWFlags(self, agwFlags): + """ + Sets the tab art flags. + + :param `agwFlags`: a combination of the following values: + + ==================================== ================================== + Flag name Description + ==================================== ================================== + ``AUI_NB_TOP`` With this style, tabs are drawn along the top of the notebook + ``AUI_NB_LEFT`` With this style, tabs are drawn along the left of the notebook. Not implemented yet. + ``AUI_NB_RIGHT`` With this style, tabs are drawn along the right of the notebook. Not implemented yet. + ``AUI_NB_BOTTOM`` With this style, tabs are drawn along the bottom of the notebook + ``AUI_NB_TAB_SPLIT`` Allows the tab control to be split by dragging a tab + ``AUI_NB_TAB_MOVE`` Allows a tab to be moved horizontally by dragging + ``AUI_NB_TAB_EXTERNAL_MOVE`` Allows a tab to be moved to another tab control + ``AUI_NB_TAB_FIXED_WIDTH`` With this style, all tabs have the same width + ``AUI_NB_SCROLL_BUTTONS`` With this style, left and right scroll buttons are displayed + ``AUI_NB_WINDOWLIST_BUTTON`` With this style, a drop-down list of windows is available + ``AUI_NB_CLOSE_BUTTON`` With this style, a close button is available on the tab bar + ``AUI_NB_CLOSE_ON_ACTIVE_TAB`` With this style, a close button is available on the active tab + ``AUI_NB_CLOSE_ON_ALL_TABS`` With this style, a close button is available on all tabs + ``AUI_NB_MIDDLE_CLICK_CLOSE`` Allows to close L{AuiNotebook} tabs by mouse middle button click + ``AUI_NB_SUB_NOTEBOOK`` This style is used by L{AuiManager} to create automatic AuiNotebooks + ``AUI_NB_HIDE_ON_SINGLE_TAB`` Hides the tab window if only one tab is present + ``AUI_NB_SMART_TABS`` Use Smart Tabbing, like ``Alt`` + ``Tab`` on Windows + ``AUI_NB_USE_IMAGES_DROPDOWN`` Uses images on dropdown window list menu instead of check items + ``AUI_NB_CLOSE_ON_TAB_LEFT`` Draws the tab close button on the left instead of on the right (a la Camino browser) + ``AUI_NB_TAB_FLOAT`` Allows the floating of single tabs. Known limitation: when the notebook is more or less full screen, tabs cannot be dragged far enough outside of the notebook to become floating pages + ``AUI_NB_DRAW_DND_TAB`` Draws an image representation of a tab while dragging (on by default) + ``AUI_NB_ORDER_BY_ACCESS`` Tab navigation order by last access time for the tabs + ``AUI_NB_NO_TAB_FOCUS`` Don't draw tab focus rectangle + ==================================== ================================== + + :note: Overridden from L{AuiDefaultTabArt}. + """ + + if agwFlags & AUI_NB_TOP: + self.SetBitmaps(mirror=False) + elif agwFlags & AUI_NB_BOTTOM: + self.SetBitmaps(mirror=True) + + AuiDefaultTabArt.SetAGWFlags(self, agwFlags) + + + def SetBitmaps(self, mirror): + """ + Assigns the tab custom bitmaps + + :param `mirror`: whether to vertically mirror the bitmap or not. + """ + + bmps = [tab_active_left.GetBitmap(), tab_active_center.GetBitmap(), + tab_active_right.GetBitmap(), tab_inactive_left.GetBitmap(), + tab_inactive_center.GetBitmap(), tab_inactive_right.GetBitmap()] + + if mirror: + for indx, bmp in enumerate(bmps): + img = bmp.ConvertToImage() + img = img.Mirror(horizontally=False) + bmps[indx] = img.ConvertToBitmap() + + self._leftActiveBmp = bmps[0] + self._centerActiveBmp = bmps[1] + self._rightActiveBmp = bmps[2] + self._leftInactiveBmp = bmps[3] + self._centerInactiveBmp = bmps[4] + self._rightInactiveBmp = bmps[5] + + + def Clone(self): + """ Clones the art object. """ + + art = type(self)() + art.SetNormalFont(self.GetNormalFont()) + art.SetSelectedFont(self.GetSelectedFont()) + art.SetMeasuringFont(self.GetMeasuringFont()) + + art = CopyAttributes(art, self) + return art + + + def SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth): + """ + Sets the tab sizing information. + + :param `tab_ctrl_size`: the size of the tab control area; + :param `tab_count`: the number of tabs; + :param `minMaxTabWidth`: a tuple containing the minimum and maximum tab widths + to be used when the ``AUI_NB_TAB_FIXED_WIDTH`` style is active. + """ + + AuiDefaultTabArt.SetSizingInfo(self, tab_ctrl_size, tab_count, minMaxTabWidth) + + minTabWidth, maxTabWidth = minMaxTabWidth + if minTabWidth > -1: + self._fixed_tab_width = max(self._fixed_tab_width, minTabWidth) + if maxTabWidth > -1: + self._fixed_tab_width = min(self._fixed_tab_width, maxTabWidth) + + self._fixed_tab_width -= 5 + + + def GetTabSize(self, dc, wnd, caption, bitmap, active, close_button_state, control=None): + """ + Returns the tab size for the given caption, bitmap and button state. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `caption`: the tab text caption; + :param `bitmap`: the bitmap displayed on the tab; + :param `active`: whether the tab is selected or not; + :param `close_button_state`: the state of the close button on the tab; + :param `control`: a `wx.Window` instance inside a tab (or ``None``). + """ + + tab_size, x_extent = AuiDefaultTabArt.GetTabSize(self, dc, wnd, caption, bitmap, + active, close_button_state, control) + + tab_width, tab_height = tab_size + + # add some padding + tab_width += self._leftActiveBmp.GetWidth() + tab_height += 2 + + tab_height = max(tab_height, self._centerActiveBmp.GetHeight()) + + return (tab_width, tab_height), x_extent + + + def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): + """ + Draws a single tab. + + :param `dc`: a `wx.DC` device context; + :param `wnd`: a `wx.Window` instance object; + :param `page`: the tab control page associated with the tab; + :param `in_rect`: rectangle the tab should be confined to; + :param `close_button_state`: the state of the close button on the tab; + :param `paint_control`: whether to draw the control inside a tab (if any) on a `wx.MemoryDC`. + """ + + # Chrome tab style + + control = page.control + # figure out the size of the tab + tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, + close_button_state, control) + + agwFlags = self.GetAGWFlags() + + tab_height = self._tab_ctrl_height - 1 + tab_width = tab_size[0] + tab_x = in_rect.x + tab_y = in_rect.y + in_rect.height - tab_height + clip_width = tab_width + + if tab_x + clip_width > in_rect.x + in_rect.width - 4: + clip_width = (in_rect.x + in_rect.width) - tab_x - 4 + + dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3) + drawn_tab_yoff = 1 + + if page.active: + left = self._leftActiveBmp + center = self._centerActiveBmp + right = self._rightActiveBmp + else: + left = self._leftInactiveBmp + center = self._centerInactiveBmp + right = self._rightInactiveBmp + + dc.DrawBitmap(left, tab_x, tab_y) + leftw = left.GetWidth() + centerw = center.GetWidth() + rightw = right.GetWidth() + + available = tab_x + tab_width - rightw + posx = tab_x + leftw + + while 1: + if posx >= available: + break + dc.DrawBitmap(center, posx, tab_y) + posx += centerw + + dc.DrawBitmap(right, posx, tab_y) + + drawn_tab_height = center.GetHeight() + text_offset = tab_x + leftw + + close_button_width = 0 + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + close_button_width = self._active_close_bmp.GetWidth() + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + text_offset += close_button_width + + if not page.enabled: + dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) + pagebitmap = page.dis_bitmap + else: + dc.SetTextForeground(page.text_colour) + pagebitmap = page.bitmap + + bitmap_offset = 0 + if pagebitmap.IsOk(): + bitmap_offset = tab_x + leftw + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: + bitmap_offset += close_button_width + + # draw bitmap + dc.DrawBitmap(pagebitmap, bitmap_offset, + drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2), + True) + + text_offset = bitmap_offset + pagebitmap.GetWidth() + text_offset += 3 # bitmap padding + + else: + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: + text_offset = tab_x + leftw + + # if the caption is empty, measure some temporary text + caption = page.caption + if caption == "": + caption = "Xj" + + if page.active: + dc.SetFont(self._selected_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + else: + dc.SetFont(self._normal_font) + textx, texty, dummy = dc.GetMultiLineTextExtent(caption) + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - leftw) + else: + draw_text = ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width - leftw) + + ypos = drawn_tab_yoff + drawn_tab_height/2 - texty/2 - 1 + + if control is not None: + if control.GetPosition() != wx.Point(text_offset+1, ypos): + control.SetPosition(wx.Point(text_offset+1, ypos)) + + if not control.IsShown(): + control.Show() + + if paint_control: + bmp = TakeScreenShot(control.GetScreenRect()) + dc.DrawBitmap(bmp, text_offset+1, ypos, True) + + controlW, controlH = control.GetSize() + text_offset += controlW + 4 + + # draw tab text + rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) + dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) + + out_button_rect = wx.Rect() + # draw 'x' on tab (if enabled) + if close_button_state != AUI_BUTTON_STATE_HIDDEN: + + close_button_width = self._active_close_bmp.GetWidth() + bmp = self._disabled_close_bmp + + if close_button_state == AUI_BUTTON_STATE_HOVER: + bmp = self._hover_close_bmp + elif close_button_state == AUI_BUTTON_STATE_PRESSED: + bmp = self._pressed_close_bmp + + if agwFlags & AUI_NB_CLOSE_ON_TAB_LEFT: + rect = wx.Rect(tab_x + leftw - 2, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + 1, + close_button_width, tab_height) + else: + rect = wx.Rect(tab_x + tab_width - close_button_width - rightw + 2, + drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2) + 1, + close_button_width, tab_height) + + if agwFlags & AUI_NB_BOTTOM: + rect.y -= 1 + + # Indent the button if it is pressed down: + rect = IndentPressedBitmap(rect, close_button_state) + dc.DrawBitmap(bmp, rect.x, rect.y, True) + out_button_rect = rect + + out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) + dc.DestroyClippingRegion() + + return out_tab_rect, out_button_rect, x_extent + + diff --git a/autres/aui/tabmdi.py b/autres/aui/tabmdi.py new file mode 100644 index 0000000..ef09e9f --- /dev/null +++ b/autres/aui/tabmdi.py @@ -0,0 +1,666 @@ +__author__ = "Andrea Gavana " +__date__ = "31 March 2009" + + +import wx + +import auibook +from aui_constants import * + +_ = wx.GetTranslation + +#----------------------------------------------------------------------------- +# AuiMDIParentFrame +#----------------------------------------------------------------------------- + +class AuiMDIParentFrame(wx.Frame): + + def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, + size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE|wx.VSCROLL|wx.HSCROLL, + name="AuiMDIParentFrame"): + + wx.Frame.__init__(self, parent, id, title, pos, size, style, name=name) + self.Init() + + self.Bind(wx.EVT_MENU, self.DoHandleMenu, id=wx.ID_ANY) + + # this style can be used to prevent a window from having the standard MDI + # "Window" menu + if not style & wx.FRAME_NO_WINDOW_MENU: + + self._pWindowMenu = wx.Menu() + self._pWindowMenu.Append(wxWINDOWCLOSE, _("Cl&ose")) + self._pWindowMenu.Append(wxWINDOWCLOSEALL, _("Close All")) + self._pWindowMenu.AppendSeparator() + self._pWindowMenu.Append(wxWINDOWNEXT, _("&Next")) + self._pWindowMenu.Append(wxWINDOWPREV, _("&Previous")) + + self._pClientWindow = self.OnCreateClient() + + + def SetArtProvider(self, provider): + + if self._pClientWindow: + self._pClientWindow.SetArtProvider(provider) + + + def GetArtProvider(self): + + if not self._pClientWindow: + return None + + return self._pClientWindow.GetArtProvider() + + + def GetNotebook(self): + + return self._pClientWindow + + + def SetWindowMenu(self, pMenu): + + # Replace the window menu from the currently loaded menu bar. + pMenuBar = self.GetMenuBar() + + if self._pWindowMenu: + self.RemoveWindowMenu(pMenuBar) + del self._pWindowMenu + self._pWindowMenu = None + + if pMenu: + self._pWindowMenu = pMenu + self.AddWindowMenu(pMenuBar) + + + def GetWindowMenu(self): + + return self._pWindowMenu + + + def SetMenuBar(self, pMenuBar): + + # Remove the Window menu from the old menu bar + self.RemoveWindowMenu(self.GetMenuBar()) + + # Add the Window menu to the new menu bar. + self.AddWindowMenu(pMenuBar) + + wx.Frame.SetMenuBar(self, pMenuBar) + + + def SetChildMenuBar(self, pChild): + + if not pChild: + + # No Child, set Our menu bar back. + if self._pMyMenuBar: + self.SetMenuBar(self._pMyMenuBar) + else: + self.SetMenuBar(self.GetMenuBar()) + + # Make sure we know our menu bar is in use + self._pMyMenuBar = None + + else: + + if pChild.GetMenuBar() == None: + return + + # Do we need to save the current bar? + if self._pMyMenuBar == None: + self._pMyMenuBar = self.GetMenuBar() + + self.SetMenuBar(pChild.GetMenuBar()) + + + def ProcessEvent(self, event): + + # stops the same event being processed repeatedly + if self._pLastEvt == event: + return False + + self._pLastEvt = event + + # let the active child (if any) process the event first. + res = False + if self._pActiveChild and event.IsCommandEvent() and \ + event.GetEventObject() != self._pClientWindow and \ + event.GetEventType() not in [wx.wxEVT_ACTIVATE, wx.wxEVT_SET_FOCUS, + wx.wxEVT_KILL_FOCUS, wx.wxEVT_CHILD_FOCUS, + wx.wxEVT_COMMAND_SET_FOCUS, wx.wxEVT_COMMAND_KILL_FOCUS]: + + res = self._pActiveChild.GetEventHandler().ProcessEvent(event) + + if not res: + + # if the event was not handled this frame will handle it, + # which is why we need the protection code at the beginning + # of this method + res = self.GetEventHandler().ProcessEvent(event) + + self._pLastEvt = None + + return res + + + def GetActiveChild(self): + + return self._pActiveChild + + + def SetActiveChild(self, pChildFrame): + + self._pActiveChild = pChildFrame + + + def GetClientWindow(self): + + return self._pClientWindow + + + def OnCreateClient(self): + + return AuiMDIClientWindow(self) + + + def ActivateNext(self): + + if self._pClientWindow and self._pClientWindow.GetSelection() != wx.NOT_FOUND: + + active = self._pClientWindow.GetSelection() + 1 + if active >= self._pClientWindow.GetPageCount(): + active = 0 + + self._pClientWindow.SetSelection(active) + + + def ActivatePrevious(self): + + if self._pClientWindow and self._pClientWindow.GetSelection() != wx.NOT_FOUND: + + active = self._pClientWindow.GetSelection() - 1 + if active < 0: + active = self._pClientWindow.GetPageCount() - 1 + + self._pClientWindow.SetSelection(active) + + + def Init(self): + + self._pLastEvt = None + + self._pClientWindow = None + self._pActiveChild = None + self._pWindowMenu = None + self._pMyMenuBar = None + + + def RemoveWindowMenu(self, pMenuBar): + + if pMenuBar and self._pWindowMenu: + + # Remove old window menu + pos = pMenuBar.FindMenu(_("&Window")) + if pos != wx.NOT_FOUND: + pMenuBar.Remove(pos) + + + def AddWindowMenu(self, pMenuBar): + + if pMenuBar and self._pWindowMenu: + + pos = pMenuBar.FindMenu(wx.GetStockLabel(wx.ID_HELP, wx.STOCK_NOFLAGS)) + if pos == wx.NOT_FOUND: + pMenuBar.Append(self._pWindowMenu, _("&Window")) + else: + pMenuBar.Insert(pos, self._pWindowMenu, _("&Window")) + + + def DoHandleMenu(self, event): + + evId = event.GetId() + + if evId == wxWINDOWCLOSE: + if self._pActiveChild: + self._pActiveChild.Close() + + elif evId == wxWINDOWCLOSEALL: + + while self._pActiveChild: + if not self._pActiveChild.Close(): + return # failure + + elif evId == wxWINDOWNEXT: + self.ActivateNext() + + elif evId == wxWINDOWPREV: + self.ActivatePrevious() + + else: + event.Skip() + + + def Tile(self, orient=wx.HORIZONTAL): + + client_window = self.GetClientWindow() + if not client_window: + raise Exception("Missing MDI Client Window") + + cur_idx = client_window.GetSelection() + if cur_idx == -1: + return + + if orient == wx.VERTICAL: + + client_window.Split(cur_idx, wx.LEFT) + + elif orient == wx.HORIZONTAL: + + client_window.Split(cur_idx, wx.TOP) + + +#----------------------------------------------------------------------------- +# AuiMDIChildFrame +#----------------------------------------------------------------------------- + +class AuiMDIChildFrame(wx.PyPanel): + + def __init__(self, parent, id=wx.ID_ANY, title="", pos=wx.DefaultPosition, + size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, name="AuiMDIChildFrame"): + + pClientWindow = parent.GetClientWindow() + if pClientWindow is None: + raise Exception("Missing MDI client window.") + + self.Init() + + # see comment in constructor + if style & wx.MINIMIZE: + self._activate_on_create = False + + cli_size = pClientWindow.GetClientSize() + + # create the window off-screen to prevent flicker + wx.PyPanel.__init__(self, pClientWindow, id, wx.Point(cli_size.x+1, cli_size.y+1), + size, wx.NO_BORDER, name=name) + + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + self.Show(False) + self.SetMDIParentFrame(parent) + + # this is the currently active child + parent.SetActiveChild(self) + self._title = title + + pClientWindow.AddPage(self, title, self._activate_on_create) + pClientWindow.Refresh() + + self.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.OnMenuHighlight) + self.Bind(wx.EVT_ACTIVATE, self.OnActivate) + self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) + + + def Init(self): + + # There are two ways to create an tabbed mdi child fram without + # making it the active document. Either Show(False) can be called + # before Create() (as is customary on some ports with wxFrame-type + # windows), or wx.MINIMIZE can be passed in the style flags. Note that + # AuiMDIChildFrame is not really derived from wxFrame, as MDIChildFrame + # is, but those are the expected symantics. No style flag is passed + # onto the panel underneath. + + self._activate_on_create = True + + self._pMDIParentFrame = None + self._pMenuBar = None + + self._mdi_currect = None + self._mdi_newrect = wx.Rect() + self._icon = None + self._icon_bundle = None + + + def Destroy(self): + + pParentFrame = self.GetMDIParentFrame() + if not pParentFrame: + raise Exception("Missing MDI Parent Frame") + + pClientWindow = pParentFrame.GetClientWindow() + if not pClientWindow: + raise Exception("Missing MDI Client Window") + + if pParentFrame.GetActiveChild() == self: + + # deactivate ourself + event = wx.ActivateEvent(wx.wxEVT_ACTIVATE, False, self.GetId()) + event.SetEventObject(self) + self.GetEventHandler().ProcessEvent(event) + + pParentFrame.SetActiveChild(None) + pParentFrame.SetChildMenuBar(None) + + for pos in xrange(pClientWindow.GetPageCount()): + if pClientWindow.GetPage(pos) == self: + return pClientWindow.DeletePage(pos) + + return False + + + def SetMenuBar(self, menu_bar): + + pOldMenuBar = self._pMenuBar + self._pMenuBar = menu_bar + + if self._pMenuBar: + + pParentFrame = self.GetMDIParentFrame() + if not pParentFrame: + raise Exception("Missing MDI Parent Frame") + + self._pMenuBar.Reparent(pParentFrame) + if pParentFrame.GetActiveChild() == self: + + # replace current menu bars + if pOldMenuBar: + pParentFrame.SetChildMenuBar(None) + + pParentFrame.SetChildMenuBar(self) + + + def GetMenuBar(self): + + return self._pMenuBar + + + def SetTitle(self, title): + + self._title = title + + pParentFrame = self.GetMDIParentFrame() + if not pParentFrame: + raise Exception("Missing MDI Parent Frame") + + pClientWindow = pParentFrame.GetClientWindow() + if pClientWindow is not None: + + for pos in xrange(pClientWindow.GetPageCount()): + if pClientWindow.GetPage(pos) == self: + pClientWindow.SetPageText(pos, self._title) + break + + + def GetTitle(self): + + return self._title + + + def SetIcons(self, icons): + + # get icon with the system icon size + self.SetIcon(icons.GetIcon(-1)) + self._icon_bundle = icons + + + def GetIcons(self): + + return self._icon_bundle + + + def SetIcon(self, icon): + + pParentFrame = self.GetMDIParentFrame() + if not pParentFrame: + raise Exception("Missing MDI Parent Frame") + + self._icon = icon + + bmp = wx.BitmapFromIcon(self._icon) + + pClientWindow = pParentFrame.GetClientWindow() + if pClientWindow is not None: + idx = pClientWindow.GetPageIndex(self) + if idx != -1: + pClientWindow.SetPageBitmap(idx, bmp) + + + def GetIcon(self): + + return self._icon + + + def Activate(self): + + pParentFrame = self.GetMDIParentFrame() + if not pParentFrame: + raise Exception("Missing MDI Parent Frame") + + pClientWindow = pParentFrame.GetClientWindow() + if pClientWindow is not None: + + for pos in xrange(pClientWindow.GetPageCount()): + if pClientWindow.GetPage(pos) == self: + pClientWindow.SetSelection(pos) + break + + + def OnMenuHighlight(self, event): + + if self._pMDIParentFrame: + + # we don't have any help text for this item, + # but may be the MDI frame does? + self._pMDIParentFrame.OnMenuHighlight(event) + + + def OnActivate(self, event): + + # do nothing + pass + + + def OnCloseWindow(self, event): + + pParentFrame = self.GetMDIParentFrame() + if pParentFrame: + if pParentFrame.GetActiveChild() == self: + + pParentFrame.SetActiveChild(None) + pParentFrame.SetChildMenuBar(None) + + pClientWindow = pParentFrame.GetClientWindow() + idx = pClientWindow.GetPageIndex(self) + + if idx != wx.NOT_FOUND: + pClientWindow.RemovePage(idx) + + self.Destroy() + + + def SetMDIParentFrame(self, parentFrame): + + self._pMDIParentFrame = parentFrame + + + def GetMDIParentFrame(self): + + return self._pMDIParentFrame + + + def CreateStatusBar(self, number=1, style=1, winid=1, name=""): + + return None + + + def GetStatusBar(self): + + return None + + + def SetStatusText(self, text, number=0): + + pass + + + def SetStatusWidths(self, widths_field): + + pass + + + # no toolbar bars + def CreateToolBar(self, style=1, winid=-1, name=""): + + return None + + + def GetToolBar(self): + + return None + + + # no maximize etc + def Maximize(self, maximize=True): + + pass + + + def Restore(self): + + pass + + + def Iconize(self, iconize=True): + + pass + + + def IsMaximized(self): + + return True + + + def IsIconized(self): + + return False + + + def ShowFullScreen(self, show=True, style=0): + + return False + + + def IsFullScreen(self): + + return False + + + def IsTopLevel(self): + + return False + + + # renamed from Show(). + def ActivateOnCreate(self, activate_on_create): + + self._activate_on_create = activate_on_create + return True + + + def Show(self, show=True): + + wx.PyPanel.Show(self, show) + + + def ApplyMDIChildFrameRect(self): + + if self._mdi_currect != self._mdi_newrect: + self.SetDimensions(*self._mdi_newrect) + self._mdi_currect = wx.Rect(*self._mdi_newrect) + + +#----------------------------------------------------------------------------- +# AuiMDIClientWindow +#----------------------------------------------------------------------------- + +class AuiMDIClientWindow(auibook.AuiNotebook): + + def __init__(self, parent, agwStyle=0): + + auibook.AuiNotebook.__init__(self, parent, wx.ID_ANY, wx.Point(0, 0), wx.Size(100, 100), + agwStyle=AUI_NB_DEFAULT_STYLE|wx.NO_BORDER) + + caption_icon_size = wx.Size(wx.SystemSettings.GetMetric(wx.SYS_SMALLICON_X), + wx.SystemSettings.GetMetric(wx.SYS_SMALLICON_Y)) + self.SetUniformBitmapSize(caption_icon_size) + + bkcolour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_APPWORKSPACE) + self.SetOwnBackgroundColour(bkcolour) + + self._mgr.GetArtProvider().SetColour(AUI_DOCKART_BACKGROUND_COLOUR, bkcolour) + + self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged) + self.Bind(auibook.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnPageClose) + self.Bind(wx.EVT_SIZE, self.OnSize) + + + def SetSelection(self, nPage): + + return auibook.AuiNotebook.SetSelection(self, nPage) + + + def PageChanged(self, old_selection, new_selection): + + # don't do anything if the page doesn't actually change + if old_selection == new_selection: + return + + # notify old active child that it has been deactivated + if old_selection != -1 and old_selection < self.GetPageCount(): + + old_child = self.GetPage(old_selection) + if not old_child: + raise Exception("AuiMDIClientWindow.PageChanged - null page pointer") + + event = wx.ActivateEvent(wx.wxEVT_ACTIVATE, False, old_child.GetId()) + event.SetEventObject(old_child) + old_child.GetEventHandler().ProcessEvent(event) + + # notify new active child that it has been activated + if new_selection != -1: + + active_child = self.GetPage(new_selection) + if not active_child: + raise Exception("AuiMDIClientWindow.PageChanged - null page pointer") + + event = wx.ActivateEvent(wx.wxEVT_ACTIVATE, True, active_child.GetId()) + event.SetEventObject(active_child) + active_child.GetEventHandler().ProcessEvent(event) + + if active_child.GetMDIParentFrame(): + active_child.GetMDIParentFrame().SetActiveChild(active_child) + active_child.GetMDIParentFrame().SetChildMenuBar(active_child) + + + def OnPageClose(self, event): + + wnd = self.GetPage(event.GetSelection()) + wnd.Close() + + # regardless of the result of wnd.Close(), we've + # already taken care of the close operations, so + # suppress further processing + event.Veto() + + + def OnPageChanged(self, event): + + self.PageChanged(event.GetOldSelection(), event.GetSelection()) + + + def OnSize(self, event): + + auibook.AuiNotebook.OnSize(self, event) + + for pos in xrange(self.GetPageCount()): + self.GetPage(pos).ApplyMDIChildFrameRect() diff --git a/autres/bestsvg.py b/autres/bestsvg.py new file mode 100644 index 0000000..188ff8b --- /dev/null +++ b/autres/bestsvg.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# usage ? + +#------------------------------------ +# import des modules python +#------------------------------------ +from optparse import OptionParser + + +parser = OptionParser() +parser.add_option("-f", "--file", dest="filename", + help="open FILE", metavar="FILE", default=False) +parser.add_option("-b", "--whiteblack", dest='b', default=False, action='store_true') + +(options, args) = parser.parse_args() + +with open(options.filename, 'r') as f : + content = f.read() + +def correct_police(content) : + return content.replace('Arial Black','Arial') + +content = correct_police(content) + +def inverse_b_nb(content) : + return content.replace('#000000','#NOIRNOIRNOIR').replace('#ffffff','#000000').replace('#NOIRNOIRNOIR','#ffffff') + +if options.b : + content = inverse_b_nb(content) + + +with open(options.filename, 'w') as f : + f.write(content) \ No newline at end of file diff --git a/autres/build_dictionnaries.py b/autres/build_dictionnaries.py new file mode 100644 index 0000000..679d57e --- /dev/null +++ b/autres/build_dictionnaries.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +# usage ? + +#------------------------------------ +# import des modules python +#------------------------------------ +import codecs +import os +from time import time +import re +from subprocess import * +import sys, string +from xml.dom import minidom, Node + + +txtdir = '/home/pierre/workspace/iramuteq/dev/langues/italian' +encodage = 'macroman' +treetagger = '/home/pierre/prog/treetagger/cmd/tree-tagger-italian-utf8' +fileout = '/home/pierre/workspace/iramuteq/dev/langues/lexique_it_t1.txt' +stopword = '/home/pierre/workspace/iramuteq/dev/langues/IT_NEW_stopwords_utf8.txt' +lexique = '/home/pierre/workspace/iramuteq/dev/langues/lexique_it.txt' +xmlfile = '/home/pierre/workspace/iramuteq/dev/langues/itwiki-latest-pages-articles.xml' + + +import xml.sax + +class WikiPediaHandler(xml.sax.ContentHandler): + def __init__(self, sparser) : + self.txt = False + self.totreat = [] + self.tottitle = 0 + self.diff = 0 + self.last = 0 + self.sparser = sparser + + def startElement(self, name, attrs): + if self.diff > 1000 : + self.sparser.treat_formes() + self.last = len(self.sparser.formes) + self.diff = 0 + if name == 'title' : + self.tottitle += 1 + if len(self.totreat) > 100000 : + self.diff = len(self.sparser.formes) - self.last + self.sparser.doparsewiki(' '.join(self.totreat)) + self.totreat = [] + print 'titres :', self.tottitle + if name == 'text' : + self.txt = True + else : + self.txt = False + #if name == "title": + # for item in attrs.items(): + # print item + def characters(self, content) : + if self.txt : + self.totreat.append(content) + +class Parser : + def __init__(self, txtdir, encodage, treetagger, fileout) : + self.txtdir = txtdir + self.encodage = encodage + self.tt = treetagger + self.formes = {} + self.fileout = fileout + #self.doparse() + #self.treat_formes(fileout) + + def clean(self, txt) : + txt = txt.lower() + keep_caract = u"a-zA-Z0-9àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇß’ñ.:,;!?\n*'_-" + list_keep = u"[^" + keep_caract + "]+" + txt = re.sub(list_keep, ' ', txt) + txt = txt.replace(u'’',u"'") + txt = txt.replace(u'\'',u' ').replace(u'-', u' ') + txt = txt.replace(u'?',u' ? ').replace(u'.',u' . ').replace(u'!', u' ! ').replace(u',',u' , ').replace(u';', u' ; ').replace(u':',u' : ') + txt = ' '.join(txt.split()) + return txt + + def update_dict(self, tmpfile) : + with codecs.open(tmpfile, 'r', 'utf8') as f : + content = f.read() + content = [line.split('\t') for line in content.splitlines()] + for forme in content : + if (forme[2] == u'') or (forme[1] in [u'PON', u'', u'SYM', u'SENT']) or (forme[1]==u'NUM' and forme[2]==u'@card@') : + pass + elif (forme[0], forme[1]) in self.formes : + self.formes[(forme[0], forme[1])][0] += 1 + else : + self.formes[(forme[0], forme[1])] = [1, forme[2]] + print len(self.formes) + + def treat_formes(self) : + print 'treat_formes' + nformes= {} + for forme in self.formes : + if forme[0] in nformes : + if self.formes[forme][0] > nformes[forme[0]][0] : + nformes[forme[0]] = [self.formes[forme][0], forme[1], self.formes[forme][1]] + else : + nformes[forme[0]] = [self.formes[forme][0], forme[1], self.formes[forme][1]] + with open(self.fileout, 'w') as f : + toprint = [[forme, nformes[forme][1], nformes[forme][2], `nformes[forme][0]`] for forme in nformes] + toprint = sorted(toprint) + toprint = '\n'.join(['\t'.join(line) for line in toprint]) + f.write(toprint.encode('utf8')) + print len(nformes) + + def doparsewiki(self, content) : + content = self.clean(content) + with open('/tmp/tmptxt', 'w') as f : + f.write(content.encode('utf8')) + p1 = Popen(['cat', '/tmp/tmptxt'], stdout = PIPE) + with open('/tmp/tttmp', 'w') as f : + p2 = Popen([treetagger], stdin = p1.stdout, stdout = f) + out = p2.communicate() + self.update_dict('/tmp/tttmp') + + def doparse(self): + files = os.listdir(self.txtdir) + for fpath in files : + fpath = os.path.join(self.txtdir, fpath) + print fpath + with codecs.open(fpath, 'r', self.encodage) as f : + content = f.read() + content = self.clean(content) + with open('/tmp/tmptxt', 'w') as f : + f.write(content.encode('utf8')) + p1 = Popen(['cat', '/tmp/tmptxt'], stdout = PIPE) + with open('/tmp/tttmp', 'w') as f : + p2 = Popen([treetagger], stdin = p1.stdout, stdout = f) + out = p2.communicate() + self.update_dict('/tmp/tttmp') + + +class PostTreat : + def __init__(self, infile, outfile, stopw = None) : + self.dictg = {} + with codecs.open(infile, 'r', 'utf8') as f : + content = f.read() + content = [line.split('\t') for line in content.splitlines()] + content = [self.treatline(line) for line in content if line[3] != '1'] + self.formes = {} + self.lems = {} + if stopw is not None : + with codecs.open(stopw, 'r', 'utf8') as f : + stw = f.read() + self.stw = stw.splitlines() + content = self.dostopword(content) + self.printcontent(content, outfile) + self.dictg = {} + for forme in self.formes : + self.dictg[self.formes[forme][2]] = self.dictg.get(self.formes[forme][2],0) + 1 + print self.dictg + print content[0:10] + print len(content) + + def treatline(self, line) : + gram = line[1].split(u':')[0].lower() + self.dictg[gram] = self.dictg.get(gram, 0) + 1 + return [line[0], line[2], gram, int(line[3])] + + def dostopword(self, content) : + for line in content : + self.formes[line[0]] = line + self.lems[line[1]] = line + for word in self.stw : + if word in self.formes : + print word, self.formes[word] + if self.formes[word][2] in ['adj','adv','ver','nom'] : + self.formes[word][2] = self.formes[word][2] + '_sup' + print self.formes[word] + else : + self.formes[word] = [word, word, 'sw', 0] + return sorted([[forme, self.formes[forme][1], self.formes[forme][2]] for forme in self.formes]) + + def printcontent(self, content, outfile) : + with open(outfile, 'w') as f : + f.write('\n'.join(['\t'.join(line) for line in content]).encode('utf8')) + + + + +#sparser = Parser('', encodage, treetagger, fileout) +#parser = xml.sax.make_parser() +#parser.setContentHandler(WikiPediaHandler(sparser)) +#parser.parse(open(xmlfile,"r")) +##Parser(txtdir, encodage, treetagger, fileout) +PostTreat(fileout, lexique, stopword) + + + diff --git a/autres/cable.py b/autres/cable.py new file mode 100644 index 0000000..bbfa37f --- /dev/null +++ b/autres/cable.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#Lisense: GNU/GPL +# usage ? +# encodage est utilisé - mais utf-8 est par défaut dans PY3 + +#------------------------------------ +# import des modules python +#------------------------------------ +import codecs + + +filein = '/home/pierre/fac/cablegate/allcables-all.txt' +enc = 'utf-8' + +infile = codecs.open(filein, 'r', enc) +content = [] + +class BigCorpus : + def __init__(self, parent) : + self.parent = parent + self.parametre = {'syscoding': sys.getdefaultencoding()} + self.content = None + self.ucis = None + self.formes = {} + self.lems = {} + self.ucenb = None + self.etoiles = None + self.etintxt = {} + self.ucis_paras_uces = None + self.lc = None + self.lc0 = None + self.actives = None + self.supp = None + #self.supplementaires = [] + self.lenuc1 = None + self.lenuc2 = None + self.lexique = None + + def open_corpus(self) : + return codecs.open(self.parametre['filename'], "r", self.parametre['encodage']) + + def buildcorpus(self) : + i = 0 + ucifile = os.path.join(os.path.basedir(self.parametre['filename']), 'ucis.txt') + uci = open(ucifile, 'w') + ucinb = 0 + for line in self.open_corpus() : + if line.startswith(u'****') and i==0 : + uci.write(line) + i += 1 + elif line.startswith(u'****') and i=!0 : + uci.write(line) + parse_uci() + + write_uci() + uci[ucinb] = i + ucinb += 1 + i += 1 + else : + addlinetouci(uci, prepare(line)) + line = line.lower().replace(u'\'','\' ').replace(u'’','\' ').replace('...',u' £ ').replace('?',' ? ').replace('.',' . ').replace('!', ' ! ').replace(',',' , ').replace(';', ' ; ').replace(':', ' : ').strip() + line = line.replace('\n', ' ').replace('\r', ' ') + line = line.split() + content[-1].append(line) + i += 1 +print len(content) diff --git a/autres/chd.R.notuse b/autres/chd.R.notuse new file mode 100644 index 0000000..9d79ac6 --- /dev/null +++ b/autres/chd.R.notuse @@ -0,0 +1,87 @@ +#chd.R +source('%s') +source('%s') +source('%s') +source('%s') +classif.mode <- %i +file.data1 <- '%s' +file.data2 <- '%s' +file.listuce1 <- '%s' +file.listuce2 <- '%s' +file.uce <- '%s' +mincl <- %i +graph.arbre1 <- '%s' +graph.arbre2 <- '%s' +graph.dendro1 <- '%s' +graph.dendro2 <- '%s' +data.out <- %s + +data1<-read.csv2(file.data1, header = FALSE) + +if (classif.mode == 0) { + data2<-read.csv2(file.data2, header = FALSE) +} +chd1<-CHD(data1) + +if (classif.mode == 0) { + chd2<-CHD(data2) +} else { + chd2<-chd1 +} + +#lecture des uce +listuce1<-read.csv2(file.listuce1) + +if (classif.mode == 0) { + listuce2<-read.csv2(file.listuce2) +} + +rm(data1) + +if (classif.mode == 0) rm(data2) + +chd.result <- Rchdtxt(file.uce,mincl=mincl,classif_mode=classif.mode) +n1 <- chd.result$n1 +classeuce1 <- chd.result$cuce1 +classeuce2 <- chd.result$cuce2 + +tree.tot1 <- make_tree_tot(chd1) +open_file_graph(graph.arbre1, widt = 600, height=400) +plot(tree.tot1$tree.cl) +dev.off() + +if (classif.mode == 0) { + tree.tot2 <- make_tree_tot(chd2) + open_file_graph(graph.arbre2, width = 600, height=400) + plot(tree.tot2$tree.cl) + dev.off() +} +tree.cut1 <- make_dendro_cut_tuple(tree.tot1$dendro_tuple, chd.result$coord_ok, classeuce1, 1) +classes<-n1[,9] +open_file_graph(graph.dendro1, width = 600, height=400) +plot.dendropr(tree.cut1$tree.cl,classes) +dev.off() + +if (classif.mode == 0) { + tree.cut2 <- make_dendro_cut_tuple(tree.tot2$dendro_tuple, chd.result$coord_ok, classeuce2, 2) + open_file_graph(graph.dendro2, width = 600, height=400) + plot(tree.cut2$tree.cl) + dev.off() +} +save.image(file=data.out) + + +(RscriptPath['CHD'], RscriptPath['chdtxt'], RscriptPath['anacor'], RscriptPath['Rgraph']) + + """ % DicoPath['TableUc1'] + + """ % DicoPath['TableUc2'] +""" % DicoPath['listeuce1'] + + """ % DicoPath['listeuce2'] +""" % (DicoPath['uce'], mincl, classif_mode) +"""%DicoPath['arbre1'] + """ %DicoPath['arbre2'] +""" % DicoPath['dendro1'] + """ % DicoPath['dendro2'] +% DicoPath['RData'] diff --git a/autres/debian/README b/autres/debian/README new file mode 100644 index 0000000..59b715b --- /dev/null +++ b/autres/debian/README @@ -0,0 +1,6 @@ +The Debian Package iramuteq +---------------------------- + +Comments regarding the Package + + -- pierre Fri, 24 Apr 2009 17:59:50 +0200 diff --git a/autres/debian/README.Debian b/autres/debian/README.Debian new file mode 100644 index 0000000..72aba66 --- /dev/null +++ b/autres/debian/README.Debian @@ -0,0 +1,6 @@ +iramuteq for Debian +------------------- + + + + -- pierre Fri, 24 Apr 2009 17:59:50 +0200 diff --git a/autres/debian/changelog b/autres/debian/changelog new file mode 100644 index 0000000..532a992 --- /dev/null +++ b/autres/debian/changelog @@ -0,0 +1,5 @@ +iramuteq (0.7-alpha1) unstable; urgency=low + + *rien + + -- pierre ratinaud Fri, 05 Dec 2014 23:59:50 +0200 diff --git a/autres/debian/compat b/autres/debian/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/autres/debian/compat @@ -0,0 +1 @@ +7 diff --git a/autres/debian/control b/autres/debian/control new file mode 100644 index 0000000..db744e3 --- /dev/null +++ b/autres/debian/control @@ -0,0 +1,12 @@ +Source: iramuteq +Standards-Version: 0.1.8 +Section: science +Priority: extra +Maintainer: Pierre Ratinaud +Build-Depends: debhelper (>= 7) +Homepage: http://www.iramuteq.org + +Package: iramuteq +Architecture: all +Depends: python (>= 2.7), r-base (>= 3.0.0), python-wxgtk2.8 (>= 2.8), python-xlrd (>= 0.6), python-ooolib, r-cran-rgl (>= 0.79) +Description: Interface de R pour les analyses multidimensionnelles diff --git a/autres/debian/copyright b/autres/debian/copyright new file mode 100644 index 0000000..66cd96d --- /dev/null +++ b/autres/debian/copyright @@ -0,0 +1,38 @@ +This package was debianized by Pierre Ratinaud on +Fri, 18 Sep 2009 17:59:50 +0200. + +It was downloaded from + +Upstream Author(s): + + + +Copyright: + + + +License: + + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. + +The Debian packaging is (C) 2009, Pierre Ratinaud and +is licensed under the GPL, see above. + + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. diff --git a/autres/debian/dirs b/autres/debian/dirs new file mode 100644 index 0000000..e886bb6 --- /dev/null +++ b/autres/debian/dirs @@ -0,0 +1,4 @@ +usr/bin +usr/share/iramuteq +usr/share/applications +usr/share/icons diff --git a/autres/debian/docs b/autres/debian/docs new file mode 100644 index 0000000..ba31a11 --- /dev/null +++ b/autres/debian/docs @@ -0,0 +1,3 @@ +gpl-2.0-fr.txt +gpl-2.0.txt +TODO diff --git a/autres/debian/files b/autres/debian/files new file mode 100644 index 0000000..cbeaff2 --- /dev/null +++ b/autres/debian/files @@ -0,0 +1 @@ +iramuteq_0.7-alpha1_all.deb science extra diff --git a/autres/debian/iramuteq.debhelper.log b/autres/debian/iramuteq.debhelper.log new file mode 100644 index 0000000..cbd42b1 --- /dev/null +++ b/autres/debian/iramuteq.debhelper.log @@ -0,0 +1,14 @@ +dh_installdirs +dh_installchangelogs +dh_installdocs +dh_installexamples +dh_installman +dh_link +dh_strip +dh_compress +dh_fixperms +dh_installdeb +dh_shlibdeps +dh_gencontrol +dh_md5sums +dh_builddeb diff --git a/autres/debian/rules b/autres/debian/rules new file mode 100755 index 0000000..4f118d0 --- /dev/null +++ b/autres/debian/rules @@ -0,0 +1,121 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + + + + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + #$(MAKE) + #docbook-to-man debian/iramuteq.sgml > iramuteq.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + #$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/iramuteq. + #$(MAKE) DESTDIR=$(CURDIR)/debian/iramuteq install + mkdir -p $(CURDIR)/debian/iramuteq + cp iramuteq $(CURDIR)/debian/iramuteq/usr/bin/iramuteq + cp *.py $(CURDIR)/debian/iramuteq/usr/share/iramuteq + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/dictionnaires + cp dictionnaires/* $(CURDIR)/debian/iramuteq/usr/share/iramuteq/dictionnaires + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/Rscripts + cp Rscripts/* $(CURDIR)/debian/iramuteq/usr/share/iramuteq/Rscripts + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/images + cp images/* $(CURDIR)/debian/iramuteq/usr/share/iramuteq/images + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/configuration + cp configuration/* $(CURDIR)/debian/iramuteq/usr/share/iramuteq/configuration + cp iramuteq.desktop $(CURDIR)/debian/iramuteq/usr/share/applications + cp images/iraicone.png $(CURDIR)/debian/iramuteq/usr/share/icons + cp son_fin.wav $(CURDIR)/debian/iramuteq/usr/share/iramuteq + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/en + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/en/LC_MESSAGES + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/fr_FR + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/fr_FR/LC_MESSAGES + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/pt_PT + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/pt_PT/LC_MESSAGES + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/it_IT + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/it_IT/LC_MESSAGES + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/es_ES + mkdir -p $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/es_ES/LC_MESSAGES + cp locale/en/LC_MESSAGES/iramuteq.mo $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/en/LC_MESSAGES + cp locale/fr_FR/LC_MESSAGES/iramuteq.mo $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/fr_FR/LC_MESSAGES + cp locale/pt_PT/LC_MESSAGES/iramuteq.mo $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/pt_PT/LC_MESSAGES + cp locale/es_ES/LC_MESSAGES/iramuteq.mo $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/es_ES/LC_MESSAGES + cp locale/it_IT/LC_MESSAGES/iramuteq.mo $(CURDIR)/debian/iramuteq/usr/share/iramuteq/locale/it_IT/LC_MESSAGES + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/autres/extract.py b/autres/extract.py new file mode 100644 index 0000000..15f47ef --- /dev/null +++ b/autres/extract.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#License: GNU/GPL + + +import codecs +import os +import sys +reload(sys) +import locale +sys.setdefaultencoding(locale.getpreferredencoding()) + +#chemin du fichier +corpus_file = '/home/pierre/fac/lerass/debat/debat_ppoira.txt' +#encodage : cp1252 sous windows +enc = 'utf8' +#la variable +variable = u'*loc' + +with codecs.open(corpus_file, 'r', enc) as f : + content = f.read() +content = content.splitlines() + + +def make_ucis(content) : + ucis = [[content[i].strip().split(),i] for i in range(0,len(content)) if content[i].startswith(u'****')] + return ucis, [a[1] for a in ucis] + +def make_lines(content,ucinb) : + return [[ucinb[i]+1,ucinb[i+1]] for i in range(0,len(ucinb)-1)] + [[ucinb[len(ucinb)-1] + 1,len(content)]] +def make_ucis_txt(content, lines): + return [' '.join(content[l[0]:l[1]]) for l in lines] + +def make_etoile(ucis) : + etoiles = [uci[0][1:] for uci in ucis] + return etoiles + +def make_unique_etoiles(etoiles) : + uetoiles = list(set([etoile for uci in etoiles for etoile in uci])) + return uetoiles + +def treat_var_mod(variables) : + var_mod = {} + for variable in variables : + if u'_' in variable : + forme = variable.split(u'_') + var = forme[0] + mod = forme[1] + if not var in var_mod : + var_mod[var] = [variable] + else : + if not mod in var_mod[var] : + var_mod[var].append(variable) + return var_mod + + +def extract_uci(variable, var_mod, ucis_txt, etoiles) : + for et in var_mod[variable] : + #et = '_'.join([variable,mod]) + tojoin = ['\n'.join([' '.join([u'****']+etoiles[i]), uci]) for i, uci in enumerate(ucis_txt) if et in etoiles[i]] + with open(et[1:]+'.txt', 'w') as f : + f.write('\n\n'.join(tojoin)) + print et[1:]+'.txt' + +ucis,ucisnb = make_ucis(content) +etoiles = make_etoile(ucis) +uetoiles = make_unique_etoiles(etoiles) +var_mod = treat_var_mod(uetoiles) +lines = make_lines(content, ucisnb) +ucis_txt = make_ucis_txt(content, lines) +extract_uci(variable, var_mod, ucis_txt, etoiles) +print 'ok' diff --git a/autres/formes.db b/autres/formes.db new file mode 100644 index 0000000000000000000000000000000000000000..8ec3809c4362e7bdf25176deb464316c3ad6084e GIT binary patch literal 3072 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU|<4bW*~+E5T6moL1QBcqcE8mbRQ}5 z0)?2E+ZdP+0*O&D8UmvsfEEIlOl;!9!i>=+iAg!BscC6I#Oxg8>KNjx5aQ_Mrxt@S6N+Y#2&!(d2v|EPZvr#@ bC>RZa(GVDcAuyW%M_{CndU-SipdkPNx&A9b literal 0 HcmV?d00001 diff --git a/autres/iracmd.py b/autres/iracmd.py new file mode 100644 index 0000000..cca2964 --- /dev/null +++ b/autres/iracmd.py @@ -0,0 +1,190 @@ +#!/bin/env python +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#License: GNU/GPL + +import os +from optparse import OptionParser +import sys +reload(sys) +import locale +import codecs +sys.setdefaultencoding(locale.getpreferredencoding()) +from chemins import ConstructConfigPath, ConstructDicoPath, ConstructRscriptsPath, PathOut +from functions import ReadLexique, DoConf, History, ReadDicoAsDico +from ConfigParser import * +####################################### +#from textchdalc import AnalyseAlceste +#from textdist import PamTxt +#from textafcuci import AfcUci +from textreinert import Reinert +from corpus import Corpus, copycorpus, BuildFromAlceste, BuildSubCorpus +from textaslexico import Lexico +from textstat import Stat +from tools import SubCorpus +from textsimi import SimiTxt +import tempfile +###################################### +import logging +log = logging.getLogger('iramuteq') +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch = logging.StreamHandler() +ch.setFormatter(formatter) +log.addHandler(ch) +log.setLevel(logging.DEBUG) +####################################### + + + +#cmd = iracmd.CmdLine(args=['-f','/home/pierre/workspace/iramuteq/corpus/lru2.txt','-t','alceste']) + +AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0]))) +if os.getenv('HOME') != None: + user_home = os.getenv('HOME') +else: + user_home = os.getenv('HOMEPATH') +UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq')) + +class CmdLine : + def __init__(self, args = None, AppliPath = None, parametres = None) : + AppliPath = AppliPath + self.DictPath = ConstructDicoPath(AppliPath) + self.ConfigPath = ConstructConfigPath(UserConfigPath) + self.syscoding = sys.getdefaultencoding() + self.TEMPDIR = tempfile.mkdtemp('iramuteq') + self.RscriptsPath = ConstructRscriptsPath(AppliPath) + self.PathPath = ConfigParser() + self.PathPath.read(self.ConfigPath['path']) + self.RPath = self.PathPath.get('PATHS', 'rpath') + self.pref = RawConfigParser() + self.pref.read(self.ConfigPath['preferences']) + self.history = History(os.path.join(UserConfigPath, 'history.db')) + print 'CLEAN HISTORY' +# self.history.clean() + + parser = OptionParser() + + parser.add_option("-f", "--file", dest="filename", help="chemin du corpus", metavar="FILE", default=False) + parser.add_option("-t", "--type", dest="type_analyse", help="type d'analyse", metavar="TYPE D'ANALYSE", default=False) + parser.add_option("-c", "--conf", dest="configfile", help="chemin du fichier de configuration pour l'analyse", metavar="CONF", default=None) + parser.add_option("-d", "--confcorp", dest="corpusconfigfile", help="chemin du fichier de configuration pour le corpus", metavar="CONF", default=None) + parser.add_option("-e", "--enc", dest="encodage", help="encodage du corpus", metavar="ENC", default=locale.getpreferredencoding()) + parser.add_option("-l", "--lang", dest="language", help="langue du corpus", metavar="LANG", default='french') + parser.add_option("-r", "--read", dest="read", help="lire un corpus", metavar="READ", default = False) + parser.add_option("-b", "--build", action="store_true", dest="build", help = "construire un corpus", default = False) + + if args is None : + (options, args) = parser.parse_args() + else : + (options, args) = parser.parse_args(args) + print args + print options + options.type_analyse + if options.configfile is not None: + config = DoConf(os.path.abspath(options.configfile)).getoptions() + elif options.filename and options.type_analyse : + config = DoConf(self.ConfigPath[options.type_analyse]).getoptions() + elif options.read and options.type_analyse : + config = DoConf(self.ConfigPath[options.type_analyse]).getoptions() + elif options.read : + pass + elif options.filename and options.build : + pass + else : + print 'rien a faire' + return + + if options.filename or options.read : + self.corpus_encodage = options.encodage + self.corpus_lang = options.language + self.keys = DoConf(self.ConfigPath['key']).getoptions() + + + ReadLexique(self, lang = options.language) + self.expressions = ReadDicoAsDico(self.DictPath.get(options.language + '_exp', 'french_exp')) + gramact = [k for k in self.keys if self.keys[k] == 1] + gramsup = [k for k in self.keys if self.keys[k] == 2] + + if options.filename : + self.filename = os.path.abspath(options.filename) + if options.corpusconfigfile is not None : + corpus_parametres = DoConf(options.corpusconfigfile).getoptions('corpus') + else : + corpus_parametres = DoConf(self.ConfigPath['corpus']).getoptions() + dire, corpus_parametres['filename'] = os.path.split(self.filename) + corpus_parametres['originalpath'] = self.filename + corpus_parametres['encoding'] = self.corpus_encodage + corpus_parametres['syscoding'] = locale.getpreferredencoding() + corpus_parametres['pathout'] = PathOut(self.filename, 'corpus').mkdirout() + try : + corpus = BuildFromAlceste(self.filename, corpus_parametres, self.lexique, self.expressions).corpus + except Exception, txt: + log.info('probleme lors de la construction: %s' %txt) + corpus = None + raise + else : + self.history.add(corpus.parametres) + corpus = copycorpus(corpus) + elif options.read : + corpus = Corpus(self, parametres = DoConf(options.read).getoptions('corpus'), read = options.read) + corpus.parametres['pathout'] = os.path.dirname(os.path.abspath(options.read)) + pathout = os.path.dirname(os.path.dirname(os.path.abspath(options.read))) + self.corpus = corpus + print self.corpus + corpus.parametres['pathout'] = '/home/pierre/fac/etudiant/verdier/corpus20_corpus_2/test2' + BuildSubCorpus(corpus, parametres = {'fromthem' : True, 'theme' : [u'-*thématique_idéal']}) + + if corpus is not None : + corpus.conn_all() + #corpus = SubCorpus(self, corpus, [0,1,2,3,4,5,6,7]) + #corpus.conn_all() + corpus.make_lems() + corpus.parse_active(gramact, gramsup) + #print corpus.getlemconcorde('de').fetchall() +# log.warning('ATTENTION gethapaxuces') +# MakeUciStat(corpus) + #corpus.gethapaxuces() + # ucisize = corpus.getucisize() + # ucisize = [`val` for val in ucisize] + #uciet = [uci.etoiles[1:] for uci in corpus.ucis] + #uceet = [corpus.ucis[uce.uci].etoiles[1:] for uci in corpus.ucis for uce in uci.uces] + #print uceet[0:10] + #for line in uceet : + # print '\t'.join(line) + #res = zip(uciet, ucisize) + # res = [uciet[i] + [ucisize[i]] for i, val in enumerate(uciet)] + # print res[0:10] + #ucesize = corpus.getucesize() + #print ucesize[0:40] + #with open('sentences_size.csv', 'w') as f : + # f.write('\n'.join([`val` for val in ucesize])) + # self.content = f.read() + #self.content = self.content.replace('\r','') + if options.type_analyse == 'alceste' : + log.debug('ATTENTION : ANALYSE NG') + #print corpus.make_etoiles() + #zerzre + #corpus.read_corpus() + #corpus.parse_active(gramact, gramsup) + config['type'] = 'alceste' + self.Text = Reinert(self, corpus, parametres = config) + # self.Text = AnalyseAlceste(self, cmd = True, big = True) + #self.Text = AnalyseAlceste(self, cmd = True) + elif options.type_analyse == 'pam' : + self.Text = PamTxt(self, cmd = True) + elif options.type_analyse == 'afcuci' : + self.Text = AfcUci(self, cmd = True) + elif options.type_analyse == 'stat' : + self.Text = Stat(self, corpus, parametres = {'type':'stat'}) + elif options.type_analyse == 'spec' : + self.Text = Lexico(self, corpus, config = {'type' : 'spec'}) + elif options.type_analyse == 'simitxt' : + self.Text = SimiTxt(self, corpus, parametres = parametres) + #print self.Text.corpus.hours, 'h', self.Text.corpus.minutes,'min', self.Text.corpus.seconds, 's' +# self.Text.corpus.make_colored_corpus('colored.html') + +if __name__ == '__main__': + __name__ = 'Main' + CmdLine(AppliPath = AppliPath) + diff --git a/autres/iramuteq b/autres/iramuteq new file mode 100755 index 0000000..94cf12c --- /dev/null +++ b/autres/iramuteq @@ -0,0 +1,2 @@ +#!/bin/sh +python /usr/share/iramuteq/iramuteq.py $1 $2 diff --git a/autres/iramuteq.desktop b/autres/iramuteq.desktop new file mode 100644 index 0000000..36f9dce --- /dev/null +++ b/autres/iramuteq.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Version=0.0.1 +Type=Application +Name=IRaMuTeQ +Exec=iramuteq +Terminal=false +Categories=Education;Science; +Icon=/usr/share/icons/iraicone.png diff --git a/autres/iramuteq_en.po b/autres/iramuteq_en.po new file mode 100644 index 0000000..9ac4937 --- /dev/null +++ b/autres/iramuteq_en.po @@ -0,0 +1,1059 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-09-11 16:30+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: layout.py:507 +msgid "3D graph" +msgstr "" + +#: iramuteq.py:279 +msgid "About..." +msgstr "" + +#: dialog.py:1692 dialog.py:1693 +msgid "Absent form" +msgstr "" + +#: dialog.py:1336 +msgid "Actives variables (almost 3)" +msgstr "" + +#: dialog.py:1873 +msgid "Add cluster size" +msgstr "" + +#: layout.py:336 tree.py:433 tree.py:638 +msgid "Antiprofiles" +msgstr "" + +#: layout.py:133 +msgid "Are you sure ?" +msgstr "" + +#: dialog.py:952 dialog.py:1029 +msgid "Attention" +msgstr "" + +#: dialog.py:574 +msgid "Avoid overlay" +msgstr "" + +#: dialog.py:2083 +msgid "Background color" +msgstr "" + +#: dialog.py:1247 +msgid "Be carefull : computation of repeated segments profiles can be very long on large corpus" +msgstr "" + +#: layout.py:487 layout.py:514 +msgid "CA" +msgstr "" + +#: dialog.py:2345 +msgid "Change ..." +msgstr "" + +#: dialog.py:1215 +msgid "Characteristic text segments" +msgstr "" + +#: dialog.py:82 dialog.py:2284 dialog.py:2645 +msgid "Characters set" +msgstr "" + +#: dialog.py:393 +msgid "Check" +msgstr "" + +#: dialog.py:354 +msgid "" +"Check for new \n" +"releases at startup" +msgstr "" + +#: dialog.py:383 +msgid "" +"Check installation \n" +"of R packages" +msgstr "" + +#: dialog.py:1481 iramuteq.py:246 +msgid "Chi2" +msgstr "" + +#: dialog.py:1728 +msgid "Choice" +msgstr "" + +#: guifunct.py:27 +msgid "Choose a file" +msgstr "" + +#: dialog.py:2490 +msgid "Choose a folder" +msgstr "" + +#: dialog.py:2463 +msgid "Cleaning" +msgstr "" + +#: layout.py:382 layout.py:479 +msgid "Cluster" +msgstr "" + +#: dialog.py:1308 iramuteq.py:251 iramuteq.py:272 layout.py:519 +#: OptionAlceste.py:29 tree.py:394 +msgid "Clustering" +msgstr "" + +#: tree.py:441 tree.py:620 tree.py:629 +msgid "Clusters statistics" +msgstr "" + +#: dialog.py:1856 +msgid "Color or black and white" +msgstr "" + +#: tree.py:439 tree.py:593 +msgid "Colored corpus" +msgstr "" + +#: dialog.py:63 dialog.py:64 dialog.py:68 +msgid "Column separator" +msgstr "" + +#: guifunct.py:337 +msgid "Communities" +msgstr "" + +#: tree.py:462 +msgid "Compute Tgen" +msgstr "" + +#: dialog.py:2277 +msgid "Corpus' name" +msgstr "" + +#: dialog.py:2312 +msgid "Default" +msgstr "" + +#: dialog.py:440 +msgid "Default R mirror" +msgstr "" + +#: OptionAlceste.py:52 +msgid "Default values" +msgstr "" + +#: dialog.py:2409 +msgid "Delete characters not in this list" +msgstr "" + +#: tree.py:473 +msgid "Delete from history" +msgstr "" + +#: dialog.py:1797 +msgid "Dendrogram" +msgstr "" + +#: dialog.py:1841 +msgid "Dendrogram type" +msgstr "" + +#: dialog.py:2302 +msgid "Dictionary" +msgstr "" + +#: tree.py:607 +msgid "Done" +msgstr "" + +#: guifunct.py:610 +msgid "Edges color" +msgstr "" + +#: guifunct.py:275 +msgid "Edges threshold" +msgstr "" + +#: guifunct.py:510 +msgid "Edges width proportional to score" +msgstr "" + +#: iramuteq.py:283 +msgid "Edition" +msgstr "" + +#: iramuteq.py:234 +msgid "Exit" +msgstr "" + +#: tree.py:443 +msgid "Export Clusters" +msgstr "" + +#: tree.py:438 +msgid "Export corpus" +msgstr "" + +#: tree.py:455 +msgid "Export dictionary" +msgstr "" + +#: dialog.py:2915 +msgid "Export finished. Open in a web browser :" +msgstr "" + +#: dialog.py:924 +msgid "Export for ..." +msgstr "" + +#: tree.py:456 +msgid "Export lemma dictionary" +msgstr "" + +#: iramuteq.py:219 +msgid "Extract mods" +msgstr "" + +#: iramuteq.py:220 +msgid "Extract thematics" +msgstr "" + +#: dialog.py:2676 +msgid "Extraction type" +msgstr "" + +#: layout.py:496 +msgid "Factor" +msgstr "" + +#: dialog.py:590 +msgid "Factor x : " +msgstr "" + +#: dialog.py:592 +msgid "Factor y : " +msgstr "" + +#: dialog.py:594 +msgid "Factor z : " +msgstr "" + +#: iramuteq.py:282 +msgid "File" +msgstr "" + +#: guifunct.py:51 guifunct.py:62 guifunct.py:73 +msgid "File format" +msgstr "" + +#: dialog.py:53 dialog.py:54 dialog.py:58 +msgid "First column is an id" +msgstr "" + +#: dialog.py:43 dialog.py:44 dialog.py:48 +msgid "First line is header" +msgstr "" + +#: iramuteq.py:245 +msgid "Frequencies" +msgstr "" + +#: dialog.py:2395 +msgid "General" +msgstr "" + +#: guifunct.py:375 +msgid "Graph settings" +msgstr "" + +#: dialog.py:544 guifunct.py:239 +msgid "Graphic type" +msgstr "" + +#: guifunct.py:683 +msgid "Graphical settings" +msgstr "" + +#: guifunct.py:549 +msgid "Gray scale on text proportional to frequency (0=black, 1=white)" +msgstr "" + +#: iramuteq.py:287 +msgid "Help" +msgstr "" + +#: iramuteq.py:240 +msgid "Home page" +msgstr "" + +#: iramuteq.py:213 +msgid "Import from TXM" +msgstr "" + +#: iramuteq.py:211 +msgid "Import from factiva" +msgstr "" + +#: tree.py:384 +msgid "Informations" +msgstr "" + +#: dialog.py:369 +msgid "Interface language" +msgstr "" + +#: dialog.py:2445 +msgid "Keep punctuation" +msgstr "" + +#: dialog.py:2293 +msgid "Language" +msgstr "" + +#: guifunct.py:224 +msgid "Layout" +msgstr "" + +#: dialog.py:919 dialog.py:1255 +msgid "Lemmatised corpus" +msgstr "" + +#: iramuteq.py:1131 +msgid "License GNU GPL" +msgstr "" + +#: dialog.py:972 +msgid "Like ALCESTE" +msgstr "" + +#: dialog.py:972 +msgid "Like Lexico" +msgstr "" + +#: dialog.py:2826 +msgid "Limit frequency" +msgstr "" + +#: dialog.py:570 +msgid "Limit points by cluster chi2" +msgstr "" + +#: dialog.py:2846 +msgid "Limit rank" +msgstr "" + +#: layout.py:72 +msgid "List of not plotted points : " +msgstr "" + +#: dialog.py:599 guifunct.py:660 +msgid "Make a movie" +msgstr "" + +#: dialog.py:2367 +msgid "Make text segments" +msgstr "" + +#: iramuteq.py:285 iramuteq.py:446 iramuteq.py:635 iramuteq.py:697 +#: iramuteq.py:700 +msgid "Matrix analysis" +msgstr "" + +#: dialog.py:400 +msgid "" +"Maximum \n" +"memory for R" +msgstr "" + +#: OptionAlceste.py:43 +msgid "Maximum number of analyzed forms" +msgstr "" + +#: dialog.py:2003 +msgid "Maximum number of forms" +msgstr "" + +#: dialog.py:1224 +msgid "Maximum number of text segments" +msgstr "" + +#: guifunct.py:262 +msgid "Maximum tree" +msgstr "" + +#: dialog.py:1273 +msgid "Maxmum size of segments" +msgstr "" + +#: dialog.py:1739 dialog.py:2866 +msgid "Minimum frequency" +msgstr "" + +#: OptionAlceste.py:40 +msgid "Minimum frequency of an analyzed form (2=automatic)" +msgstr "" + +#: dialog.py:1281 +msgid "Minimum frequency of segments" +msgstr "" + +#: OptionAlceste.py:37 +msgid "Minimum frequency of text segments by clusters (0=automatic)" +msgstr "" + +#: dialog.py:1265 +msgid "Minimum size of segments" +msgstr "" + +#: dialog.py:1371 +msgid "Minimum text segments frenquency in clusters (2= automatic)" +msgstr "" + +#: dialog.py:2667 +msgid "Modalities (one by line, with the *)" +msgstr "" + +#: iramuteq.py:328 tree.py:440 +msgid "Navigator" +msgstr "" + +#: dialog.py:1354 dialog.py:1582 +msgid "Next" +msgstr "" + +#: corpus.py:1431 +msgid "No Text in corpus. Are you sure of the formatting ?" +msgstr "" + +#: dialog.py:2452 +msgid "No space between two forms" +msgstr "" + +#: dialog.py:1361 OptionAlceste.py:35 +msgid "Number of terminal clusters on phase 1" +msgstr "" + +#: dialog.py:2680 +msgid "One file by modality" +msgstr "" + +#: iramuteq.py:280 +msgid "Online help..." +msgstr "" + +#: dialog.py:2680 +msgid "Only one file" +msgstr "" + +#: tree.py:434 tree.py:469 +msgid "Open ..." +msgstr "" + +#: iramuteq.py:191 +msgid "Open a matrix" +msgstr "" + +#: iramuteq.py:195 +msgid "Open a text corpus" +msgstr "" + +#: iramuteq.py:199 +msgid "Open an analysis" +msgstr "" + +#: tree.py:607 +msgid "Open in a web browser ?" +msgstr "" + +#: dialog.py:2320 +msgid "Other" +msgstr "" + +#: dialog.py:930 dialog.py:976 dialog.py:1007 parse_factiva_xml.py:94 +msgid "Output file" +msgstr "" + +#: dialog.py:2332 +msgid "Output folder" +msgstr "" + +#: tree.py:437 +msgid "POS profiles" +msgstr "" + +#: dialog.py:1080 dialog.py:2273 +msgid "Path" +msgstr "" + +#: dialog.py:428 dialog.py:437 +msgid "Path : " +msgstr "" + +#: dialog.py:550 dialog.py:1978 guifunct.py:247 +msgid "Picture format" +msgstr "" + +#: dialog.py:1805 guifunct.py:385 +msgid "Picture size" +msgstr "" + +#: dialog.py:341 +msgid "Play a sound at the end of analysis" +msgstr "" + +#: iramuteq.py:602 tree.py:712 tree.py:1010 +msgid "Please wait..." +msgstr "" + +#: tree.py:495 +msgid "Please wait...Reading corpus" +msgstr "" + +#: OptionAlceste.py:47 +msgid "Potato mode (less precise, faster)" +msgstr "" + +#: iramuteq.py:237 +msgid "Preferences" +msgstr "" + +#: dialog.py:1357 dialog.py:1581 +msgid "Previous" +msgstr "" + +#: layout.py:510 +msgid "Profiles" +msgstr "" + +#: iramuteq.py:254 +msgid "Prototypical Analysis" +msgstr "" + +#: dialog.py:2401 +msgid "Put text in lowercase" +msgstr "" + +#: dialog.py:432 +msgid "R path" +msgstr "" + +#: dialog.py:1220 +msgid "Ranking score" +msgstr "" + +#: dialog.py:2803 +msgid "Ranks" +msgstr "" + +#: layout.py:375 +msgid "Reading profiles" +msgstr "" + +#: tree.py:392 +msgid "Reinert method" +msgstr "" + +#: iramuteq.py:249 iramuteq.py:270 +msgid "Reinert's Method" +msgstr "" + +#: tree.py:385 +msgid "Rename" +msgstr "" + +#: dialog.py:1243 layout.py:516 tree.py:436 +msgid "Repeated segments profiles" +msgstr "" + +#: dialog.py:2429 +msgid "Replace apostrophe by space" +msgstr "" + +#: dialog.py:2437 +msgid "Replace dash by space" +msgstr "" + +#: tree.py:442 tree.py:647 tree.py:657 +msgid "Report" +msgstr "" + +#: dialog.py:556 +msgid "Representation" +msgstr "" + +#: dialog.py:1521 +msgid "Results" +msgstr "" + +#: dialog.py:2605 +msgid "Save as ..." +msgstr "" + +#: dialog.py:1736 guifunct.py:209 +msgid "Score" +msgstr "" + +#: guifunct.py:309 +msgid "Score on edges" +msgstr "" + +#: tree.py:616 +msgid "Search ..." +msgstr "" + +#: parse_factiva_xml.py:89 +msgid "Select a directory of txt files" +msgstr "" + +#: parse_factiva_xml.py:87 +msgid "Select a directory of xml files" +msgstr "" + +#: dialog.py:2323 dialog.py:2640 +msgid "Select a file" +msgstr "" + +#: guifunct.py:356 +msgid "Select a variable" +msgstr "" + +#: dialog.py:1726 +msgid "Select by" +msgstr "" + +#: tabsimi.py:97 +msgid "Select columns" +msgstr "" + +#: dialog.py:2782 +msgid "Selection" +msgstr "" + +#: dialog.py:330 dialog.py:469 dialog.py:970 dialog.py:2120 dialog.py:2250 +#: dialog.py:2789 guifunct.py:160 OptionAlceste.py:63 +msgid "Settings" +msgstr "" + +#: iramuteq.py:241 +msgid "Show data" +msgstr "" + +#: iramuteq.py:242 +msgid "Show results" +msgstr "" + +#: iramuteq.py:253 iramuteq.py:273 +msgid "Similarities Analysis" +msgstr "" + +#: tree.py:395 +msgid "Similarities analysis" +msgstr "" + +#: OptionAlceste.py:31 +msgid "Size of rst1" +msgstr "" + +#: OptionAlceste.py:33 +msgid "Size of rst2" +msgstr "" + +#: iramuteq.py:267 tree.py:390 +msgid "Specificities and CA" +msgstr "" + +#: dialog.py:596 guifunct.py:647 +msgid "Spheres transparency" +msgstr "" + +#: iramuteq.py:218 tree.py:417 +msgid "Split from variable" +msgstr "" + +#: tree.py:418 +msgid "Split matrix" +msgstr "" + +#: layout.py:544 +msgid "Stat by cluster" +msgstr "" + +#: iramuteq.py:266 tree.py:389 +msgid "Statistics" +msgstr "" + +#: tree.py:398 +msgid "Sub corpus from metadata" +msgstr "" + +#: tree.py:399 +msgid "Sub corpus from thematic" +msgstr "" + +#: tree.py:400 +msgid "Subcorpus" +msgstr "" + +#: dialog.py:1340 +msgid "Supplementaries variables (almost 1)" +msgstr "" + +#: dialog.py:1327 +msgid "Supplementary variables are marked with a *" +msgstr "" + +#: dialog.py:562 +msgid "Take the x first points" +msgstr "" + +#: dialog.py:566 +msgid "Take the x first points by cluster" +msgstr "" + +#: iramuteq.py:286 iramuteq.py:447 iramuteq.py:634 iramuteq.py:696 +#: iramuteq.py:699 openanalyse.py:152 openanalyse.py:155 openanalyse.py:158 +#: openanalyse.py:161 openanalyse.py:164 openanalyse.py:167 +msgid "Text analysis" +msgstr "" + +#: dialog.py:2072 +msgid "Text color" +msgstr "" + +#: dialog.py:2350 +msgid "Text mark" +msgstr "" + +#: guifunct.py:296 +msgid "Text on vertex" +msgstr "" + +#: dialog.py:2375 +msgid "Text segments build process" +msgstr "" + +#: dialog.py:2384 +msgid "Text segments size" +msgstr "" + +#: dialog.py:73 dialog.py:74 dialog.py:78 +msgid "Text separator" +msgstr "" + +#: dialog.py:560 dialog.py:2032 guifunct.py:322 +msgid "Text size" +msgstr "" + +#: dialog.py:583 +msgid "Text size proportional to chi2" +msgstr "" + +#: dialog.py:576 +msgid "Text size proportional to frequency" +msgstr "" + +#: tree.py:461 +msgid "Tgen Editor" +msgstr "" + +#: dialog.py:952 dialog.py:1029 +msgid "This file already exists. Continue anyway ?" +msgstr "" + +#: layout.py:133 +msgid "This file will be delete : " +msgstr "" + +#: iramuteq.py:227 +msgid "Tools" +msgstr "" + +#: guifunct.py:196 +msgid "Use previous coordinates" +msgstr "" + +#: dialog.py:420 +msgid "Use svdlibc" +msgstr "" + +#: dialog.py:2359 +msgid "Use the expression dictionary" +msgstr "" + +#: dialog.py:1721 dialog.py:2017 +msgid "Used forms" +msgstr "" + +#: dialog.py:2799 +msgid "Variables" +msgstr "" + +#: dialog.py:2657 +msgid "Variables (with the * but without the _)" +msgstr "" + +#: dialog.py:1748 +msgid "Variables choice" +msgstr "" + +#: dialog.py:2217 +msgid "Variables selection" +msgstr "" + +#: guifunct.py:598 +msgid "Vertex color" +msgstr "" + +#: guifunct.py:626 +msgid "Vertex size" +msgstr "" + +#: guifunct.py:416 +msgid "Vertex size proportional to frequency" +msgstr "" + +#: guifunct.py:463 +msgid "Vertex text size proportional to frequency" +msgstr "" + +#: iramuteq.py:284 iramuteq.py:445 iramuteq.py:574 iramuteq.py:633 +msgid "View" +msgstr "" + +#: dialog.py:1988 +msgid "Word size proportional to ..." +msgstr "" + +#: iramuteq.py:275 +msgid "WordCloud" +msgstr "" + +#: tree.py:396 +msgid "Wordcloud" +msgstr "" + +#: dialog.py:1927 +msgid "Wordcloud settings" +msgstr "" + +#: dialog.py:1222 +msgid "absolute (sum of chi2 of marked forms in segment)" +msgstr "" + +#: dialog.py:559 dialog.py:1722 dialog.py:2021 +msgid "actives" +msgstr "" + +#: dialog.py:1722 dialog.py:2021 +msgid "actives and supplementaries" +msgstr "" + +#: OptionAlceste.py:32 +msgid "actives forms" +msgstr "" + +#: tree.py:468 +msgid "antiprofiles" +msgstr "" + +#: dialog.py:2832 dialog.py:2852 +msgid "automatic (mean)" +msgstr "" + +#: dialog.py:1883 +msgid "bar" +msgstr "" + +#: dialog.py:1860 +msgid "black and white" +msgstr "" + +#: dialog.py:2154 +msgid "black and white graphical" +msgstr "" + +#: dialog.py:2257 +msgid "characters" +msgstr "" + +#: dialog.py:1733 dialog.py:1735 dialog.py:1992 +msgid "chi2" +msgstr "" + +#: dialog.py:1883 +msgid "circular diagram" +msgstr "" + +#: dialog.py:1481 +msgid "cluster" +msgstr "" + +#: dialog.py:559 dialog.py:873 +msgid "clusters" +msgstr "" + +#: dialog.py:1860 +msgid "color" +msgstr "" + +#: dialog.py:2148 +msgid "column percentage" +msgstr "" + +#: dialog.py:557 +msgid "coordinates" +msgstr "" + +#: dialog.py:2269 dialog.py:2636 +msgid "corpus" +msgstr "" + +#: dialog.py:557 +msgid "correlations" +msgstr "" + +#: OptionAlceste.py:30 +msgid "double on RST" +msgstr "" + +#: dialog.py:2132 +msgid "expected values" +msgstr "" + +#: dialog.py:1481 +msgid "form" +msgstr "" + +#: dialog.py:1992 +msgid "frequency" +msgstr "" + +#: iramuteq.py:207 +msgid "from copy/paste" +msgstr "" + +#: iramuteq.py:206 +msgid "from mail" +msgstr "" + +#: iramuteq.py:205 +msgid "from xml" +msgstr "" + +#: dialog.py:2151 +msgid "graphical" +msgstr "" + +#: dialog.py:554 dialog.py:1813 dialog.py:1950 guifunct.py:393 +msgid "height" +msgstr "" + +#: dialog.py:1733 +msgid "hypergeometrical law" +msgstr "" + +#: dialog.py:2832 dialog.py:2852 +msgid "manual" +msgstr "" + +#: dialog.py:1727 +msgid "modalities" +msgstr "" + +#: dialog.py:46 dialog.py:56 dialog.py:349 dialog.py:364 dialog.py:921 +#: dialog.py:1259 dialog.py:1331 +msgid "no" +msgstr "" + +#: dialog.py:2129 +msgid "observed values" +msgstr "" + +#: dialog.py:2257 +msgid "occurrences" +msgstr "" + +#: dialog.py:2257 +msgid "paragraphs" +msgstr "" + +#: dialog.py:1222 +msgid "relative (mean of chi2 of marked forms in segment)" +msgstr "" + +#: dialog.py:2135 +msgid "residuals" +msgstr "" + +#: dialog.py:2145 +msgid "row percentage" +msgstr "" + +#: dialog.py:1481 +msgid "see" +msgstr "" + +#: OptionAlceste.py:30 +msgid "simple on text segments" +msgstr "" + +#: OptionAlceste.py:30 +msgid "simple on texts" +msgstr "" + +#: dialog.py:2138 +msgid "standardized residuals" +msgstr "" + +#: dialog.py:559 +msgid "stars" +msgstr "" + +#: dialog.py:559 dialog.py:1722 dialog.py:2021 +msgid "supplementaries" +msgstr "" + +#: OptionAlceste.py:45 +msgid "svd method" +msgstr "" + +#: dialog.py:2686 +msgid "thematics (one by line, with the -*)" +msgstr "" + +#: dialog.py:2142 +msgid "total percentage" +msgstr "" + +#: dialog.py:1727 +msgid "variables" +msgstr "" + +#: dialog.py:552 dialog.py:1824 dialog.py:1962 guifunct.py:400 +msgid "width" +msgstr "" + +#: dialog.py:46 dialog.py:56 dialog.py:349 dialog.py:364 dialog.py:921 +#: dialog.py:1259 dialog.py:1331 +msgid "yes" +msgstr "" diff --git a/autres/iramuteqsvn.desktop b/autres/iramuteqsvn.desktop new file mode 100644 index 0000000..fc304ff --- /dev/null +++ b/autres/iramuteqsvn.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Version=0.0.1 +Type=Application +Name=IRaMuTeQ-SVN +Exec=iramuteqsvn +Terminal=false +Categories=science; +Icon=$HOME/iramuteq/images/iraicone.png diff --git a/autres/iraopen.py b/autres/iraopen.py new file mode 100644 index 0000000..f81b700 --- /dev/null +++ b/autres/iraopen.py @@ -0,0 +1,128 @@ +#!/bin/env python +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#Lisense: GNU/GPL + +import os +from optparse import OptionParser +import sys +reload(sys) +import locale +import codecs +sys.setdefaultencoding(locale.getpreferredencoding()) +from chemins import ConstructConfigPath, ConstructDicoPath, ConstructRscriptsPath, ChdTxtPathOut +from functions import ReadLexique +from ConfigParser import * +####################################### +from textchdalc import AnalyseAlceste +from textdist import PamTxt +#from textafcuci import AfcUci +from textstat import Stat +from corpus import Corpus +import tempfile +import pickle +from word_stat import * +from textclassechd import ClasseCHD + +AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0]))) +if os.getenv('HOME') != None: + user_home = os.getenv('HOME') +else: + user_home = os.getenv('HOMEPATH') +UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq')) + +class CmdLine : + def __init__(self) : + self.DictPath = ConstructDicoPath(AppliPath) + self.ConfigPath = ConstructConfigPath(UserConfigPath) + + parser = OptionParser() + + parser.add_option("-f", "--file", dest="filename", help="chemin du corpus", metavar="FILE", default=False) + parser.add_option("-t", "--type", dest="type_analyse", help="type d'analyse", metavar="TYPE D'ANALYSE", default='alceste') + + parser.add_option("-c", "--conf", dest="configfile", help="chemin du fichier de configuration", metavar="CONF", default=False) + parser.add_option("-e", "--enc", dest="encodage", help="encodage du corpus", metavar="ENC", default=locale.getpreferredencoding()) + parser.add_option("-l", "--lang", dest="language", help="langue du corpus", metavar="LANG", default='french') + (options, args) = parser.parse_args() + print args + print options + if options.filename : + self.filename = os.path.abspath(options.filename) + self.conf = RawConfigParser() + self.conf.read(self.filename) + print self.conf.sections() + + if 'analyse' in self.conf.sections() : + print 'zerzerz' + DictPathOut=ChdTxtPathOut(os.path.dirname(self.filename)) + self.pathout = os.path.dirname(self.filename) + self.DictPathOut=DictPathOut + self.corpus = Corpus(self) + self.corpus.dictpathout = self.DictPathOut + self.corpus.read_corpus_from_shelves(self.DictPathOut['db']) + self.corpus.parametre['analyse'] = 'alceste' + self.corpus.make_lem_type_list() + for i in range(1,18) : + ClasseCHD(self, self.corpus, i, True) + zerzerzer + #ll = self.corpus.find_segments_doublon(15,1000000) + #with open('extrait_doublons.csv' ,'w') as f : + # f.write('\n'.join([';'.join([`v[0]`,v[1]]) for v in ll])) + #print ll + #self.corpus.count_uci_from_list('/home/pierre/fac/lerass/bouquin_indentite/liste_mot_chercher_uci.txt') + #print 'start pickle' + #output = open('testpickle.pkl', 'r') + #pickle.dump(self.corpus.formes, output, -1) + #formes = pickle.load(output) + #output.close() + #print 'finish pickle' + #sdfsdfs + #listin = '/home/pierre/fac/identite/Personnages.csv' + #with codecs.open(listin, 'r', 'cp1252') as f : + # content = f.read() + #content = content.replace('"','').splitlines() + #print content + #self.corpus.make_and_write_sparse_matrix_from_uce_list(content, '/home/pierre/fac/identite/personnages.mm') + #print 'zerzer' + # print 'EXTRACT NR' + # self.corpus.extractnr() + #listin = [u'droit', u'devoir'] + #make_word_stat(self.corpus, listin) + Alceste=True + fsdfsdfd + self.filename = os.path.abspath(options.filename) + self.corpus_encodage = options.encodage + self.corpus_lang = options.language + if options.configfile : + self.ConfigPath[options.type_analyse] = os.path.abspath(options.configfile) + self.TEMPDIR = tempfile.mkdtemp('iramuteq') + self.RscriptsPath = ConstructRscriptsPath(AppliPath) + self.PathPath = ConfigParser() + self.PathPath.read(self.ConfigPath['path']) + self.RPath = self.PathPath.get('PATHS', 'rpath') + self.pref = RawConfigParser() + self.pref.read(self.ConfigPath['preferences']) + #print 'PAS DE CODECS POUR CABLE' + with codecs.open(self.filename, 'r', self.corpus_encodage) as f: + self.content = f.read() + self.content = self.content.replace('\r','') + ReadLexique(self, lang = options.language) + if options.type_analyse == 'alceste' : + # print 'ATTENTION : BIGGGGGGGGGGGGGGGGGGG' + # self.Text = AnalyseAlceste(self, cmd = True, big = True) + self.Text = AnalyseAlceste(self, cmd = True) + elif options.type_analyse == 'pam' : + self.Text = PamTxt(self, cmd = True) + elif options.type_analyse == 'afcuci' : + self.Text = AfcUci(self, cmd = True) + elif options.type_analyse == 'stat' : + self.Text = Stat(self, cmd = True) + #print self.Text.corpus.hours, 'h', self.Text.corpus.minutes,'min', self.Text.corpus.seconds, 's' +# self.Text.corpus.make_colored_corpus('colored.html') + +if __name__ == '__main__': + __name__ = 'Main' + CmdLine() + diff --git a/autres/liste modules python.ods b/autres/liste modules python.ods new file mode 100644 index 0000000000000000000000000000000000000000..7944771b00e88b9ef5eb532037c3611d09e5f627 GIT binary patch literal 7506 zcmZ`;Wl&wqnmq(}cMBRMxCi&(5FkKsIrza{6Fj&(2X}XOcjw^l65K+7;l7zycjnGa zcXie7y=#44`|Gv-tfedm4TA*u&p`nQwB`$Ce%t)D5Z)HZ0t9q&w*wm5*;!i{8#-Co z+OW9Tm@wNKI$Ag~+u8wbOl*yvK|mWPW=A^*prMJQIS}Zi{8keO0Qav76o3?jC_)=( z06^*On7>YPbaJ-_Ix@R~toyzW+pMr+wBsKNBcOQ1)9}&9BB(f+Pa7+p!B64Pb7X)1 zk!Mt>zp+(7BbTl17_zl=FrJouPBzg#1TN;*8HQ7D#R95f%{we{9o|=xKcbF=_t*4` z$t-8#TTb;pA1JwovMHLcF|gmMEw3)(iz>iv4_M?b+d|eCO-rc$Cf*6Te;l;nd533f=(`hHyDT^?b zR&zoxbO}Nfz;Qrk6l5p zKL$#lS$FnwKG}!MaKQ2wMsNTja$7V$)6FUhmBAJ0?Cv-U-1Jo| zFg#s?JfmtC3r)oKM&v|=_I~uRDb{P|BkdOVN6WpH2ni_{NxdI~Mts77SW#*L9G4HF zTsiR{BqLnvVa4?orkJf0FW$j>l<_ZqD$Oc$a6Mv8&W8v7SUjhL0bbxFw4T(r@2}Y> zN~gB+U^k#Ge0zdu^!TS034TW)ncIrNvSN4WBNE!iHrm(a`?A`jpsB(*lKchZ(OF|^ zCZ@o$qN8GTRqdIdP9#2M|2zT5>QNXNgjr#!1HoQu*z6grZ`=(nJK3t28&Zl76T`QV zZ1yQC7@jB#Z*(3W1gtwDQ6<_iv+0eF1JZ3UdV8i)5VCWJ*|;B+1{d#g_M6W%*7EV0 zpJV0H?(hMC*H>u3|5W7^9!q{SE&y<=00lsPQ>C%3jniK;ev{>?uCC+ur?`%dl4o@0 zI~(L7>XayIu9QZ0>Xcy{_Bfh!KF@0P_$t^3(v_>2J-~V8MxqH}T68*sH9YaS@HC<#0z(;AGr&{ z9eYqA_Uw%6?7Ad#t>(~4h`C^2vJd>%|%VH zqh}&6Uj=#HTls?PsINVP4o>Sk_a{v)q^&Q1Cx!*rcDm4|wkNXt;u%c5c**NM?YQqc z55Oqji}&dO_@7dn58yf{wN(dtYW@9}tQRs!T@f=#NWfq)S%|GRVlD~4H*vT!C|edkaLf)Jsx;{A#&=Q z8I2;I5BDl#A?Vh%{M+;NGMDty69d6Iue{G}u}%S&&eo^y$7vWU6+gDC(KPC=7ih?G z7mbe*C&E_mh1ct|GOqfqiee9nuvqS(zbn45TZA?(A<`Fd1DPYs*!YN5!hKw&+~nyv zgIzW2`xB!kb%GTpwaHrx$rXj#g#XaJde?a0>X2-qA*P&Aq3?d5J)`b4a)D=+~rP)voe847#dZ^QoNfc3UrCmRYE!!2gK1@BIEE# z14k)~sm}jkYAVFj`$9SLv?kM-$LDA_rRGJn$6?+BHR;GpSR<5hYQ7cRj<^@FciwEK#@S2K4 zEB1aS7@Sc6;pn2sxL)V2%@TRW_0sd=NxtK_<#_^VXwhZbkhBi*`ir2qYx z(Y{AQ%50xUfm17YA12bEw`Uh#TYFs&AY)myZv8ngc)uob-wLj_Kg#< zCM?r7&DnHL(Phbd3Ik%p7T-44VX`|yKORrZrB}k3ESR8k+0Wfn7)y-n^nB|n^cm8$ zaqP6^t+V2q0cqTtV($0cb}RZ^6Td?7t|X=VJ`?61{c?&yjLPngl^wBzbq(~by67_? zUA1L>r87Z@k#emXh88T79Wc~VJgzXOC>!>OirCK~I3cz+p)`6O0K$a2NJ+e28I->^ z4S&Ruo1<~E8}D(C{ZNHHI;kSy7mq{C&U{yO9wvCo+3UmWB8P~6+EjFYfJB%ZEg~Rx zcm6zU`YSLh}7rZl#P&0q$uxH8**||^rsaETbFCRLRjkQ$g zaifpfvzpQW$^+FHMqB%9F__u_OVv&uck$KYdr*L84AN7o#74#>dy!&OY&z+b?k-Ly zZe!GOi-ePy+y&Pi@fYwGbtMf%Ke#69@Awny(P zhO%2eUuN{!5REh{6H_q5>R0DmON4Ycx;+Lm(QQsjSNU!*`{bK+lEMkK@G;MI(@{Ja zM(=ey5b6>3hbKhyn!mqWYbKV!(E6EtNmk>j*SIL3=ITRrufIrm^@X=Cyq%<#s>d1c|ys~&D#bYEf>@4&HN6IH?Qc9|#zZrC!+ zX$x(B>4X^J@{L&Do{MoGD0Xr=OOW0TDr-1~Fu*y>xZ~cUrm9LWru?!wH)4gaVf>Ch zvgq2u-_Q>>dg2*-AiQEoYaIH-OW1>SMTSC-vZ3sB^d&?AtHoSf@I~j9%%!-#+=`BS zp|jIqR(Ngm;j?#8rBBoKUfi8+(Qmx^^0Y&EaDBOO527U6uNVWANfB5g_xVm|>1o)0 zo|W&)s+_!I&iZI4m* z!x<+glk3ZOdkny(CXJG6N{A20$-=CCDCh>>7kkS;U`GYjoc!N`xp!RFGwhmq#4?RV zr^Q}z?1ZLhb()+&MsCsNAuS;Go^QRmn|eskL}Vs5-u^veLp$MY;?R|GU}WKhk!+Lq zaC*D&hib;m19#*Nj9MIIv!q*-zsj=4&AOzp-9if;QKOu;RKQ-rRIN-H9fXZL~T7_knH@T1+FpZ2M|T7ZRh6iBg-fJ zX!|yl@H`oXZ959fQ8qekRDxgX@A5lPB{>$}2HNfsU}pM#6Xj8-iK7uq%U3%r{+2V9 zHx9!wz^SHiOwNYgoIrWM>mvbRmdoD(myY;4R=oL!H!j-7c!)9N5HT-7$u?X@aSU0{ zi1kY6hrm4*uN1QhCOp4!{dlODgM=>gY5)DybSUH=R;IqKQwI7NcMxZ^F^$B(3bZRM zu9>~I8~VYepwpvQ6H$cGN_AulpFiHEu{61{Tqu>0Ha@*NcB`X?^$GC_1BqFjBCrJh z3z&df8gCxZA7p47x(bLinyU@qBG$4X&_Lz;P%QF-R0!ZFU?(QqR`FoE!@d!q)5~E( zhkLf3;yfrE+0%-Z?EE0qUhY+??;_hM0&G?FLUHqdu{}Ey0E!St`k~_6nPxXIFUYO} zxljZxRj3OkH1+p-*Wma1&RnO{v$Zv+^UIP%Q#kmD%j$lhK*9%++vP_@xjG!rKHJD4**N82dp90wrEL4yEEWCV1oa()$RR?hUHHLRvniz`|47D(aI73V4Yp0YPTLmxHEqkjM0 zcT87Zd;R)rOBA=RkY!cEKwE8$EJRA)KlteRO!4x+b6w}fF7GA1so6N#nI+V(>zH>PlMVV5n&^tplyT$Atq% zkXXkNTqT~-qtA%wbfP;?y63lsg}j2alL8K=MxO-EcPcgQCe0%SLMtD#4pi|l7a{MK z5)|Vct!MN)&q65jbt_TpLqDA3Ot_C$ZVztepbFy18|nR7t}>#r%DTW5A$+jaRC@^I z!etXd@7MzLpp0mNw5j{L?c{e|;QJX-gyOxxQN&)Na6V;0k%Z2MY$AdqOQ}K`_U+4w z#wa>K|DW3~6R+EC+@W6+axUY5L3cQ&luAwmtl12-yK6fBo=Z(Eg>JTCx4+N6eK>|G zI~{S`TB&#GyZ=_xGuBXxxqwvQFe%oVZe}Ks+c+QJ{xy(B_zD^pT_gBqFR66UELIKyxIrZ8-u%KqqUWDTQ9%K?DRF17@0njlh50B z{2TVp1}Zrw>2H{VO_^|{h(xN6pF#0d+4g`OLxtppfgy*Y|`z4{o${MQWd`cMN1!Uf5El3;#j)pa-JFdTMb37c>CWoVz z%)ymEbTq3xEoB=Lo@m{|*2Iwrs+7)uH0?QYMyf<56J*QU+FJL z6yqOOGma&LbwFXRVrrsmyH~Gqx&Sx7rFJ@7IDA1BvH0_$`zqATwnfMsH`S&uK9P#N z#yjvFjirNy&ioz^7qwOjo+pBM5mrqZ5|RcEe}MG;ZK?&ep2qg0hx+WO`}d( zmzz9`r)ds~(lNQKYLNZ#0!X3U_n3U z4D^@#Uxx+0*^tn0qR$&{)jwobXTH(pAeqwj!S{>um`j&u;c3@%HqzRlIT_J&Q+(r4 z!>3*t%UU5(H~e4_ED){M!??eDPuHcuY(UdmW(JQe`H1#BuwmGb6p68&g#OXRt_w~e zvJApNwaQYNbr7h13Y36yqzFfrkpx+>c6XOY`$BuVDD^e8DqL5+1~BEdpC_RUXwCOJ zKGFn8XAwlebb|5&&F4@riE*W&GPTzZYR6mm&JBi>FmHADg; zH<;l+Jp3mUH)%Oh+xFC=bbcg-U2$cjQ`k6MT9MBpHUM$Gs++WnC4{ppO!z%{Gm}S- zxk|sz(u;*0MBaRAYNnB)WKF{;$1h>k5{0_LQ>mwVpP5GMl)!q;H`Pz8P>j2Y!5By+ zioqGkAzu#vQ-FZq-dDUx$S<>wr)6pLbJP$F)UFKxxYTFm$N|=I|KW^bR z%^MnfZ7Cr6wLp(L8@^1K)ch|T|16!9H$7lk$qLb=1>(Cr9<8Zo%q#*SZF3;mk z)B6!@1whr=*#0)qB}zCy?`SXAK!L0=RdN@8G3x1j51RXDxGM&Vb8#kT`}d9O2F9mP z1$PMgJ42i+@f3`JoVft!_Z zK494~N1?Iz%6spl_fhXrf2nUXpA_a)3*rn59~%fa^T(be2bFEKUx0-YgG-6hZfNQO<9t{A9C3hGriOg=vk-Z(7lL8z}7GO2;9?SQAw1 zH_t26I6Ib14OvAZ9ohniJXv4aQ6peqH8~3H<)T=#i$yx9@geQ}g2-Qa!YSwi1;#V* zR&qZUGo;5+pA|?`iE?IbD9(e|W6OG4d7M2QPGn|*EAt;q^aD&(8N{SVJU4K-3;03Q^gBF{2* zaRJ5wgga(sl~vifIz zF>CqLswpd}v#bJkh8Zv*;@_MZ(xMU!ivV{pg(P&$DAoyI&fcNrK zT7#G~*E|F9&8D*mj@6pW=G`^>#Q)|$x}GaVDhXFG7K;rVT8$TEXw;o}pKKxzsqYKu zWuYcuKLy>F}R{^jM-8ROhx}bHa4y)6558U?aK}{i>_?AR$9Z%%tNZ*pLid!96miM@M7Kcribv+)s$8RTWaIg1 zfIL4!_}E8KfX}ORq4Er;YWMwg2m(?wh4d~uvu$KZt)`Dd2{81} z3qJMmy94wraKdSGQz;Cs3Mm@Kx~P24=9j@c_jdQ?O)695bu8JvooF);#IcmWIl3Ku zTDd5}MOF^bL2TEHxi$3iS;o)eqzGF#`;Ec|NeBBs?HTDx-ShyCo;)9L$i4;`f)Q1{#t=!_Kk`ST{ zZHOY)S_rrHIM$!@GpmLi2#bi*97(@$)Ms`1fA)M@Ehk`k`_cdHVXJD7H+_CY0ovCb@vkjVY1@uk)d_rfT^TPC8r#CK~ewXsF=Vu#2d|d2=hbO{hHRTAmOek|Ex*1~XIx>?sli0@Z6HOt*BT{YL8(C`{4JlX}&KR_u zK)mu3i0HThpM3?JB-11LL%+#fRFe>LvE+9Kx!U+VtDXhVhAoQ$$SH{Z5s~Dhk6~GZ zz^KQ70Mnt`wkG6H>iK)H;w|dGyAAb@>0g=MTl)e3J01M%?cd|yS)sDrU#R~-|N9%E z_V)O98u(A#KNE_-amR0I;(yC4{t5i2LjDHk68=AW`DclLGVAXW6+~~T=zsA{Sq>KN RuP?A~^ZgqSNl5pK7d literal 0 HcmV?d00001 diff --git a/autres/liste modules python.xlsx b/autres/liste modules python.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..586d830c15ebd0b577071fb2b08276aefacb282f GIT binary patch literal 15621 zcmeHu^J8A!vT$tMPGhHGW1~qL+qP}nMw2wQ?Z#GP+i2{3Pv4&Nz323t`xo51f7pBW z+B36e&7N7Dk&^-iLj!^Uf&u~pA_hXiT3<5+1_HtY2LeI`f&$SHvaxnFvUb!_bh9;b z(4u#>vLyNj211zw1OmYSzw3Xo2Ko{wt-mwE4O}GLAt+TU;BGR0Mh)tH!(-2{fgHjS zBAp=%hYx7V#??(PLS0%%%{R(TlzFlz0%1?%}gT+Te~oa`UE&ABzhhwW8fD@bN+6 z+1D(CdWs@(IqV1aHYeQPeC7`0C33M3oGq)inPcNdqy>wE^JKSJD0p|?rLuKi%FSZI zaSUmacCfkuxZnFbD3IL0IcI|sBk2vm;-mq-2Mcgc9eX272L}3I_y2Rs|HYp8FHJ9x z|18_f2p4=I{t_~DKerZ(Bq-$~Al^o-=oEJOTxco3zoTA~@yA&IywGgMG57UHMiYvh&>S++CWOq#LDkM+|jYb8)WJ z@CK>q>`&nuq)B=e9B9-6ykHETG(Yu$&uZ)X50$`kf(mC9!PQOdImZc;89ocig-7sw zp`6mEGim5U4*Dibm7YVE#J7()N(!c&X4U#%?YT(YbPO%KuZ1(ZP+vXiWHN{3Nmx-H zm?y;s$#ZUf)azM)j%K;_u|xNk4P6fVM-UdT1IDTUbP~yuLcJ$|M#MmYfN+4IfL$#a ze*1}wjlG4wjg7^xG3=i{0}L3*09^ieU+wYZ=6#HCffqrY0n;6J@o#b?TpmTA@K}v_bEHxR1_c~&3}^x>5nDyn z_8+q%yFTWmn}uh6L2}v0>GOsgezdXLVAYC>>GZ~(`iTuY90r?^6HQm^Z}y^%p#}o( z_BB^CVXJo#R85%I4o`)wNU8-);e};PpSj86d+Z$YIP9PzFINGJ1_QZ69W`8x*YQ&g z4eL1HoxSq=G3?M7UbGa*uh#{O{m#bOkAGPjB zsm%m`(Tv)ATwB4v!5`qWXmtZj-Jb|mz!6}1I@tLLP-Lir>srSjPbP1CPpcWA-(y&GVP8v`B1 zx)`MX6pbEs)z?wA_S)5*Gg6FKP>5ljeAmUpU1DxYyeUx-gy&AL6$cQfZd5&6 z^K|b^u>D)QeqH=D^|Y`{rEPkx_3la{jn5sRKdqJ8pfBdt8_#K^Y7O4sAr)%JD4hh3 zqbJTEU6#5fgYte_*Vk@7Qa^%ZyhriyQ{`+vzU6E8XhXh#LJkKB4?7s!@#TU_2x7^g zl@FP~;3(vk`NZl5fj)xBGVHE(K5D^8nlZ&EtyOo%5%6U(;>GBdqW+zu@Vx^2;A@n; zL);p4=aF`#Zt(nFh^c)`n5Co_m_5ND(@#$<>)<6qk_96}4`7mzMHBjSshr57J}|Yy zeo&oSbm2&dNu;P#iuA%1;Ldy*B*-w90x~=Om=7{I&rBo^b&`xojygVihLrwwmvycWy~ zAv&WGL7+Nvim+_w^apa0rMk)Re~`0?cZKEBB8x~(-%h_5dGJ|H?=68E#EjEZV=hPu zH?nZ`TDu}K#$U9Jy#U!*Ff_pFGX+7D2v-Q%#J1mFq(JyQ1D&;P*qL(#t47-8dXRY9%TINDVI@6~^TN`ox zA=0~%+ID_t)}MsKhg~1*PlsZb_=GJ7tUd9!zwMbYf~H# z3}sB+L_u~Jh((~GcOsU#uO;)LnJfo8JUL`7Dl$b1tdl^Q{EBUQw$+X(+v#@$^TEpZXy*;NgUOMwfA|pS2zCERJp<;$^J+{U zjVyQ>KGH|ey4$i@_?OBChaB&(%9+;n-@d0X`)0yX78weDdOCVn*3otOC|^OF-&Vy8 zcR$3wWhzJv>ClbKM&J|4rrU*$;dD#ROB8LY6U$p5rhNhDbGM+>y^BXQ)w=iH?iTX9 zubR^VMxZwEL6!DKrUJ&HaKHI7%)R4N>Q>!rm{NPvPpV_s4YLIy!v{+~*Me^)lRaGb zx_a%pA{ATMZ*EO5j5=%Rc8stob-MQB@w#7WRRow@v?`VRKSlPg=;T3e!Y_3BR9&Ib z&wqz;B^%3K6bg$m(FqpI@bl)&ZZ{03B32O%6V*Y4V)-r)#z`$O;REq#^Iz?`pcR@z6%q(& zkm%Ry`mYhj(bUMwh~ck0(=V$&Rnv&TWk>U7xZ#7lK7U}_8AYLZNVlqOgI1#;k5SjS zqb$S5mROI1_KW{?TOcPcr32$-k(&sCV|pk>_@n>=ZS_Rzo{#O3-;jAym~XUD?Yet` zho9web2K*n7~!ISjIT!zC8h5Ds5yLZ%dBq@FRk$wwUsk<$wT~wSu~Nnd5@v`l0p07 zA@AB$N|a-OV2DB=w&6v5WJ$S(Qj{^WkCUwz`h`vJlPC(oV?D?IA=b@6y((3bc|TTM z-#rRiz_Q-WAY#txv7w;oVpsK#^&&j-J0v92tM zjKIAGl4f$H-+gYOZ`kp_)Ca{8SDb=K^)1KN4x*CE7}xIUKvZ-ByWQ;$&pyXwufN|O z1whJPyl0MAD5=@6P^P8ZGjzURUD)tlzdh}>VIp=(7V(B*et3J7&E|VQyH6JPTMkYxH3+HbVa?%mS zu(k0khF$1sgtf8P#m2mxd1*8{@$Nf_=P>R>>Bq25VOrK(J@Tb7r|<3Ubz^ptojCY# z&Lt>T+0sT?1G1Vu>8l+kWyJnHIc@w2SQ$@(*0#zRG^h#aqk0hVKOd5Zi{e@)E-j* z561_D__)!bS8&3#=FV88BdWr&lb9ML`m{26!s6><9ET&V*D{W0OY zMLl-GpJQe$5+tb4VH|;IBI_SNXkBUGBnaO`8I!@tq z>AONPzVp_cg8ojQY<9hRf5&7_8+ylvp#%U|jLH-VG~Cy3&F74V8}>cUNk34$7mMbIg@ZRrm6v zyL+&TY;GxH_nzBPblK3kjym*|>&UGqq?=L3pL_+@qGx!9m0)c#dKSui47UpL%&=ov z9;xD{y#tM>aHvm=4-^eci@s+t0ppYMlzWss1X{1Tqz|@PW;%0?8qLi~Yf;9I4N7g9 zi!2F59rEu9oc$xXTIQt3|DLknw@dWlOekd4`)f-E|^OavL#w-nuJcjWU_NKdz}h zGx+EBon)P|VA~32!MbEVzi1}UD3e%j!44;4t{{(;xZR^*A6(-!J7N!U;ga5uNBNdW zs9`N)6028pS1L>VsN=-TjrQPBTLB*{q3f@5u^|PT0wO6;KgAm_Mj`JV-5_J}?!g>X zslS}{NXCy7uRc#dEOO^Kc;gF%2i?}%Z>B;ub5Ito+BL*ucqb`rYn;_p1=4(a?rXTe?s&ntEi7gW^I8332ydkn07X?|Ae)igB!QuGk3p# z_oc8^z=pC(;4G?*$5p`UaJdp>Uv1@&u&Rr(aSbbHTil^M$omin>L3L2RW%1N5gm8X zv>6D?IBw=Lx}dWh4d}KYdD2r%e{(r%*6+>@QwY80EriKZ9Wr|ac(lyn zqk8T-e7-brtwYvlw-3wXUhVA#ob38`aYrN?P-Pfw8@m8-pNZ}Ed=d9&U*kKy%n>3)z$&I}8 z)QTaKB)N;5a9?x07-$T1_o%!KJAv-a+vr~a3%dWDSSpCP`p^LO*nn^WTiw40;$KTW z2U8;>M+b(#9)FF-nQ9s~R~$%QI%e-ei7w)ngJ?*XCG{F-_ti7zRg-4=MCK@U67I9+ z@6Qu~DBMAQ&GJ;3gcFfxoD>t)4|mGD>k*~L(kW8eQ9>IEM&D-3SLt8*-d(XidsSI) zGeOuU`h_&DxO0OnMyAfg#_tDVGHJFSGwe%ZJT zaoZ_xx9nXq1WFK`kP})r!^b#QMvUiPH;m#`m2e=KH13x#@3zYSc1ypqAl68NEvV8r zH+$`!c&Lwv7Nhp{;{{#G1^V#IbK?)Cm(f87&2psCShQ!p<=4N749kL8Z!)DF77fz{^x2~%# zO*@P1V@TG0Z{meH+LrM$305d?`FQ&wfh%Nu5eWl6X$^kKu$c?dBoDBYzPnC?! z`Ej&|IKg@T-VU`2Bgy+V2Z&g)Bj(G5Wi-02H3<@KZj*1&uDR+#N|GuVL$xFHC*P7h z(C{8d-?PJS*N$?c0Y^Y9)5F(}aiI9RpPk!xEL8NZ5Q7g4^oHTJRJ+qv`$hzl;P*i- z2iZBZ*P{SPRTZ?_ticl))%a`UkEg~6j=mq4YGiSZ5M?F@1(gs}fPC9bS^TFY6dH@M zzDSLUC_|mg8yX9^a~aW(2v+N{svoknhDI!bY_m{HV8Z7PW{^Q6=c*uXSZIhw+EN80`YlW92TCw$NU303F)<0Aj3v)1iE1!MPEj;{bcjOk8CVZ>+HEwgWM2Lj_7CVz zScn6>NyH&(8soF@Dco-eo^%Xy5?L!q$Ef~eFZA_RqcMOaJ*@cHZW^u$P*Su>pDs{c zB4%Et#oB8%Zu^}mD8d+Nb#Dlo9rf22z5EFc`gG(*V~$+GEyut*0LeI13M{<;xHf7! zGW`NJScVfBwPv%X36dpNm^&IhBpVp6sQEm-37ejUD3T1ZX0#O)+X0&(OWf!ZTu*S^ z5R*M;CULU?THw7feF)2M=hc6n2W#cdl z-0q_E=0ep=ehIh7Q7H7-EvCplnA^9aB`eC91)@9!U&pH0B{?j2zZrn(r0U4-^||Xm z>pyhVR$L{32vhF>_qj`ABJwlxbgdVY%`3EWfcZ1@)rpbY-Nwnn zaFUdlTiHetiJR5V4hal5<^ivYor}0~3KbJl;4;Xy!$a*GNe<%q)a%JdWxk8Y+-t8x z;DuImZ<}pVHGCH&;pgXx7rLsMs<%>GR7JH~sod$Y8X82sbH_AeE0edy)vhd0$L$!2 za*Su!GVic5E9H6ZO15g#Ev%6?F4pChg{bwWZ2dM(_9+s+&Xpd9&oHe&wyToo66?i0o~_+cCg;~Y%WG{KtP{4fPm0`cd!nodiF+!3Xb+>)+T=~;LCBf9Cn(| zI#^y2aqcU2K6tcb$avHZf1U_)afo6sIa@msGGVQkUOAQgmYk1r;Ozx0{{vFOt>Cot zl#2`qgb2u==;kiPAX!vaQGDQfbQsaZ<^%FLYNyfToBfp?&-)7Bhd4#Djrhca8~ZE4 zz1@^DzW1YwL~4*#O>G$jNp!yK?9p9*7LrL<0f*EjyEtTUpYYcfS}<}Aw;V;IqsRUX zb|1b;s8Nb9-$ymIWW1k_LL?OTPo*SGjCZ%QF%!y~;L}SsFAMB`&uwe+W*n*r#o@P%vr{%<_kmTM9`Z(EzDxOaj zy4r>CN3q7O7kk==Gzx#|XFiTrvA0fBEYL6cB-MQB>umIuazeo-mq#g_fJgM6YNHtz zUsq$ov@%uyM_zC9V9Ga==G}L)Nv+L93bNZ~nMZHJMb>J30W?f{TZJ6A7LI9zqW|n09|l9-8uU_z(B~R?lCiRi8|H)+QR^z6DJlF`;`I5^HB# zxj84-WcIxC>>^8|$d>Y{%C%L5Zg~`5R3Mcj(Bnm$OFzRiqfL_=Fpg8IC;t3o(aJCtOH(m#u835lG5GK>O6G2Lw+K zr~J)i0jB7|SF*8e0;$f$6`&>vh7iLhQ*|UICOrF&Ho&UxEJN669jLp((2Gv=+J)0_ zTgfq-$+M;tS7%p0)$zSe9%C@?Y*L@Pqu~v&(oRbIJa?;zzwUW`k%_u)Z0_l+ z)0~cjPlpumhcVjfl`uQp>jtI$>qk~|g)GtYbBSaoDEghd+_(|@sZb_!Az5U>4U4qX zlSBW@DxrG!qvH#wdiPJF2?T<6IY{n#E5S+Fb)_MqShgw2YlYLe--dnB5fV}S8Pre9 zunA~3v33XrJg886V94=r*##JoItKdjqz!~+7Z()RjzfTnZ+$Nw##gF7DLV zig4v`zbJ^f4Ar@}Gw`pQL&ghnEQ*sF&`7n!16 zC`^hhNkj-cs)o;M7; zKI;TEC!@uWF4%{AsCkn-#Dz3yl|L`yC7rT9fQr;?BBe&jdM`%C zTZ`Ps_y-K{EI(Mlr!3jpUbnB z#Nz4sg{Gy6T<@iIa;tZQ(OC}L@zOrjG6NOYnz-#I2{{8zaivYsv%m8a1cXM!FEI&#ERNbkPd& z7gFV7k)-$0#}V9pBo#Ne-01c3ijn=^Kx@2}gsH0IpRx8Hb+Xc3MV1;X1YOlGhVt&@HGK2H3k3!5j;##=Z z-0_%!!D2vI6B@$q;xQO+sStbh;M7=+)M?z2&l-X%s;jVv0HH=(4GYf>4P`;-l;fmZ zVohdRZOBm_*~}syD084NmmxL5KJ&zyF+k zTe6C=Z9>vk2^T7N#WM$=+Ve#S95;93>e}y;c<->*VXi35saYJJZJ@`5;UXotJ;U=} z?03x>YUmTK9$l{L6$L`j0pdg>Hhg8cE5e>1VP!n z+pqigLfBrut6q0+#z8I4k}<*cR9jd$v&EfU%fL~25e}`b-%mM~fA~{A7j=%T@Tu>( z9yRpJLAO_TT?`uw>GV91YJ;Rq1tDq&;?{K&Q(vO%c^hXD~Iaja>0co#pd|-1bRRJjJz#vdho>x zLS(^XXcSMAS1N=VBsk2Su>PSw93&QDxsbQ@B_{9U79>;>jdfEjwY$%_WzB5((9^>H-R~7nyabqP=OcvXw&4tQ`eF~@m zVagc=rxBwKVN*JFo!;~Ol=L%YZHv5PYkZ^kh}$q1n=0TV#11L0t9+!Qa26=77)km! z;3e`JULQ-diF}V#-|tInU1>^6jLDAK0+MKVE(+@Pj7~(%y_cC+R;fdz^YlNl2V!tN z7c`&+Su;O*CAZ1l*_=Ya?Z?P>H6EtB$l+JGwbi;&Kr^WWLwX1~;aP(^4ufCsydk*o zC>)?O(46+WJcc;CGbY-W>Wr(wu)nzTYJfrcKF57+;v&*Bri-J7hvsSq9*ADZNzO2n zf^*j_h3q0yq1DWqc3cz@3asc%?6V=M+N>oDvBCRpL#`F8J~teK1OaqG^p<>CBf>Fj z4yvk-Rr3+zhGl*lcfAc1q$n}bE4-Ie3dI9fratNzkrv0)iyTL^8RX*{>=wE&ho_4_ z;+a=h8Rq49S`E~y%jKA)-^QS2{F*Z zxy1Ds4MktAz@_`=q$`)CnQz+g|7 z)O$8-x!_@@k@s&-(R0(A>PuNXDVuq=g=p?qAfbE{oX2h3(7YvPg9S-v%pl&nUoRqf zLLn~(I!HDRt>l6EH6O6GX%aS9m@u5UkdhU%7=BnG^$Z@o1&B?mnk&sl7pXiD5z%5v zvnn?$oB(a2w(}dKl)pO2Qi$VrqdYr?h{xcV;jDS954yzsJidE#ZtV1UK$=|F@o{zW z09{*We5%&$?e1MW#R#Wy?(SA58eQq{En0Ey^i)+9SHXK|g-CyRhQYnHtZ;5+qGO`Z zQpK;1JVsF2fV&y%)L}UHU=&n%a#~u6H4nQa3qc%wK@_7-yv%=79 z|IcL!exvNfIN1@TZ5_~o0O3|vAh_jDn*kJqn-m^2y^YZz#QFQY(cAkf~ zHp5EH+SO>|8hnVr-B}^_>B)u8g3YU0{n=IeR^#~FbxKo)QIl7l(5DLaldVCHL(fL7 z_1CA`le_WRfxFkNT4T=V&Zc*)XB+ogY##y+tA$ao1((U*3Vb&^*Kxh)+i%*equ1hk z?<(*@OZpq$TG!B-!OVR3@sxZqMuj~y*?8p~hyx)OKKDi)?y2wh2~31__iEk->qd?V z#%k`@=d*1$`$AfVMoO3>M)B|Cgcm9n9>FbTOPyZcsa<((_lo4#{X4H50p2=I8}0`u zOH-d-=dG9brqnUhCtdw{oz_g~U*_H@YYgrTfMb?uLv9!DgxZ!ar<_;S-m~*2dkpQI z-P*G|c{#mtif;Mt>WT_&_#89%=F7I`mY406&m69eSYGO$@0y%nuecVoF&e$T^0|}| z60UfgQB-hXkEWvKE((rH$8gZ{kZEb`WW*uo386dsELP@ z0Fv{imB(zSYUSOB`^{aZNzqV3@69o>f2$$V%f~W!|EKqcSH_Z>8P9W5@B+u$&-&&c z;b(qQ8%yfX)E*w?UA*bk9Xg&3AvSJ`8+qwjb3smAD{2vCXO?G6m6vP$Xk({i?aO2H zGR7?nIHCP}6U;$r6ls@Zu^#Ypv)nMTeySFl!Wa z$lnf)2xs1eD*g^a1TWsqF+*593)1t(N=uxAspnIv4s8+5%CWUA?o&zqWELvOAGP_? zV*Zf{D5eO4+A}KZ=Abmm7k$PyD1y|x@>mnRh7Vqyas)$;#?LT67Zy|O$ze{?H*NYd zD8h(OPJ|C$M>>%qM;U}K$~+Hc4;Insyc6ZYjMZ~%d*~-vC)5ioPN%J1AL0YaWr9ob zg3Ze}&#l~vszQw4H~=BkVL!3_g)^yS;b$V+i%B2-&|=Orjdy>B)0s-C!(UNQ(H6{5 zGMd7**d9P#ey<2X`D&cgQfTTpo#Yr^cQs85i1qTbvUU+g^ZzF3JixShU2It z8Hk>04%ORlA|zQT!qz$Mbus)sUHoI@mj0k!`kk0qVo;fNX)YY*Al{ec`JiBy5-Ai( ze}XR>7q|sk#In7NITIzERK}PiUU2Ch~Sm14%7mt{1!P3Bh z3~{z??Z%J|QJ`W=c>M*6!Fc?ozbkRfGKNGL06-82W_X8Yj(sR*Xq9d0UOf6}PC((_ zKMN(Y*UVBAh!y?QK$)SzhCYq~eoqW#!cAOmFsEB4CuKr+rsglATc}#()C7yv-hL*r z*r?eCUOdhd*F)f8eH0$yrwMmg@LpH`wxsoKYlAO6MBs5mqq}>rFCb@|5hF?*KfSq!(u%dY!if$_#Lc= zmZwJVOwLd9j#DCH@D8OM4ssayAID0z0TMX=U@Qt}fi#-_(wj*=ftSd#6|QLps6OsC z)c%8J9L?_rjUiVKCH*Cz@II8vuH^5!GGYG>RIi)d+72ZhX|WZl{D)ls1Bf;=!&nr} z0=cKDD^u}HsqSE$n5hc?_c{LXER}eYX|ut_ z{972+q09*8EZ`H*op+^$`olf3mli)TInGn$+$=~G86kxq z1&l`D^pNbF>H(mz(YGD|_yf(6YD79LSl9pns_yP)bu5+n#dY+aIIBNpFFv-~))Wf& z=G8o{me|R=7A>8i42zd=&h$qUt4SMG%kXHa7mb`UAr-+T!^N;=UCWPgmxY2s8}0-G z#e^)(7C4RcY@aBsAqf@EbbXQdN?)O%g@#=_lp^gXu8)^SIuI`7$AQTOt~EyHFrlg! z-Up4yaH!9ymLeT&dR5R1D~vKboJpnZ7%mLM4XzbQdBQw`B;Wai>NGBYm9fNs#Nf96 z0e=jCfyyvR0_GY;EV7EP9Z9^9nxp+!RZ50wL`j~*Xm@h*W66pwdo}J{?J~)Cj;>og z>4{$CO0I6@&h%DqI{a>}t0m#$Nb(;jlst~nLdgnrCD08B%CdS-AoaYoo@R-alGBLB zqy?Vl7Ya^FsHdc3O$)g+nfde8HJM9!P{2~obU2=U-Vcvv+Sp`hbPyqj*fNMpB)`(1 zK`1>M`$N@1`)792Ta76aoA@WzN%%*l6-l8=BsqSl{JLq|gXUyrP$`$^?^^ZD5huM>m|1=xUNQHehRgi;JT4Ngj!fy?tvout)q{+boGxs3EZpfB*@*oL{aR6TCFv9VIsriy3 zF>_xOh~g7_$&?t~%fCuz74O->!VH^{f|G{rOoThZ^tI@Qx7LFz_2)r@Obvwb5pdr+ z9+6Cx?4NK4!QGH6+&hqw?x9Pd#}kwlIUEb4$Yz1WEo$tvGpICyME!uh2x;g_B0VwJ?t{$edd1`u0>SjpAB+*vvx4D6>FX^@b3QZ_*u z{;V#EK=-oYjIg{&F*Ng!53s))t{cGd=*i>{AFJw#QZdG~G zxSH-{Loh?h)-FzI?C4X!(eq9V-*Tb^7Ja_tpu2KBVj?Yd{3y`AjMf7g|CbE` zTlfdwk}D9&6KnM;VO#jeHcBq3i}iN`j+e}tC>{)AyhqM6I-W~enNY$ zgH2o`<1!9lhJcqfA1KWX=FAR$vI80B_1A;c`t3{*yUdkIF%p5pWsW8;9tHF`A{DC< zfX09HXEc^>-acp!gmp}OUNR^`>R{`6o$YnNMVw?lZF{|3nS!f$=8$-Pv+#63TDu?j zzO9=aqs4r_y>c?jPBnc%PMALsYSO5949hoRcn+1=ruaxd!Lal5t-{Uhef?BtzRkPQ zEZZu3xFU=GxmSpEuqx!->ZPQ^pU)}4>v-p=P34(rZl2eMsik2h^`H`0W}|xWak@O_ z9S~{tpG$!C+xS!=K+LxVAg&M@5Fc)6V<2a5W9z_RU}JCeYwiz7rTD+FaKMpGWc(M| zULv%hjn6NL@E3GbMiInTDaA_(Qqq~z52Bmaq!^OEOJ^HWD{5ueJz^XO-kAjO&8uzih$$Xw*)`zFfvhJcsZcV z!xs(9d`j1UkTvgN1-IMm{eZtpI#WF;Au4OauE>%K!p@Pf11HLA#rUi|2KidyrPbT@ zxU6u*u?@wyR1oF^-sMzt={_W8zy};WMDVYaYZw;iyJ)uVo;i>jVS=j;{}8yApNW5>Dk);pWy*i_KzzwK?@MrixzwV`HCobAC+03h-{b? z*Lb6EAOHG@|za);zN&P#6e@|!oC*iMW z7QjRPCAsZS!hcWk`B%d4fI#v8IpOC|K7S^B{LSeFkOJ~Y`p2Kdf5xW&O&kq4_XZIE z9jX2&>7QZ1f0JqhcC7%Ue+C8r$>7iMrN0>*VEli<|09^`PcDC+(f`dw9Pf7v{yee& zlf$3eX@7Irp!~0L{I$9ECzpR8k^kla1hmZx1oR){^PlAZ-mU&CxhDI+kpH8Tm6HMo U*vPN^Nm!r(z!ZRr>(|@=1Jy`io&W#< literal 0 HcmV?d00001 diff --git a/autres/messages.pot b/autres/messages.pot new file mode 100644 index 0000000..8a74d1c --- /dev/null +++ b/autres/messages.pot @@ -0,0 +1,1560 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-04 10:46+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: layout.py:510 +msgid "3D graph" +msgstr "" + +#: iramuteq.py:409 iramuteq.py:485 +msgid "About..." +msgstr "" + +#: dialog.py:1693 dialog.py:1694 +msgid "Absent form" +msgstr "" + +#: layout.py:772 textstat.py:50 +msgid "Abstract" +msgstr "" + +#: layout.py:775 +msgid "Actives forms" +msgstr "" + +#: dialog.py:1337 +msgid "Actives variables (almost 3)" +msgstr "" + +#: dialog.py:1902 +msgid "Add cluster size" +msgstr "" + +#: ProfList.py:689 +msgid "All segments" +msgstr "" + +#: layout.py:339 tree.py:424 tree.py:639 +msgid "Antiprofiles" +msgstr "" + +#: ProfList.py:327 +msgid "Antonym" +msgstr "" + +#: layout.py:133 +msgid "Are you sure ?" +msgstr "" + +#: Liste.py:163 Liste.py:180 listlex.py:197 listlex.py:232 ProfList.py:308 +#: ProfList.py:743 +msgid "Associated forms" +msgstr "" + +#: dialog.py:953 dialog.py:1030 +msgid "Attention" +msgstr "" + +#: dialog.py:575 +msgid "Avoid overlay" +msgstr "" + +#: dialog.py:2114 +msgid "Background color" +msgstr "" + +#: layout.py:728 +msgid "Banal forms" +msgstr "" + +#: dialog.py:1248 +msgid "Be carefull : computation of repeated segments profiles can be very long on large corpus" +msgstr "" + +#: dialog.py:2646 +msgid "Build sub corpus" +msgstr "" + +#: layout.py:490 layout.py:517 layout.py:742 +msgid "CA" +msgstr "" + +#: layout.py:741 +msgid "CA POS" +msgstr "" + +#: layout.py:738 +msgid "CA forms" +msgstr "" + +#: iramuteq.py:697 +msgid "Can't find R executable" +msgstr "" + +#: dialog.py:2383 +msgid "Change ..." +msgstr "" + +#: dialog.py:1216 +msgid "Characteristic text segments" +msgstr "" + +#: dialog.py:83 dialog.py:2320 dialog.py:2714 layout.py:1034 +msgid "Characters set" +msgstr "" + +#: dialog.py:394 +msgid "Check" +msgstr "" + +#: dialog.py:355 +msgid "" +"Check for new \n" +"releases at startup" +msgstr "" + +#: dialog.py:384 +msgid "" +"Check installation \n" +"of R packages" +msgstr "" + +#: dialog.py:1482 iramuteq.py:324 +msgid "Chi2" +msgstr "" + +#: ProfList.py:309 ProfList.py:354 +msgid "Chi2 by cluster" +msgstr "" + +#: ProfList.py:310 +msgid "Chi2 by cluster on dendrogram" +msgstr "" + +#: ProfList.py:311 ProfList.py:355 +msgid "Chi2 modalities of variable" +msgstr "" + +#: dialog.py:1729 +msgid "Choice" +msgstr "" + +#: guifunct.py:28 +msgid "Choose a file" +msgstr "" + +#: dialog.py:2530 +msgid "Choose a folder" +msgstr "" + +#: dialog.py:2501 +msgid "Cleaning" +msgstr "" + +#: ProfList.py:756 +msgid "Close" +msgstr "" + +#: layout.py:385 layout.py:482 +msgid "Cluster" +msgstr "" + +#: dialog.py:1309 iramuteq.py:325 iramuteq.py:373 layout.py:526 +#: OptionAlceste.py:29 +msgid "Clustering" +msgstr "" + +#: tree.py:434 tree.py:621 tree.py:630 +msgid "Clusters statistics" +msgstr "" + +#: dialog.py:1885 +msgid "Color or black and white" +msgstr "" + +#: tree.py:432 tree.py:594 +msgid "Colored corpus" +msgstr "" + +#: dialog.py:64 dialog.py:65 dialog.py:69 +msgid "Column separator" +msgstr "" + +#: guifunct.py:362 +msgid "Communities" +msgstr "" + +#: guifunct.py:1151 +msgid "Compute" +msgstr "" + +#: tree.py:430 tree.py:459 +msgid "Compute Tgen" +msgstr "" + +#: Liste.py:164 Liste.py:191 listlex.py:198 listlex.py:293 ProfList.py:321 +#: ProfList.py:677 ProfList.py:683 ProfList.py:689 +msgid "Concordance" +msgstr "" + +#: guifunct.py:1116 +msgid "Content" +msgstr "" + +#: parse_factiva_xml.py:203 +msgid "Corpus created :" +msgstr "" + +#: dialog.py:2313 +msgid "Corpus' name" +msgstr "" + +#: dialog.py:2348 +msgid "Default" +msgstr "" + +#: dialog.py:441 +msgid "Default R mirror" +msgstr "" + +#: OptionAlceste.py:52 +msgid "Default values" +msgstr "" + +#: ProfList.py:324 +msgid "Definition" +msgstr "" + +#: guifunct.py:1139 +msgid "Delete" +msgstr "" + +#: dialog.py:2447 +msgid "Delete characters not in this list" +msgstr "" + +#: tree.py:471 +msgid "Delete from history" +msgstr "" + +#: dialog.py:1811 +msgid "Dendrogram" +msgstr "" + +#: dialog.py:1855 +msgid "Dendrogram type" +msgstr "" + +#: layout.py:1016 +msgid "Description of corpus" +msgstr "" + +#: dialog.py:1069 dialog.py:2338 +msgid "Dictionary" +msgstr "" + +#: parse_factiva_xml.py:203 +msgid "Do you want to open it in IRaMuTeQ ?" +msgstr "" + +#: tree.py:608 +msgid "Done" +msgstr "" + +#: guifunct.py:1259 +msgid "Done !" +msgstr "" + +#: guifunct.py:334 +msgid "Edge curved" +msgstr "" + +#: guifunct.py:635 +msgid "Edges color" +msgstr "" + +#: guifunct.py:287 +msgid "Edges threshold" +msgstr "" + +#: guifunct.py:535 +msgid "Edges width proportional to score" +msgstr "" + +#: guifunct.py:1148 +msgid "Edit" +msgstr "" + +#: iramuteq.py:419 +msgid "Edition" +msgstr "" + +#: ProfList.py:325 +msgid "Etymology" +msgstr "" + +#: iramuteq.py:303 +msgid "Exit" +msgstr "" + +#: tree.py:436 +msgid "Export clusters" +msgstr "" + +#: tree.py:431 +msgid "Export corpus" +msgstr "" + +#: tree.py:452 +msgid "Export dictionary" +msgstr "" + +#: dialog.py:3022 +msgid "Export finished. Open in a web browser :" +msgstr "" + +#: dialog.py:925 +msgid "Export for ..." +msgstr "" + +#: ProfList.py:337 +msgid "Export for Tropes" +msgstr "" + +#: tree.py:453 +msgid "Export lemma dictionary" +msgstr "" + +#: guifunct.py:1259 +msgid "Export metadata" +msgstr "" + +#: iramuteq.py:380 +msgid "Export metadata table" +msgstr "" + +#: ProfList.py:336 +msgid "Export..." +msgstr "" + +#: ProfList.py:338 +msgid "Exporter for Owledge" +msgstr "" + +#: iramuteq.py:288 +msgid "Extract mods" +msgstr "" + +#: iramuteq.py:289 +msgid "Extract thematics" +msgstr "" + +#: dialog.py:2745 +msgid "Extraction type" +msgstr "" + +#: iramuteq.py:455 +msgid "Factiva from copy/paste" +msgstr "" + +#: iramuteq.py:454 +msgid "Factiva from mail" +msgstr "" + +#: iramuteq.py:453 +msgid "Factiva from xml" +msgstr "" + +#: layout.py:499 +msgid "Factor" +msgstr "" + +#: dialog.py:591 +msgid "Factor x : " +msgstr "" + +#: dialog.py:593 +msgid "Factor y : " +msgstr "" + +#: dialog.py:595 +msgid "Factor z : " +msgstr "" + +#: iramuteq.py:418 +msgid "File" +msgstr "" + +#: layout.py:1222 layout.py:1465 +msgid "File exported" +msgstr "" + +#: guifunct.py:52 guifunct.py:64 guifunct.py:75 +msgid "File format" +msgstr "" + +#: dialog.py:54 dialog.py:55 dialog.py:59 +msgid "First column is an id" +msgstr "" + +#: dialog.py:44 dialog.py:45 dialog.py:49 +msgid "First line is header" +msgstr "" + +#: Liste.py:56 +msgid "Form" +msgstr "" + +#: guifunct.py:1022 layout.py:726 +msgid "Forms" +msgstr "" + +#: layout.py:730 +msgid "Forms frequencies" +msgstr "" + +#: layout.py:732 +msgid "Forms relative frequencies" +msgstr "" + +#: Liste.py:57 +msgid "Freq." +msgstr "" + +#: iramuteq.py:322 +msgid "Frequencies" +msgstr "" + +#: layout.py:1249 +msgid "Frequency" +msgstr "" + +#: dialog.py:2433 +msgid "General" +msgstr "" + +#: layout.py:1130 layout.py:1299 +msgid "Graph analysis" +msgstr "" + +#: ProfList.py:332 ProfList.py:357 +msgid "Graph of cluster" +msgstr "" + +#: guifunct.py:400 +msgid "Graph settings" +msgstr "" + +#: dialog.py:3330 listlex.py:199 listlex.py:344 +msgid "Graphic" +msgstr "" + +#: dialog.py:545 guifunct.py:251 +msgid "Graphic type" +msgstr "" + +#: guifunct.py:708 +msgid "Graphical settings" +msgstr "" + +#: guifunct.py:574 +msgid "Gray scale on text proportional to frequency (0=black, 1=white)" +msgstr "" + +#: layout.py:777 +msgid "Hapax" +msgstr "" + +#: iramuteq.py:423 +msgid "Help" +msgstr "" + +#: iramuteq.py:505 +msgid "Historic" +msgstr "" + +#: iramuteq.py:312 iramuteq.py:459 +msgid "Home page" +msgstr "" + +#: iramuteq.py:699 +msgid "IRaMuTeQ does not work without R." +msgstr "" + +#: iramuteq.py:698 +msgid "If R is installed, report its path in Preferences." +msgstr "" + +#: iramuteq.py:697 +msgid "If R is not installed, get it from http://www.r-project.org." +msgstr "" + +#: dialog.py:1870 dialog.py:3161 +msgid "Image format" +msgstr "" + +#: iramuteq.py:270 iramuteq.py:451 +msgid "Import from DMI-TCAT (exp.)" +msgstr "" + +#: iramuteq.py:266 iramuteq.py:449 +msgid "Import from Europress" +msgstr "" + +#: iramuteq.py:262 iramuteq.py:447 +msgid "Import from TXM" +msgstr "" + +#: iramuteq.py:284 +msgid "Import from factiva" +msgstr "" + +#: ProfList.py:320 +msgid "In all segments" +msgstr "" + +#: ProfList.py:318 +msgid "In segments of this cluster" +msgstr "" + +#: ProfList.py:319 +msgid "In segments of this clustering" +msgstr "" + +#: dialog.py:2839 +msgid "Include empty cells (NA)" +msgstr "" + +#: parse_factiva_xml.py:204 +msgid "Information" +msgstr "" + +#: tree.py:402 +msgid "Informations" +msgstr "" + +#: iramuteq.py:717 +msgid "Installation" +msgstr "" + +#: iramuteq.py:717 +msgid "Installation OK" +msgstr "" + +#: dialog.py:370 +msgid "Interface language" +msgstr "" + +#: dialog.py:2483 +msgid "Keep punctuation" +msgstr "" + +#: dialog.py:1062 +msgid "Keys properties" +msgstr "" + +#: dialog.py:2329 layout.py:1033 +msgid "Language" +msgstr "" + +#: guifunct.py:236 +msgid "Layout" +msgstr "" + +#: dialog.py:920 dialog.py:1256 +msgid "Lemmatised corpus" +msgstr "" + +#: dialog.py:1053 +msgid "Lemmatization" +msgstr "" + +#: iramuteq.py:1288 +msgid "License GNU GPL" +msgstr "" + +#: dialog.py:973 +msgid "Like ALCESTE" +msgstr "" + +#: dialog.py:973 +msgid "Like Lexico" +msgstr "" + +#: dialog.py:2915 +msgid "Limit frequency" +msgstr "" + +#: dialog.py:571 +msgid "Limit points by cluster chi2" +msgstr "" + +#: dialog.py:2935 +msgid "Limit rank" +msgstr "" + +#: layout.py:72 +msgid "List of not plotted points : " +msgstr "" + +#: listlex.py:209 ProfList.py:322 +msgid "Make Tgen" +msgstr "" + +#: dialog.py:600 guifunct.py:685 +msgid "Make a movie" +msgstr "" + +#: dialog.py:2405 +msgid "Make text segments" +msgstr "" + +#: iramuteq.py:441 tree.py:182 +msgid "Matrix" +msgstr "" + +#: iramuteq.py:421 +msgid "Matrix analysis" +msgstr "" + +#: dialog.py:401 +msgid "" +"Maximum \n" +"memory for R" +msgstr "" + +#: OptionAlceste.py:43 +msgid "Maximum number of analyzed forms" +msgstr "" + +#: dialog.py:2034 +msgid "Maximum number of forms" +msgstr "" + +#: dialog.py:1225 +msgid "Maximum number of text segments" +msgstr "" + +#: guifunct.py:274 +msgid "Maximum tree" +msgstr "" + +#: dialog.py:1274 +msgid "Maxmum size of segments" +msgstr "" + +#: layout.py:581 +msgid "Mean of forms by segment" +msgstr "" + +#: textstat.py:56 +msgid "Mean of occurrences by text" +msgstr "" + +#: dialog.py:1740 dialog.py:2955 +msgid "Minimum frequency" +msgstr "" + +#: OptionAlceste.py:40 +msgid "Minimum frequency of an analyzed form (2=automatic)" +msgstr "" + +#: dialog.py:1282 +msgid "Minimum frequency of segments" +msgstr "" + +#: OptionAlceste.py:37 +msgid "Minimum frequency of text segments by clusters (0=automatic)" +msgstr "" + +#: dialog.py:1266 +msgid "Minimum size of segments" +msgstr "" + +#: dialog.py:1372 +msgid "Minimum text segments frenquency in clusters (2= automatic)" +msgstr "" + +#: dialog.py:2736 +msgid "Modalities (one by line, with the *)" +msgstr "" + +#: ProfList.py:328 +msgid "Morphology" +msgstr "" + +#: iramuteq.py:323 +msgid "Multiple Frequencies" +msgstr "" + +#: dialog.py:3066 guifunct.py:1008 +msgid "Name" +msgstr "" + +#: tree.py:433 +msgid "Navigator" +msgstr "" + +#: tree.py:742 +msgid "New Name" +msgstr "" + +#: guifunct.py:1136 +msgid "New..." +msgstr "" + +#: dialog.py:1355 dialog.py:1583 +msgid "Next" +msgstr "" + +#: tree.py:702 +msgid "No TGen yet !" +msgstr "" + +#: corpus.py:1532 +msgid "No Text in corpus. Are you sure of the formatting ?" +msgstr "" + +#: dialog.py:2490 +msgid "No space between two forms" +msgstr "" + +#: layout.py:578 +msgid "Number of active forms" +msgstr "" + +#: layout.py:580 +msgid "Number of active forms with a frequency" +msgstr "" + +#: layout.py:588 layout.py:590 +msgid "Number of clusters" +msgstr "" + +#: layout.py:574 layout.py:1037 textstat.py:53 +msgid "Number of forms" +msgstr "" + +#: layout.py:1038 textstat.py:54 +msgid "Number of hapax" +msgstr "" + +#: layout.py:577 +msgid "Number of lemmas" +msgstr "" + +#: layout.py:587 +msgid "Number of lines" +msgstr "" + +#: layout.py:575 textstat.py:52 +msgid "Number of occurrences" +msgstr "" + +#: layout.py:579 +msgid "Number of supplementary forms" +msgstr "" + +#: dialog.py:1362 OptionAlceste.py:35 +msgid "Number of terminal clusters on phase 1" +msgstr "" + +#: layout.py:573 layout.py:1036 +msgid "Number of text segments" +msgstr "" + +#: layout.py:572 layout.py:1035 textstat.py:51 +msgid "Number of texts" +msgstr "" + +#: dialog.py:2749 +msgid "One file by modality" +msgstr "" + +#: iramuteq.py:413 iramuteq.py:486 +msgid "Online help..." +msgstr "" + +#: dialog.py:2749 +msgid "Only one file" +msgstr "" + +#: tree.py:425 tree.py:467 +msgid "Open ..." +msgstr "" + +#: iramuteq.py:249 iramuteq.py:441 +msgid "Open a matrix" +msgstr "" + +#: iramuteq.py:254 iramuteq.py:443 +msgid "Open a text corpus" +msgstr "" + +#: iramuteq.py:258 iramuteq.py:445 +msgid "Open an analysis" +msgstr "" + +#: tree.py:410 +msgid "Open directory" +msgstr "" + +#: tree.py:608 +msgid "Open in a web browser ?" +msgstr "" + +#: dialog.py:2356 +msgid "Other" +msgstr "" + +#: dialog.py:931 dialog.py:977 dialog.py:1008 parse_factiva_xml.py:103 +msgid "Output file" +msgstr "" + +#: dialog.py:2370 +msgid "Output folder" +msgstr "" + +#: layout.py:729 Liste.py:58 vitemspicker.py:202 +msgid "POS" +msgstr "" + +#: layout.py:731 +msgid "POS frequencies" +msgstr "" + +#: tree.py:428 +msgid "POS profiles" +msgstr "" + +#: layout.py:733 +msgid "POS relative frequencies" +msgstr "" + +#: dialog.py:1081 dialog.py:2309 +msgid "Path" +msgstr "" + +#: dialog.py:429 dialog.py:438 +msgid "Path : " +msgstr "" + +#: dialog.py:551 dialog.py:2009 guifunct.py:259 +msgid "Picture format" +msgstr "" + +#: dialog.py:1819 guifunct.py:410 +msgid "Picture size" +msgstr "" + +#: dialog.py:342 +msgid "Play a sound at the end of analysis" +msgstr "" + +#: corpus.py:1632 iramuteq.py:762 iramuteq.py:795 layout.py:947 +#: parse_factiva_xml.py:183 tree.py:721 tree.py:1051 +msgid "Please wait..." +msgstr "" + +#: tree.py:496 +msgid "Please wait...Reading corpus" +msgstr "" + +#: OptionAlceste.py:47 +msgid "Potato mode (less precise, faster)" +msgstr "" + +#: dialog.py:3118 iramuteq.py:306 iramuteq.py:457 +msgid "Preferences" +msgstr "" + +#: dialog.py:1358 dialog.py:1582 +msgid "Previous" +msgstr "" + +#: iramuteq.py:700 ProfList.py:417 ProfList.py:451 +msgid "Problem" +msgstr "" + +#: layout.py:513 +msgid "Profiles" +msgstr "" + +#: iramuteq.py:328 +msgid "Prototypical Analysis" +msgstr "" + +#: layout.py:1267 layout.py:1277 +msgid "Prototypical analysis" +msgstr "" + +#: ProfList.py:329 +msgid "Proxemy" +msgstr "" + +#: dialog.py:2439 +msgid "Put text in lowercase" +msgstr "" + +#: dialog.py:433 +msgid "R path" +msgstr "" + +#: dialog.py:1221 +msgid "Ranking score" +msgstr "" + +#: dialog.py:2892 +msgid "Ranks" +msgstr "" + +#: layout.py:378 +msgid "Reading profiles" +msgstr "" + +#: iramuteq.py:429 +msgid "Ready" +msgstr "" + +#: iramuteq.py:326 iramuteq.py:374 +msgid "Reinert's Method" +msgstr "" + +#: tree.py:406 tree.py:742 +msgid "Rename" +msgstr "" + +#: ProfList.py:333 ProfList.py:579 +msgid "Repeated segments" +msgstr "" + +#: dialog.py:1244 layout.py:519 tree.py:427 +msgid "Repeated segments profiles" +msgstr "" + +#: dialog.py:2467 +msgid "Replace apostrophe by space" +msgstr "" + +#: dialog.py:2475 +msgid "Replace dash by space" +msgstr "" + +#: tree.py:435 tree.py:466 tree.py:648 tree.py:658 +msgid "Report" +msgstr "" + +#: dialog.py:557 +msgid "Representation" +msgstr "" + +#: dialog.py:1522 +msgid "Results" +msgstr "" + +#: dialog.py:2670 +msgid "Save as ..." +msgstr "" + +#: dialog.py:3286 +msgid "Save as..." +msgstr "" + +#: dialog.py:1737 guifunct.py:221 +msgid "Score" +msgstr "" + +#: guifunct.py:321 +msgid "Score on edges" +msgstr "" + +#: tree.py:617 +msgid "Search ..." +msgstr "" + +#: ProfList.py:244 +msgid "Search..." +msgstr "" + +#: ProfList.py:683 +msgid "Segments of this clustering" +msgstr "" + +#: parse_factiva_xml.py:93 +msgid "Select a csv file" +msgstr "" + +#: parse_factiva_xml.py:91 +msgid "Select a directory of html files" +msgstr "" + +#: parse_factiva_xml.py:95 +msgid "Select a directory of txt files" +msgstr "" + +#: parse_factiva_xml.py:89 +msgid "Select a directory of xml files" +msgstr "" + +#: dialog.py:2359 dialog.py:2709 +msgid "Select a file" +msgstr "" + +#: guifunct.py:381 +msgid "Select a variable" +msgstr "" + +#: dialog.py:1727 +msgid "Select by" +msgstr "" + +#: tabsimi.py:78 +msgid "Select columns" +msgstr "" + +#: dialog.py:3073 +msgid "Select one or more metadata" +msgstr "" + +#: guifunct.py:1022 +msgid "Selection" +msgstr "" + +#: dialog.py:331 dialog.py:470 dialog.py:971 dialog.py:1042 dialog.py:2151 +#: dialog.py:2286 dialog.py:2878 guifunct.py:163 OptionAlceste.py:63 +msgid "Settings" +msgstr "" + +#: iramuteq.py:316 iramuteq.py:460 +msgid "Show results" +msgstr "" + +#: iramuteq.py:327 iramuteq.py:375 +msgid "Similarities Analysis" +msgstr "" + +#: dialog.py:3126 +msgid "Size" +msgstr "" + +#: OptionAlceste.py:31 +msgid "Size of rst1" +msgstr "" + +#: layout.py:584 +msgid "Size of rst1 / rst2" +msgstr "" + +#: OptionAlceste.py:33 +msgid "Size of rst2" +msgstr "" + +#: layout.py:744 +msgid "Specificities" +msgstr "" + +#: iramuteq.py:372 +msgid "Specificities and CA" +msgstr "" + +#: dialog.py:597 guifunct.py:672 +msgid "Spheres transparency" +msgstr "" + +#: iramuteq.py:287 iramuteq.py:329 +msgid "Split from variable" +msgstr "" + +#: layout.py:551 +msgid "Stat by cluster" +msgstr "" + +#: iramuteq.py:371 +msgid "Statistics" +msgstr "" + +#: iramuteq.py:377 +msgid "Sub corpus" +msgstr "" + +#: tree.py:437 +msgid "Sub corpus from clusters" +msgstr "" + +#: iramuteq.py:378 +msgid "Sub corpus from metadata" +msgstr "" + +#: iramuteq.py:379 +msgid "Sub corpus from thematic" +msgstr "" + +#: dialog.py:3056 +msgid "Subcorpus" +msgstr "" + +#: dialog.py:1341 +msgid "Supplementaries variables (almost 1)" +msgstr "" + +#: layout.py:776 +msgid "Supplementary forms" +msgstr "" + +#: dialog.py:1328 +msgid "Supplementary variables are marked with a *" +msgstr "" + +#: ProfList.py:326 +msgid "Synonymous" +msgstr "" + +#: dialog.py:563 +msgid "Take the x first points" +msgstr "" + +#: dialog.py:567 +msgid "Take the x first points by cluster" +msgstr "" + +#: iramuteq.py:443 +msgid "Text" +msgstr "" + +#: iramuteq.py:422 +msgid "Text analysis" +msgstr "" + +#: dialog.py:2103 +msgid "Text color" +msgstr "" + +#: dialog.py:2388 +msgid "Text mark" +msgstr "" + +#: guifunct.py:308 +msgid "Text on vertex" +msgstr "" + +#: dialog.py:2413 +msgid "Text segments build process" +msgstr "" + +#: dialog.py:2422 +msgid "Text segments size" +msgstr "" + +#: dialog.py:74 dialog.py:75 dialog.py:79 +msgid "Text separator" +msgstr "" + +#: dialog.py:561 dialog.py:2063 guifunct.py:347 +msgid "Text size" +msgstr "" + +#: dialog.py:584 +msgid "Text size proportional to chi2" +msgstr "" + +#: dialog.py:577 +msgid "Text size proportional to frequency" +msgstr "" + +#: tree.py:160 +msgid "Textual corpus" +msgstr "" + +#: guifunct.py:991 +msgid "Tgen Creator" +msgstr "" + +#: tree.py:429 tree.py:458 +msgid "Tgen Editor" +msgstr "" + +#: layout.py:689 +msgid "Tgens Specificities" +msgstr "" + +#: dialog.py:953 dialog.py:1030 +msgid "This file already exists. Continue anyway ?" +msgstr "" + +#: tree.py:1062 +#, python-format +msgid "This file does not exist : %s" +msgstr "" + +#: layout.py:133 +msgid "This file will be delete : " +msgstr "" + +#: ProfList.py:451 +msgid "This is not a meta-data" +msgstr "" + +#: ProfList.py:417 +msgid "This is not a variable_modality form" +msgstr "" + +#: iramuteq.py:296 +msgid "Tools" +msgstr "" + +#: ProfList.py:330 +msgid "Tools from CNRTL (french only)" +msgstr "" + +#: layout.py:774 +msgid "Total" +msgstr "" + +#: listlex.py:208 listlex.py:273 ProfList.py:334 ProfList.py:611 +msgid "Typical text segments" +msgstr "" + +#: guifunct.py:208 +msgid "Use previous coordinates" +msgstr "" + +#: dialog.py:421 +msgid "Use svdlibc" +msgstr "" + +#: dialog.py:2397 +msgid "Use the expression dictionary" +msgstr "" + +#: dialog.py:1722 dialog.py:2048 +msgid "Used forms" +msgstr "" + +#: dialog.py:2888 +msgid "Variables" +msgstr "" + +#: dialog.py:2726 +msgid "Variables (with the * but without the _)" +msgstr "" + +#: dialog.py:1750 +msgid "Variables choice" +msgstr "" + +#: dialog.py:2250 +msgid "Variables selection" +msgstr "" + +#: guifunct.py:623 +msgid "Vertex color" +msgstr "" + +#: guifunct.py:651 +msgid "Vertex size" +msgstr "" + +#: guifunct.py:441 +msgid "Vertex size proportional to frequency" +msgstr "" + +#: guifunct.py:488 +msgid "Vertex text size proportional to frequency" +msgstr "" + +#: iramuteq.py:420 +msgid "View" +msgstr "" + +#: iramuteq.py:430 +msgid "Welcome" +msgstr "" + +#: ProfList.py:335 +msgid "Word cloud of cluster" +msgstr "" + +#: ProfList.py:312 +msgid "Word graph" +msgstr "" + +#: dialog.py:2019 +msgid "Word size proportional to ..." +msgstr "" + +#: iramuteq.py:376 +msgid "WordCloud" +msgstr "" + +#: dialog.py:1958 +msgid "Wordcloud settings" +msgstr "" + +#: dialog.py:1223 +msgid "absolute (sum of chi2 of marked forms in segment)" +msgstr "" + +#: dialog.py:560 dialog.py:1723 dialog.py:2052 +msgid "actives" +msgstr "" + +#: dialog.py:1723 dialog.py:2052 +msgid "actives and supplementaries" +msgstr "" + +#: OptionAlceste.py:32 +msgid "actives forms" +msgstr "" + +#: tree.py:465 +msgid "antiprofiles" +msgstr "" + +#: dialog.py:3130 +msgid "automatic" +msgstr "" + +#: dialog.py:2921 dialog.py:2941 +msgid "automatic (mean)" +msgstr "" + +#: dialog.py:1912 +msgid "bar" +msgstr "" + +#: dialog.py:1889 +msgid "black and white" +msgstr "" + +#: dialog.py:2185 +msgid "black and white graphical" +msgstr "" + +#: dialog.py:2293 +msgid "characters" +msgstr "" + +#: dialog.py:1734 dialog.py:1736 dialog.py:2023 +msgid "chi2" +msgstr "" + +#: dialog.py:1912 +msgid "circular diagram" +msgstr "" + +#: dialog.py:1482 +msgid "cluster" +msgstr "" + +#: dialog.py:560 dialog.py:874 +msgid "clusters" +msgstr "" + +#: dialog.py:1889 +msgid "color" +msgstr "" + +#: dialog.py:2179 +msgid "column percentage" +msgstr "" + +#: dialog.py:558 +msgid "coordinates" +msgstr "" + +#: dialog.py:2305 dialog.py:2705 +msgid "corpus" +msgstr "" + +#: dialog.py:558 +msgid "correlations" +msgstr "" + +#: guifunct.py:177 +msgid "count" +msgstr "" + +#: OptionAlceste.py:30 +msgid "double on RST" +msgstr "" + +#: dialog.py:2163 +msgid "expected values" +msgstr "" + +#: dialog.py:1482 +msgid "form" +msgstr "" + +#: dialog.py:2023 +msgid "frequency" +msgstr "" + +#: iramuteq.py:279 +msgid "from copy/paste" +msgstr "" + +#: iramuteq.py:277 +msgid "from mail" +msgstr "" + +#: iramuteq.py:275 +msgid "from xml" +msgstr "" + +#: dialog.py:2182 +msgid "graphical" +msgstr "" + +#: dialog.py:555 dialog.py:1827 dialog.py:1981 dialog.py:3146 guifunct.py:418 +msgid "height" +msgstr "" + +#: dialog.py:1734 +msgid "hypergeometrical law" +msgstr "" + +#: dialog.py:1073 +msgid "indexation" +msgstr "" + +#: layout.py:596 +msgid "line classified on" +msgstr "" + +#: dialog.py:2921 dialog.py:2941 dialog.py:3130 +msgid "manual" +msgstr "" + +#: guifunct.py:1251 +msgid "metadata table" +msgstr "" + +#: dialog.py:1728 +msgid "modalities" +msgstr "" + +#: dialog.py:47 dialog.py:57 dialog.py:350 dialog.py:365 dialog.py:922 +#: dialog.py:1057 dialog.py:1260 dialog.py:1332 +msgid "no" +msgstr "" + +#: dialog.py:2160 +msgid "observed values" +msgstr "" + +#: dialog.py:2293 +msgid "occurrences" +msgstr "" + +#: textstat.py:54 +msgid "of forms" +msgstr "" + +#: textstat.py:54 +msgid "of occurrences" +msgstr "" + +#: dialog.py:1073 +msgid "other" +msgstr "" + +#: dialog.py:2293 +msgid "paragraphs" +msgstr "" + +#: dialog.py:1066 +msgid "properties" +msgstr "" + +#: dialog.py:1223 +msgid "relative (mean of chi2 of marked forms in segment)" +msgstr "" + +#: dialog.py:2166 +msgid "residuals" +msgstr "" + +#: dialog.py:2176 +msgid "row percentage" +msgstr "" + +#: dialog.py:1482 +msgid "see" +msgstr "" + +#: layout.py:592 +msgid "segments classified on" +msgstr "" + +#: OptionAlceste.py:30 +msgid "simple on text segments" +msgstr "" + +#: OptionAlceste.py:30 +msgid "simple on texts" +msgstr "" + +#: dialog.py:2169 +msgid "standardized residuals" +msgstr "" + +#: dialog.py:560 +msgid "stars" +msgstr "" + +#: dialog.py:560 dialog.py:1723 dialog.py:2052 +msgid "supplementaries" +msgstr "" + +#: OptionAlceste.py:45 +msgid "svd method" +msgstr "" + +#: layout.py:594 +msgid "texts classified on" +msgstr "" + +#: dialog.py:2755 +msgid "thematics (one by line, with the -*)" +msgstr "" + +#: parse_factiva_xml.py:154 +msgid "this file doesn't exist" +msgstr "" + +#: layout.py:598 +msgid "time" +msgstr "" + +#: dialog.py:2173 +msgid "total percentage" +msgstr "" + +#: dialog.py:1728 +msgid "variables" +msgstr "" + +#: dialog.py:553 dialog.py:1838 dialog.py:1993 dialog.py:3139 guifunct.py:425 +msgid "width" +msgstr "" + +#: dialog.py:47 dialog.py:57 dialog.py:350 dialog.py:365 dialog.py:922 +#: dialog.py:1057 dialog.py:1260 dialog.py:1332 +msgid "yes" +msgstr "" diff --git a/autres/mki18n.py b/autres/mki18n.py new file mode 100644 index 0000000..cce0f74 --- /dev/null +++ b/autres/mki18n.py @@ -0,0 +1,459 @@ +# -*- coding: utf-8 -*- +# +# PYTHON MODULE: MKI18N.PY +# ========= +# +# Abstract: Make Internationalization (i18n) files for an application. +# +# Copyright Pierre Rouleau. 2003. Released to public domain. +# +# Last update: Saturday, November 8, 2003. @ 15:55:18. +# +# File: ROUP2003N01::C:/dev/python/mki18n.py +# +# RCS $Header: //software/official/MKS/MKS_SI/TV_NT/dev/Python/rcs/mki18n.py 1.5 2003/11/05 19:40:04 PRouleau Exp $ +# +# Update history: +# +# - File created: Saturday, June 7, 2003. by Pierre Rouleau +# - 10/06/03 rcs : RCS Revision 1.1 2003/06/10 10:06:12 PRouleau +# - 10/06/03 rcs : RCS Initial revision +# - 23/08/03 rcs : RCS Revision 1.2 2003/06/10 10:54:27 PRouleau +# - 23/08/03 P.R.: [code:fix] : The strings encoded in this file are encode in iso-8859-1 format. Added the encoding +# notification to Python to comply with Python's 2.3 PEP 263. +# - 23/08/03 P.R.: [feature:new] : Added the '-e' switch which is used to force the creation of the empty English .mo file. +# - 22/10/03 P.R.: [code] : incorporated utility functions in here to make script self sufficient. +# - 05/11/03 rcs : RCS Revision 1.4 2003/10/22 06:39:31 PRouleau +# - 05/11/03 P.R.: [code:fix] : included the unixpath() in this file. +# - 08/11/03 rcs : RCS Revision 1.5 2003/11/05 19:40:04 PRouleau +# +# RCS $Log: $ +# +# 2020 : modifié pour Python 3 - peut-être existe-t-il une mise à jour 'officielle' ??? +# ----------------------------------------------------------------------------- +""" +mki18n allows you to internationalize your software. You can use it to +create the GNU .po files (Portable Object) and the compiled .mo files +(Machine Object). + +mki18n module can be used from the command line or from within a script (see +the Usage at the end of this page). + + Table of Contents + ----------------- + + makePO() -- Build the Portable Object file for the application -- + catPO() -- Concatenate one or several PO files with the application domain files. -- + makeMO() -- Compile the Portable Object files into the Machine Object stored in the right location. -- + printUsage -- Displays how to use this script from the command line -- + + Scriptexecution -- Runs when invoked from the command line -- + + +NOTE: this module uses GNU gettext utilities. + +You can get the gettext tools from the following sites: + + - `GNU FTP site for gettetx`_ where several versions (0.10.40, 0.11.2, 0.11.5 and 0.12.1) are available. + Note that you need to use `GNU libiconv`_ to use this. Get it from the `GNU + libiconv ftp site`_ and get version 1.9.1 or later. Get the Windows .ZIP + files and install the packages inside c:/gnu. All binaries will be stored + inside c:/gnu/bin. Just put c:/gnu/bin inside your PATH. You will need + the following files: + + - `gettext-runtime-0.12.1.bin.woe32.zip`_ + - `gettext-tools-0.12.1.bin.woe32.zip`_ + - `libiconv-1.9.1.bin.woe32.zip`_ + + +.. _GNU libiconv: http://www.gnu.org/software/libiconv/ +.. _GNU libiconv ftp site: http://www.ibiblio.org/pub/gnu/libiconv/ +.. _gettext-runtime-0.12.1.bin.woe32.zip: ftp://ftp.gnu.org/gnu/gettext/gettext-runtime-0.12.1.bin.woe32.zip +.. _gettext-tools-0.12.1.bin.woe32.zip: ftp://ftp.gnu.org/gnu/gettext/gettext-tools-0.12.1.bin.woe32.zip +.. _libiconv-1.9.1.bin.woe32.zip: http://www.ibiblio.org/pub/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip + +""" +#------------------------------------ +# import des modules python +#------------------------------------ +import os +import sys + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +# ----------------------------------------------------------------------------- +# Global variables +# ---------------- +# + +__author__ = "Pierre Rouleau" +__version__= "$Revision: 1.5 $" + + +def getlanguageDict(): + languageDict = {} + + for lang in [x for x in dir(wx) if x.startswith("LANGUAGE")]: + i = wx.Locale(wx.LANGUAGE_DEFAULT).GetLanguageInfo(getattr(wx, lang)) + if i: + languageDict[i.CanonicalName] = i.Description + + return languageDict + +# ----------------------------------------------------------------------------- +# m a k e P O ( ) -- Build the Portable Object file for the application -- +# ^^^^^^^^^^^^^^^ +# +def makePO(applicationDirectoryPath, applicationDomain=None, verbose=0) : + """Build the Portable Object Template file for the application. + + makePO builds the .pot file for the application stored inside + a specified directory by running xgettext for all application source + files. It finds the name of all files by looking for a file called 'app.fil'. + If this file does not exists, makePo raises an IOError exception. + By default the application domain (the application + name) is the same as the directory name but it can be overridden by the + 'applicationDomain' argument. + + makePO always creates a new file called messages.pot. If it finds files + of the form app_xx.po where 'app' is the application name and 'xx' is one + of the ISO 639 two-letter language codes, makePO resynchronizes those + files with the latest extracted strings (now contained in messages.pot). + This process updates all line location number in the language-specific + .po files and may also create new entries for translation (or comment out + some). The .po file is not changed, instead a new file is created with + the .new extension appended to the name of the .po file. + + By default the function does not display what it is doing. Set the + verbose argument to 1 to force it to print its commands. + """ + + if applicationDomain is None: + applicationName = fileBaseOf(applicationDirectoryPath,withPath=0) + else: + applicationName = applicationDomain + currentDir = os.getcwd() + os.chdir(applicationDirectoryPath) + if not os.path.exists('app.fil'): + raise IOError(2,'No module file: app.fil') + + # Steps: + # Use xgettext to parse all application modules + # The following switches are used: + # + # -s : sort output by string content (easier to use when we need to merge several .po files) + # --files-from=app.fil : The list of files is taken from the file: app.fil + # --output= : specifies the name of the output file (using a .pot extension) + cmd = 'xgettext -s --no-wrap --files-from=app.fil --output=messages.pot' + if verbose: print(cmd) + os.system(cmd) + + languageDict = getlanguageDict() + + for langCode in list(languageDict.keys()): + if langCode == 'en': + pass + else: + langPOfileName = "%s_%s.po" % (applicationName , langCode) + if os.path.exists(langPOfileName): + cmd = 'msgmerge -s --no-wrap "%s" messages.pot > "%s.new"' % (langPOfileName, langPOfileName) + if verbose: print(cmd) + os.system(cmd) + os.chdir(currentDir) + +# ----------------------------------------------------------------------------- +# c a t P O ( ) -- Concatenate one or several PO files with the application domain files. -- +# ^^^^^^^^^^^^^ +# +def catPO(applicationDirectoryPath, listOf_extraPo, applicationDomain=None, targetDir=None, verbose=0) : + """Concatenate one or several PO files with the application domain files. + """ + + if applicationDomain is None: + applicationName = fileBaseOf(applicationDirectoryPath,withPath=0) + else: + applicationName = applicationDomain + currentDir = os.getcwd() + os.chdir(applicationDirectoryPath) + + languageDict = getlanguageDict() + + for langCode in list(languageDict.keys()): + if langCode == 'en': + pass + else: + langPOfileName = "%s_%s.po" % (applicationName , langCode) + if os.path.exists(langPOfileName): + fileList = '' + for fileName in listOf_extraPo: + fileList += ("%s_%s.po " % (fileName,langCode)) + cmd = "msgcat -s --no-wrap %s %s > %s.cat" % (langPOfileName, fileList, langPOfileName) + if verbose: print(cmd) + os.system(cmd) + if targetDir is None: + pass + else: + mo_targetDir = "%s/%s/LC_MESSAGES" % (targetDir,langCode) + cmd = "msgfmt --output-file=%s/%s.mo %s_%s.po.cat" % (mo_targetDir,applicationName,applicationName,langCode) + if verbose: print(cmd) + os.system(cmd) + os.chdir(currentDir) + +# ----------------------------------------------------------------------------- +# m a k e M O ( ) -- Compile the Portable Object files into the Machine Object stored in the right location. -- +# ^^^^^^^^^^^^^^^ +# +def makeMO(applicationDirectoryPath,targetDir='./locale',applicationDomain=None, verbose=0, forceEnglish=0) : + """Compile the Portable Object files into the Machine Object stored in the right location. + + makeMO converts all translated language-specific PO files located inside + the application directory into the binary .MO files stored inside the + LC_MESSAGES sub-directory for the found locale files. + + makeMO searches for all files that have a name of the form 'app_xx.po' + inside the application directory specified by the first argument. The + 'app' is the application domain name (that can be specified by the + applicationDomain argument or is taken from the directory name). The 'xx' + corresponds to one of the ISO 639 two-letter language codes. + + makeMo stores the resulting files inside a sub-directory of `targetDir` + called xx/LC_MESSAGES where 'xx' corresponds to the 2-letter language + code. + """ + if targetDir is None: + targetDir = './locale' + if verbose: + print("Target directory for .mo files is: %s" % targetDir) + + if applicationDomain is None: + applicationName = fileBaseOf(applicationDirectoryPath,withPath=0) + else: + applicationName = applicationDomain + currentDir = os.getcwd() + os.chdir(applicationDirectoryPath) + + languageDict = getlanguageDict() + languageDict['en'] = 'zerzer' + for langCode in list(languageDict.keys()): + print(langCode) + if (langCode == 'en') and (forceEnglish==0): + pass + else: + langPOfileName = "%s_%s.po" % (applicationName , langCode) + if os.path.exists(langPOfileName): + print("%s/%s/LC_MESSAGES" % (targetDir,langCode)) + mo_targetDir = "%s/%s/LC_MESSAGES" % (targetDir,langCode) + if not os.path.exists(mo_targetDir): + mkdir(mo_targetDir) + cmd = 'msgfmt --output-file="%s/%s.mo" "%s_%s.po"' % (mo_targetDir,applicationName,applicationName,langCode) + if verbose: print(cmd) + os.system(cmd) + os.chdir(currentDir) + +# ----------------------------------------------------------------------------- +# p r i n t U s a g e -- Displays how to use this script from the command line -- +# ^^^^^^^^^^^^^^^^^^^ +# +def printUsage(errorMsg=None) : + """Displays how to use this script from the command line.""" + print(""" + ################################################################################## + # mki18n : Make internationalization files. # + # Uses the GNU gettext system to create PO (Portable Object) files # + # from source code, coimpile PO into MO (Machine Object) files. # + # Supports C,C++,Python source files. # + # # + # Usage: mki18n {OPTION} [appDirPath] # + # # + # Options: # + # -e : When -m is used, forces English .mo file creation # + # -h : prints this help # + # -m : make MO from existing PO files # + # -p : make PO, update PO files: Creates a new messages.pot # + # file. Creates a dom_xx.po.new for every existing # + # language specific .po file. ('xx' stands for the ISO639 # + # two-letter language code and 'dom' stands for the # + # application domain name). mki18n requires that you # + # write a 'app.fil' file which contains the list of all # + # source code to parse. # + # -v : verbose (prints comments while running) # + # --domain=appName : specifies the application domain name. By default # + # the directory name is used. # + # --moTarget=dir : specifies the directory where .mo files are stored. # + # If not specified, the target is './locale' # + # # + # You must specify one of the -p or -m option to perform the work. You can # + # specify the path of the target application. If you leave it out mki18n # + # will use the current directory as the application main directory. # + # # + ##################################################################################""") + if errorMsg: + print("\n ERROR: %s" % errorMsg) + +# ----------------------------------------------------------------------------- +# f i l e B a s e O f ( ) -- Return base name of filename -- +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +def fileBaseOf(filename,withPath=0) : + """fileBaseOf(filename,withPath) ---> string + + Return base name of filename. The returned string never includes the extension. + Use os.path.basename() to return the basename with the extension. The + second argument is optional. If specified and if set to 'true' (non zero) + the string returned contains the full path of the file name. Otherwise the + path is excluded. + + [Example] + >>> fn = 'd:/dev/telepath/tvapp/code/test.html' + >>> fileBaseOf(fn) + 'test' + >>> fileBaseOf(fn) + 'test' + >>> fileBaseOf(fn,1) + 'd:/dev/telepath/tvapp/code/test' + >>> fileBaseOf(fn,0) + 'test' + >>> fn = 'abcdef' + >>> fileBaseOf(fn) + 'abcdef' + >>> fileBaseOf(fn,1) + 'abcdef' + >>> fn = "abcdef." + >>> fileBaseOf(fn) + 'abcdef' + >>> fileBaseOf(fn,1) + 'abcdef' + """ + pos = filename.rfind('.') + if pos > 0: + filename = filename[:pos] + if withPath: + return filename + else: + return os.path.basename(filename) +# ----------------------------------------------------------------------------- +# m k d i r ( ) -- Create a directory (and possibly the entire tree) -- +# ^^^^^^^^^^^^^ +# +def mkdir(directory) : + """Create a directory (and possibly the entire tree). + + The os.mkdir() will fail to create a directory if one of the + directory in the specified path does not exist. mkdir() + solves this problem. It creates every intermediate directory + required to create the final path. Under Unix, the function + only supports forward slash separator, but under Windows and MacOS + the function supports the forward slash and the OS separator (backslash + under windows). + """ + + # translate the path separators + directory = unixpath(directory) + # build a list of all directory elements + aList = [x for x in directory.split('/') if len(x)>0] + theLen = len(aList) + # if the first element is a Windows-style disk drive + # concatenate it with the first directory + if aList[0].endswith(':'): + if theLen > 1: + aList[1] = aList[0] + '/' + aList[1] + del aList[0] + theLen -= 1 + # if the original directory starts at root, + # make sure the first element of the list + # starts at root too + if directory[0] == '/': + aList[0] = '/' + aList[0] + # Now iterate through the list, check if the + # directory exists and if not create it + theDir = '' + for i in range(theLen): + theDir += aList[i] + if not os.path.exists(theDir): + os.mkdir(theDir) + theDir += '/' + +# ----------------------------------------------------------------------------- +# u n i x p a t h ( ) -- Return a path name that contains Unix separator. -- +# ^^^^^^^^^^^^^^^^^^^ +# +def unixpath(thePath) : + r"""Return a path name that contains Unix separator. + + [Example] + >>> unixpath(r"d:\test") + 'd:/test' + >>> unixpath("d:/test/file.txt") + 'd:/test/file.txt' + >>> + """ + thePath = os.path.normpath(thePath) + if os.sep == '/': + return thePath + else: + return thePath.replace(os.sep,'/') + +# ----------------------------------------------------------------------------- + +# S c r i p t e x e c u t i o n -- Runs when invoked from the command line -- +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +if __name__ == "__main__": + import getopt # command line parsing + argc = len(sys.argv) + if argc == 1: + printUsage('Missing argument: specify at least one of -m or -p (or both).') + sys.exit(1) + # If there is some arguments, parse the command line + validOptions = "ehmpv" + validLongOptions = ['domain=', 'moTarget='] + option = {} + option['forceEnglish'] = 0 + option['mo'] = 0 + option['po'] = 0 + option['verbose'] = 0 + option['domain'] = None + option['moTarget'] = None + try: + optionList,pargs = getopt.getopt(sys.argv[1:],validOptions,validLongOptions) + except getopt.GetoptError as e: + printUsage(e[0]) + sys.exit(1) + for (opt,val) in optionList: + if (opt == '-h'): + printUsage() + sys.exit(0) + elif (opt == '-e'): option['forceEnglish'] = 1 + elif (opt == '-m'): option['mo'] = 1 + elif (opt == '-p'): option['po'] = 1 + elif (opt == '-v'): option['verbose'] = 1 + elif (opt == '--domain'): option['domain'] = val + elif (opt == '--moTarget'): option['moTarget'] = val + if len(pargs) == 0: + appDirPath = os.getcwd() + if option['verbose']: + print("No project directory given. Using current one: %s" % appDirPath) + elif len(pargs) == 1: + appDirPath = pargs[0] + else: + printUsage('Too many arguments (%u). Use double quotes if you have space in directory name' % len(pargs)) + sys.exit(1) + if option['domain'] is None: + # If no domain specified, use the name of the target directory + option['domain'] = fileBaseOf(appDirPath) + if option['verbose']: + print("Application domain used is: '%s'" % option['domain']) + if option['po']: + try: + makePO(appDirPath,option['domain'],option['verbose']) + except IOError as e: + printUsage(e[1] + '\n You must write a file app.fil that contains the list of all files to parse.') + if option['mo']: + makeMO(appDirPath,option['moTarget'],option['domain'],option['verbose'],option['forceEnglish']) + sys.exit(1) + + +# ----------------------------------------------------------------------------- diff --git a/autres/network_to_blender.py b/autres/network_to_blender.py new file mode 100644 index 0000000..cedacda --- /dev/null +++ b/autres/network_to_blender.py @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- +""" +Blender script. Draws a node-and-edge network in blender, randomly distributed +spherically. + +14 Sept 2011: Added collision detection between nodes + +30 Nov 2012: Rewrote. Switched to JSON, and large Blender speed boosts. + +Written by Patrick Fuller, patrickfuller@gmail.com, 11 Sept 11 + +modifications by Pierre Ratinaud Feb 2014 +""" +#------------------------------------ +# import des modules python +#------------------------------------ +import bpy +from math import acos, degrees, pi +from mathutils import Vector +from copy import copy + +import json +from random import choice +import sys + + +# Colors to turn into materials +#colors = {"purple": (178, 132, 234), "gray": (11, 11, 11), +# "green": (114, 195, 0), "red": (255, 0, 75), +# "blue": (0, 131, 255), "clear": (0, 131, 255), +# "yellow": (255, 187, 0), "light_gray": (118, 118, 118)} + + +# Normalize to [0,1] and make blender materials +def make_colors(colors): + for key, value in list(colors.items()): + value = [x / 255.0 for x in value] + bpy.data.materials.new(name=key) + bpy.data.materials[key].diffuse_color = value + bpy.data.materials[key].specular_intensity = 0.5 + # Don't specify more parameters if these colors + if key == "gray" or key == "light_gray": + bpy.data.materials[key].use_transparency = True + bpy.data.materials[key].transparency_method = "Z_TRANSPARENCY" + bpy.data.materials[key].alpha = 0.2 + # Transparency parameters + else : + bpy.data.materials[key].use_transparency = True + bpy.data.materials[key].transparency_method = "Z_TRANSPARENCY" + bpy.data.materials[key].alpha = 0.6 if key == "clear" else 0.8 + bpy.data.materials.new(name = key + 'sphere') + bpy.data.materials[key + 'sphere'].diffuse_color = value + bpy.data.materials[key + 'sphere'].specular_intensity = 0.1 + bpy.data.materials[key + 'sphere'].use_transparency = True + bpy.data.materials[key + 'sphere'].transparency_method = "Z_TRANSPARENCY" + bpy.data.materials[key + 'sphere'].alpha = 0.1 + #bpy.data.materials[key].raytrace_transparency.fresnel = 0.1 + #bpy.data.materials[key].raytrace_transparency.ior = 1.15 + +def draw_network(network, edge_thickness=0.25, node_size=3, directed=False, spheres = True): + """ Takes assembled network/molecule data and draws to blender """ + colors = [tuple(network["nodes"][node]['color']) for node in network["nodes"]] + cols = list(set(colors)) + colors = dict(list(zip([str(col) for col in cols],cols))) + colors.update({"light_gray": (118, 118, 118), "gray": (11, 11, 11)}) + make_colors(colors) + # Add some mesh primitives + bpy.ops.object.select_all(action='DESELECT') + #bpy.ops.mesh.primitive_uv_sphere_add() + bpy.ops.mesh.primitive_uv_sphere_add(segments = 64, ring_count = 32) + sphere = bpy.context.object + bpy.ops.mesh.primitive_cylinder_add() + cylinder = bpy.context.object + cylinder.active_material = bpy.data.materials["light_gray"] + bpy.ops.mesh.primitive_cone_add() + cone = bpy.context.object + cone.active_material = bpy.data.materials["light_gray"] + #bpy.ops.object.text_add(view_align=True) + # Keep references to all nodes and edges + shapes = [] + # Keep separate references to shapes to be smoothed + shapes_to_smooth = [] + #val to div coordonnate + divval = 0.05 + # Draw nodes + for key, node in list(network["nodes"].items()): + # Coloring rule for nodes. Edit this to suit your needs! + col = str(tuple(node.get("color", choice(list(colors.keys()))))) + # Copy mesh primitive and edit to make node + # (You can change the shape of drawn nodes here) + if spheres : + node_sphere = sphere.copy() + node_sphere.data = sphere.data.copy() + node_sphere.location = [val/divval for val in node["location"]] + #node_sphere.dimensions = [node_size] * 3 + node_sphere.dimensions = [node["weight"]] * 3 + #newmat = bpy.data.materials[col] + #newmat.alpha = 0.01 + node_sphere.active_material = bpy.data.materials[col + 'sphere'] + bpy.context.scene.objects.link(node_sphere) + shapes.append(node_sphere) + shapes_to_smooth.append(node_sphere) + #node_text = text.copy() + #node_text.data = text.data.copy() + #node_text.location = node["location"] + bpy.ops.object.text_add(view_align=False, location = [val/divval for val in node["location"]]) + #bpy.ops.object.text_add(view_align=False, location = [val for val in node["location"]]) + bpy.ops.object.editmode_toggle() + bpy.ops.font.delete() + bpy.ops.font.text_insert(text=key) + bpy.ops.object.editmode_toggle() + bpy.data.curves[bpy.context.active_object.name].size = node["weight"]/2 + bpy.data.curves[bpy.context.active_object.name].bevel_depth = 0.044 + bpy.data.curves[bpy.context.active_object.name].offset = 0 + bpy.data.curves[bpy.context.active_object.name].extrude = 0.2 + bpy.data.curves[bpy.context.active_object.name].align = "CENTER" + bpy.context.active_object.rotation_euler = [1.5708,0,1.5708] + bpy.context.active_object.active_material = bpy.data.materials[col] + #bpy.ops.object.mode_set(mode='OBJECT') + #Extrude the text + #bpy.context.object.data.extrude = 0.03 + #Convert text to mesh + #bpy.context.active_object.convert(target='MESH', keep_original=False) + const = bpy.context.active_object.constraints.new(type='TRACK_TO') + const.target = bpy.data.objects['Camera'] + const.track_axis = "TRACK_Z" + const.up_axis = "UP_Y" + #bpy.context.scene.objects.link(bpy.context.active_object) + #shapes.append(bpy.context.active_object) + #sha* 2 + [mag - node_size] + shapes_to_smooth.append(bpy.context.active_object) + # Draw edges + for edge in network["edges"]: + # Get source and target locations by drilling down into data structure + source_loc = network["nodes"][edge["source"]]["location"] + source_loc = [val/divval for val in source_loc] + target_loc = network["nodes"][edge["target"]]["location"] + target_loc = [val / divval for val in target_loc] + diff = [c2 - c1 for c2, c1 in zip(source_loc, target_loc)] + cent = [(c2 + c1) / 2 for c2, c1 in zip(source_loc, target_loc)] + mag = sum([(c2 - c1) ** 2 + for c1, c2 in zip(source_loc, target_loc)]) ** 0.5 + # Euler rotation calculation + v_axis = Vector(diff).normalized() + v_obj = Vector((0, 0, 1)) + v_rot = v_obj.cross(v_axis) + angle = acos(v_obj.dot(v_axis)) + # Copy mesh primitive to create edge + edge_cylinder = cylinder.copy() + edge_cylinder.data = cylinder.data.copy() + edge_cylinder.dimensions = [float(edge['weight'])/10] * 2 + [mag - node_size] + #edge_cylinder.dimensions = [edge_thickness] * 2 + [mag - node_size] + edge_cylinder.location = cent + edge_cylinder.rotation_mode = "AXIS_ANGLE" + edge_cylinder.rotation_axis_angle = [angle] + list(v_rot) + bpy.context.scene.objects.link(edge_cylinder) + shapes.append(edge_cylinder) + shapes_to_smooth.append(edge_cylinder) + # Copy another mesh primitive to make an arrow head + if directed: + arrow_cone = cone.copy() + arrow_cone.data = cone.data.copy() + arrow_cone.dimensions = [edge_thickness * 4.0] * 3 + arrow_cone.location = cent + arrow_cone.rotation_mode = "AXIS_ANGLE" + arrow_cone.rotation_axis_angle = [angle + pi] + list(v_rot) + bpy.context.scene.objects.link(arrow_cone) + shapes.append(arrow_cone) + # Remove primitive meshes + bpy.ops.object.select_all(action='DESELECT') + sphere.select = True + cylinder.select = True + cone.select = True + #text.select = True + # If the starting cube is there, remove it + if "Cube" in list(bpy.data.objects.keys()): + bpy.data.objects.get("Cube").select = True + bpy.ops.object.delete() + # Smooth specified shapes + for shape in shapes_to_smooth: + shape.select = True + #bpy.context.scene.objects.active = shapes_to_smooth[0] + #bpy.ops.object.shade_smooth() + # Join shapes + for shape in shapes: + shape.select = True + #bpy.context.scene.objects.active = shapes[0] + #bpy.ops.object.join() + # Center object origin to geometry + bpy.ops.object.origin_set(type="ORIGIN_GEOMETRY", center="MEDIAN") + # Refresh scene + bpy.context.scene.update() + +# If main, load json and run +if __name__ == "__main__": + with open(sys.argv[3]) as network_file: + network = json.load(network_file) + draw_network(network) diff --git a/autres/newsimi.py b/autres/newsimi.py new file mode 100644 index 0000000..03b800d --- /dev/null +++ b/autres/newsimi.py @@ -0,0 +1,23 @@ + + + + + +simi : + + + +class Simi() : + def __init__(self, parent, param, cmd=False) : + pass + + def make_Rcode(self) : + pass + + def doR(self) : + pass + + def make_param(self) : + pass + + diff --git a/autres/parse_factiva_html.py b/autres/parse_factiva_html.py new file mode 100644 index 0000000..4de3c79 --- /dev/null +++ b/autres/parse_factiva_html.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#License: GNU/GPL + +#------------------------------------ +# import des modules python +#------------------------------------ +import os +import codecs +import sys +import re + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx +import wx.lib.sized_controls as sc +import wx.lib.filebrowsebutton as filebrowse + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +from html.parser import HTMLParser + + +htmldir = 'dev/factiva_html' + + +class MyHTMLParser(HTMLParser): + + def __init__(self) : + HTMLParser.__init__(self) + self.recording = 0 + self.data = [] + self.need = True + self.author = False + self.start = False + self.text = False + self.count = 0 + + def handle_starttag(self, tag, attrs): + self.need=True + if tag not in ['div', 'p', 'b'] : + self.need=False + self.text = False + return + else : + print(attrs) + self.need = True + if tag == 'div' : + if attrs != [] : + tagtype = attrs[0][0] + tagname = attrs[0][1].split() + if tagtype == 'class' and tagname[0] == 'article' : + self.author = False + self.start = True + self.count = 0 + self.data.append([]) + elif tagtype == 'class' and tagname[0] == 'author' : + self.author = True + if tag == 'p' : + if attrs != [] : + tagtype = attrs[0][0] + tagname = attrs[0][1].split() + if tagtype == 'class' and tagname[0] == 'articleParagraph' : + self.text = True + if tag == 'b' : + self.text = True + return + + def handle_data(self, data) : + #print data.encode('utf-8') + if self.need : + #print data.encode('utf-8') + if self.start : + pass + #print 'data', data.encode('utf8') + if self.author : + if self.count < 7 : + self.data[-1].append(data) + self.count += 1 + else : + self.author = False + elif self.text : + if self.count == 2 and not self.author : + self.data[-1].append('PAS DAUTEUR') + self.count += 1 + self.data[-1].append(data) + else : + self.count += 1 + self.data[-1].append(data) + # print "Encountered a start tag:", tag + #def handle_endtag(self, tag): + # print "Encountered an end tag :", tag + #def handle_data(self, data): + # print "Encountered some data :", data + +# execution en direct ??? +files = os.listdir(htmldir) +parser = MyHTMLParser() +for f in files : + f= os.path.join(htmldir, f) + with codecs.open(f, 'r', 'utf8') as infile : + content = infile.read() +parser.feed(content) +out = [[' '.join(['****','*date_'+art[4].replace(' ','_'),'*s_'+art[5].replace(' ','_')]), ' '.join(art[10:len(art)-1])] for art in parser.data] +for i in range(0,8): + print(parser.data[i]) +out = [' '.join(art) for art in out] +print('\n\n\n'.join(out)) diff --git a/autres/putcorpusindb.py b/autres/putcorpusindb.py new file mode 100644 index 0000000..235877f --- /dev/null +++ b/autres/putcorpusindb.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- + +#------------------------------------ +# import des modules python +#------------------------------------ +import sqlite3 +import codecs +import os +import shelve +from time import time + + +#------------------------------------ +# execution directe, +#definition de fonction, +#encore execution directe +# ??? +#------------------------------------ + +corpus_out = 'corpus.txt' + +with codecs.open(corpus_out ,'r', 'utf8') as f: + content = f.read() + sep = '\n\n' + ucis_paras_uces = [[[uce for uce in para.splitlines()] for para in uci.split('$$$')] for uci in content.split(sep)] +print(ucis_paras_uces[0]) +#db = 'corpus.db' +#conn = sqlite3.connect(db) +#c = conn.cursor() +#conn.text_factory = str +#c = conn.cursor() +#c.execute('''CREATE TABLE if not exists uce (id INTEGER PRIMARY KEY, iduci INTEGER, idpara INTEGER, content TEXT)''') +#c = conn.cursor() +idpara = -1 +iduce = -1 +uce_uci_para = {} +para_uci = {} +formes = {} + +def addforme(word, formes, iduce) : + if word in formes : + formes[word][0] += 1 + if iduce in formes[word][1] : + formes[word][1][iduce] += 1 + else : + formes[word][1][iduce] = 1 + else : + formes[word] = [1, {iduce:1}] + +for i, uci in enumerate(ucis_paras_uces) : + for para in uci : + idpara += 1 + para_uci[idpara] = i + for uce in para : + iduce += 1 + uce_uci_para[iduce] = [i, idpara] + fileout = os.path.join('uce', '%i.txt' % iduce) + with open(fileout, 'w') as f : + f.write(uce) + uce = uce.split() + for word in uce : + addforme(word, formes, iduce) +t1 = time() #chronométrage +d = shelve.open('shelves.db') +d['formes']=formes +d.close() +print(time() - t1) #chronométrage +t2 = time() #chronométrage +d = shelve.open('shelves.db') +formes = d['formes'] +d.close() +print(time() - t2) #chronométrage +t3 = time() #chronométrage +word = formes['les'] +ucis = [uce_uci_para[iduce][0] for iduce in word[1]] +word[0] +print(time() - t3) #chronométrage + +#c.execute('INSERT INTO uce values (?, ?, ?, ?)', (iduce, i, idpara, uce)) +#conn.commit() diff --git a/autres/setup.py.win b/autres/setup.py.win new file mode 100644 index 0000000..0692a37 --- /dev/null +++ b/autres/setup.py.win @@ -0,0 +1,50 @@ +# setup.py +from distutils.core import setup +import py2exe +import os +import glob + +list_conf = os.listdir("configuration") +conf = [os.path.join("configuration",f) for f in list_conf if f != '.svn'] + +list_r = os.listdir("Rscripts") +rscripts = [os.path.join("Rscripts",f) for f in list_r if f != '.svn'] + +list_i = os.listdir("images") +images = [os.path.join("images",f) for f in list_i if f != '.svn'] + +list_d = os.listdir("dictionnaires") +dicos = [os.path.join("dictionnaires", f) for f in list_d if f !='.svn'] + +excludes = ['_gtkagg', '_tkagg', 'curses', 'pywin.debugger', + 'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl', + 'Tkconstants', 'Tkinter'] + +dll_excludes = ['tcl85.dll', 'tk85.dll'] + + +py26MSdll = glob.glob(r"dll\\*.*") + +data_files = [("Microsoft.VC90.CRT", py26MSdll), + ("lib\\Microsoft.VC90.CRT", py26MSdll),] +data_files += [("configuration",conf), + ("Rscripts",rscripts), + ("locale\\fr_FR\\LC_MESSAGES", ["locale\\fr_FR\\LC_MESSAGES\\iramuteq.mo"]), + ("locale\\en\\LC_MESSAGES", ["locale\\en\\LC_MESSAGES\\iramuteq.mo"]), + ("dictionnaires", dicos), + ("images",images), + ("",["gpl-2.0.txt","gpl-2.0-fr.txt","son_fin.wav"])] +setup( +windows = [ +{ +"script": "iramuteq.py", +"icon_resources": [(1, "images\\iraiconw7.ico")] +} +], +options={"py2exe":{"packages":["wx", "dbhash"], + "excludes" : excludes, + "dll_excludes" : dll_excludes,} + }, +data_files = data_files, +) +#incomplet diff --git a/autres/tabstudent.py b/autres/tabstudent.py new file mode 100644 index 0000000..96cd932 --- /dev/null +++ b/autres/tabstudent.py @@ -0,0 +1,339 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#License: GNU/GPL + +#------------------------------------ +# import des modules python +#------------------------------------ +import string +import os +import sys +import tempfile +from time import sleep + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +from chemins import ffr +from layout import MakeHeader,MakeStudentTable +from functions import exec_rcode, check_Rresult + + +class StudentDialog(wx.Dialog): + + def __init__( + self, parent, ID, title, size=wx.DefaultSize, pos=wx.DefaultPosition, + style=wx.DEFAULT_DIALOG_STYLE + ): + wx.Dialog.__init__(self) # 1 + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) # 2 + self.Create(parent, ID, title) # 3 + Filename=parent.PATH[0] + self.content=parent.table[:] + self.HEADER=parent.header[:] + fnb={} + inb={} + cnb={} + vide={} + #FIXME : assume une premiere ligne contenant les noms de colonnes + for line in self.content: + i=0 + for val in line : + if val=='': + if i in vide: + vide[i]+=1 + else: + vide[i]=1 + else: + try: + int(val) + if i in inb: + inb[i]+=1 + else: + inb[i]=1 + except: + try: + float(val) + if i in fnb: + fnb[i]+=1 + else: + fnb[i]=1 + except: + if i in cnb: + cnb[i]+=1 + else: + cnb[i]=1 + i+=1 + dicttot={} + for key,nb in vide.items(): + dicttot[key]=['vide',nb] + print(dicttot) + for key,nb in inb.items() : + if key in dicttot: + dicttot[key]=['int',dicttot[key][1]+nb] + else: + dicttot[key]=['int',nb] + for key,nb in fnb.items(): + if key in dicttot: + dicttot[key]=['float',dicttot[key][1]+nb] + else: + dicttot[key]=['float',nb] + for key,nb in cnb.items(): + if key in dicttot: + dicttot[key]=['char',dicttot[key][1]+nb] + else: + dicttot[key]=['char',nb] + acontent=array(self.content) + self.ListGrp=[] + lg=[i for i,descr in dicttot.items() if descr[0]=='char'] + for i in lg: + if len(unique(acontent[:,i]))==2: + self.ListGrp.append(i) + elif ('' in unique(acontent[:,i]).tolist()) and len(unique(acontent[:,i]))==3: + self.ListGrp.append(i) + li=[i for i,descr in dicttot.items() if descr[0]=='int'] + lf=[i for i,descr in dicttot.items() if descr[0]=='float'] + self.ListNum=li+lf + print(self.ListGrp, self.ListNum) + LABELLIST=[] + for i in self.HEADER: + if len(i)>60 : + LABELLIST.append(i[0:60]) + else: + LABELLIST.append(i) + self.LabelListGrp=[] + self.LabelListNum=[] + for i in self.ListGrp : + self.LabelListGrp.append(LABELLIST[i]) + for i in self.ListNum : + self.LabelListNum.append(LABELLIST[i]) + self.list_box_1 = wx.ListBox(self, -1, choices=self.LabelListGrp, style=wx.LB_MULTIPLE|wx.LB_HSCROLL) + self.list_box_2 = wx.ListBox(self, -1, choices=self.LabelListNum, style=wx.LB_MULTIPLE|wx.LB_HSCROLL) + self.button_1 = wx.Button(self, wx.ID_OK) + self.button_cancel = wx.Button(self, wx.ID_CANCEL) + self.__set_properties() + self.__do_layout() + self.Bind(wx.EVT_LISTBOX, self.Select1, self.list_box_1) + # end wxGlade + self.TEMPDIR=parent.TEMPDIR + self.parent=parent + self.Filename=parent.fileforR + #--------------FIXME + self.num=parent.FreqNum + #------------------------------- + + def __set_properties(self): + # begin wxGlade: ConfChi2.__set_properties + self.SetTitle("Sélection des variables") + self.list_box_1.SetSelection(0) + self.list_box_2.SetSelection(0) + # end wxGlade + + def __do_layout(self): + # begin wxGlade: ConfChi2.__do_layout + sizer_1 = wx.BoxSizer(wx.VERTICAL) + sizer_2 = wx.BoxSizer(wx.VERTICAL) + sizer_3 = wx.BoxSizer(wx.HORIZONTAL) + sizer_4 = wx.BoxSizer(wx.HORIZONTAL) + sizer_3.Add(self.list_box_1, 0, wx.EXPAND, 0) + sizer_3.Add(self.list_box_2, 0, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 0) + sizer_2.Add(sizer_3, 1, wx.EXPAND, 0) + sizer_4.Add(self.button_cancel, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 0) + sizer_4.Add(self.button_1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 0) + sizer_2.Add(sizer_4, 0, wx.ALIGN_CENTRE_HORIZONTAL, 0) + sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) + self.SetSizer(sizer_1) + sizer_1.Fit(self) + self.Layout() + # end wxGlade + + def Select1(self, event): # wxGlade: ConfChi2. + event.Skip() + + def ShowStudent(self,select1,select2): + parent=self.parent + self.encode=self.parent.SysEncoding + ################################################# + #max = len(select1)*len(select2) + #dlg = wx.ProgressDialog("Traitements", + # "Veuillez patienter...", + # maximum = max, + # parent=self, + # style = wx.PD_APP_MODAL + # ) + #dlg.Center() + #count = 0 + ############################################### + Graph=True + colgrp=[self.ListGrp[i] for i in select1] + colnum=[self.ListNum[i] for i in select2] + if len(select1)==1: + strcolgrp=str(tuple(colgrp)).replace(',','') + else: + strcolgrp=str(tuple(colgrp)) + if len(select2)==1: + strcolnum=str(tuple(colnum)).replace(',','') + else: + strcolnum=str(tuple(colnum)) + txtR='' + txtR+=""" + source('%s') + """%self.parent.RscriptsPath['Rfunct'] + if parent.g_id: rownames='1' + else : rownames='NULL' + if parent.g_header : header = 'TRUE' + else : header = 'FALSE' + #txtR+=""" + #datadm <- ReadData('%s', encoding='%s',header = %s, sep = '%s',quote = '%s', na.strings = '%s',rownames=%s) + txtR += """ + datadm <- read.csv2('%s', encoding='%s',header = %s, sep = '%s',quote = '%s', na.strings = '%s',row.names=%s, dec='.') + """%(ffr(self.Filename),parent.encode,header, parent.colsep,parent.txtsep,parent.nastrings,rownames) + txtR+=""" + num<-%i + """%self.num + txtR+=""" + tmpdir<-'%s' + """%ffr(self.TEMPDIR) + txtR+=""" + out<-matrix(0,0,1) + count<-0 + for (i in c%s) { + """%strcolgrp + txtR+=""" + for (j in c%s) { + """%strcolnum + txtR+=""" + datadm[,(j+1)]<-as.numeric(datadm[,(j+1)]) + count<-count+1 + fileout<-paste('student',num,sep='') + fileout<-paste(fileout,'_',sep='') + fileout<-paste(fileout,count,sep='') + fileout<-paste(fileout,'.jpeg',sep='') + fileout<-file.path(tmpdir,fileout) + if (Sys.info()["sysname"]=='Darwin') { + quartz(file=fileout,type='jpeg') + par(cex=1) + } else { + jpeg(fileout,res=200) + par(cex=0.4) + } + plot(datadm[,(j+1)] ~ datadm[,(i+1)],data=datadm) + dev.off() + student<-t.test(datadm[,(j+1)] ~ datadm[,(i+1)],data=datadm) + pvalue<-student$p.value + method<-student$method + tvalue<-student$statistic + df<-student$parameter + grmean<-as.matrix(student$estimate) + out<-rbind(out,round(grmean,digits=2)) + out<-rbind(out,pvalue) + out<-rbind(out,method) + out<-rbind(out,tvalue) + out<-rbind(out,round(df,digits=2)) + out<-rbind(out,fileout) + out<-rbind(out,"**") + } + } + """ + restmp=tempfile.mktemp(dir=self.TEMPDIR) + txtR+=""" + write.csv2(out,file='%s') + """%ffr(restmp) + tmpfile=tempfile.mktemp(dir=self.TEMPDIR) + tmpscript=open(tmpfile,'w') + tmpscript.write(txtR) + tmpscript.close() + pid = exec_rcode(self.parent.RPath, tmpfile, wait = False) + while pid.poll() == None : + sleep(0.2) + check_Rresult(self.parent, pid) + file=open(restmp,'r') + res=file.readlines() + file.close() + resl=[line.replace('\n','').replace('"','').split(';') for line in res] + resl.pop(0) + i=0 + student={} + listr=[] + for line in resl : + if i==8 : + i=0 + if i==0 : + student['grp1']=line[0].replace('mean in group ','') + student['mean1']=float(line[1]) + if i==1 : + student['grp2']=line[0].replace('mean in group ','') + student['mean2']=float(line[1]) + if i==2: + student['p.value']=float(line[1]) + if i==3: + student['method']=line[1] + if i==4 : + student['t']=float(line[1]) + if i==5 : + student['df']=float(line[1]) + if i==6: + student['graph']=line[1] + if i==7: + listr.append(student) + student={} + i+=1 + txt2='' + ancre=0 + LISTFILE=[] + LISTFILE.append(False) + txt=MakeHeader('T de Student', self.encode) + ListGraph=[] + for i in select1 : + for j in select2: + ancre+=1 + Student=listr[ancre-1] + pvalue=Student['p.value'] + Colname=self.LabelListNum[j] + Colgrp=self.LabelListGrp[i] + LISTFILE.append(Student['graph']) + if pvalue<0.05: + color='green' + else: + color='red' + txt+="%s
    "%(ancre,color,Colname+' / '+Colgrp) + txt2+=MakeStudentTable(Student,self.num,ancre,Graph,os.path.basename(Student['graph']),Colname,self.encode) + txt+=txt2 + fileout=os.path.join(self.TEMPDIR,'resultats-student_%s.html'%str(self.num)) + File=open(fileout,'w') + File.write(txt) + File.close() + LISTFILE.append(fileout) +# dlg.Destroy() + return LISTFILE + + +class MakeStudent(): + + def __init__(self,parent): + dlg = StudentDialog(parent, -1, "Student", size=(350, 400), + style = wx.DEFAULT_DIALOG_STYLE + ) + dlg.CenterOnScreen() + val = dlg.ShowModal() + if val==wx.ID_OK : + ColSel1=dlg.list_box_1.GetSelections() + ColSel2=dlg.list_box_2.GetSelections() + listfileout=dlg.ShowStudent(ColSel1,ColSel2) + parent.FreqNum+=1 + parent.DictTab["t de student_%s*"%parent.FreqNum]=listfileout + parent.FileTabList.append(listfileout) + parent.newtab=wx.html.HtmlWindow(parent.nb, -1) + if "gtk2" in wx.PlatformInfo: + parent.newtab.SetStandardFonts() + parent.newtab.LoadPage(listfileout[len(listfileout)-1]) + parent.nb.AddPage(parent.newtab,"t de student_%s*"%parent.FreqNum) + parent.nb.SetSelection(parent.nb.GetPageCount()-1) + parent.ShowTab(wx.EVT_BUTTON) + parent.DisEnSaveTabAs(True) diff --git a/autres/testdecoupe.txt b/autres/testdecoupe.txt new file mode 100644 index 0000000..00e761c --- /dev/null +++ b/autres/testdecoupe.txt @@ -0,0 +1,8901 @@ +TEST LOGGING funcion +#######LOGGING TEST########### +TEST LOGGING +PLUS DE LOG !!!!!!!!!! +LOGGING TEST +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'l', u'habitude', u'de', u'faire', u'des', u'projets'] +suite + je vis au jour le jour . les adolescents font des projets à partir du moment où il se rendent compte qu ils ne doivent compter que sur eux même et qu ils doivent se prendre en charge de quel genre de projets s agit il ? projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'je', u'vis', u'au', u'jour', u'le', u'jour'] +suite + les adolescents font des projets à partir du moment où il se rendent compte qu ils ne doivent compter que sur eux même et qu ils doivent se prendre en charge de quel genre de projets s agit il ? projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'les', u'adolescents', u'font', u'des', u'projets', u'\xe0', u'partir'] +suite +du moment où il se rendent compte qu ils ne doivent compter que sur eux même et qu ils doivent se prendre en charge de quel genre de projets s agit il ? projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'du', u'moment', u'o\xf9', u'il', u'se', u'rendent', u'compte', u'qu', u'ils'] +suite +ne doivent compter que sur eux même et qu ils doivent se prendre en charge de quel genre de projets s agit il ? projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'ne', u'doivent', u'compter', u'que', u'sur', u'eux', u'm\xeame', u'et', u'qu'] +suite +ils doivent se prendre en charge de quel genre de projets s agit il ? projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel'] +suite +genre de projets s agit il ? projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'genre', u'de', u'projets', u's', u'agit', u'il'] +suite + projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile'] +suite + sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison'] +suite + une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police'] +suite + car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'car', u'je', u'veux', u'devenir', u'policier'] +suite + projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'projet', u'sentimental', u',', u'en', u'ce', u'moment'] +suite + je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois'] +suite + et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps'] +suite + projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'projets', u'futurs'] +suite + avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde'] +suite + ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre'] +suite +société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets'] +suite +soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce'] +suite +que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer'] +suite + ne jamais se décourager$ +reste +True +texte_uce +[u'ne', u'jamais', u'se', u'd\xe9courager'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets'] +suite + devenir un jour professeur de français ou d histoire géographie ; me marier ; avoir un enfant pas plus , faire construire une maison et si possible , ne pas vivre en ville , plutôt dans l agglomération et même à la campagne , passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'devenir', u'un', u'jour', u'professeur', u'de', u'fran\xe7ais'] +suite +ou d histoire géographie ; me marier ; avoir un enfant pas plus , faire construire une maison et si possible , ne pas vivre en ville , plutôt dans l agglomération et même à la campagne , passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'ou', u'd', u'histoire', u'g\xe9ographie', u';', u'me', u'marier'] +suite + avoir un enfant pas plus , faire construire une maison et si possible , ne pas vivre en ville , plutôt dans l agglomération et même à la campagne , passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'avoir', u'un', u'enfant', u'pas', u'plus'] +suite + faire construire une maison et si possible , ne pas vivre en ville , plutôt dans l agglomération et même à la campagne , passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'faire', u'construire', u'une', u'maison', u'et', u'si', u'possible'] +suite + ne pas vivre en ville , plutôt dans l agglomération et même à la campagne , passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'ne', u'pas', u'vivre', u'en', u'ville'] +suite + plutôt dans l agglomération et même à la campagne , passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne'] +suite + passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'passer', u'mon', u'permis', u'de', u'conduire'] +suite + avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'avoir', u'une', u'ou', u'plusieurs', u'voitures'] +suite + pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs'] +suite +projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord'] +suite +que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral'] +suite + devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que'] +suite +les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas'] +suite +obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'seraient', u'de', u'devenir', u'v\xe9t\xe9rinaire'] +suite + d avoir une belle maison à la montagne et une au bord de la mer , avoir une femme un enfant , une grosse voiture de sport et aussi une grosse moto . aussi de sport et aussi de compétition . devenir champion de tir à l arc , tir à la carabine , devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'd', u'avoir', u'une', u'belle', u'maison', u'\xe0', u'la', u'montagne'] +suite +et une au bord de la mer , avoir une femme un enfant , une grosse voiture de sport et aussi une grosse moto . aussi de sport et aussi de compétition . devenir champion de tir à l arc , tir à la carabine , devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'et', u'une', u'au', u'bord', u'de', u'la', u'mer', u',', u'avoir', u'une', u'femme', u'un', u'enfant'] +suite + une grosse voiture de sport et aussi une grosse moto . aussi de sport et aussi de compétition . devenir champion de tir à l arc , tir à la carabine , devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'une', u'grosse', u'voiture', u'de', u'sport', u'et', u'aussi', u'une', u'grosse', u'moto'] +suite + aussi de sport et aussi de compétition . devenir champion de tir à l arc , tir à la carabine , devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition'] +suite + devenir champion de tir à l arc , tir à la carabine , devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc'] +suite + tir à la carabine , devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'tir', u'\xe0', u'la', u'carabine'] +suite + devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre'] +suite + avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil'] +suite + enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires'] +suite + faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du'] +suite +monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res'] +suite + enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent'] +suite +les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'les', u'nappes', u'phr\xe9atiques'] +suite + enlever les centrales électriques .$ +reste +True +texte_uce +[u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'familiaux'] +suite + je pense ne pas me marier mais avoir des enfants , au moins deux enfants , vivre avec un homme soit en tant que mari , soit en tant que concubin . je ne réaliserai ces projets que dans douze ans , lorsque j aurai un métier sûr et une situation aisée . j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'je', u'pense', u'ne', u'pas', u'me', u'marier', u'mais', u'avoir', u'des', u'enfants'] +suite + au moins deux enfants , vivre avec un homme soit en tant que mari , soit en tant que concubin . je ne réaliserai ces projets que dans douze ans , lorsque j aurai un métier sûr et une situation aisée . j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'au', u'moins', u'deux', u'enfants'] +suite + vivre avec un homme soit en tant que mari , soit en tant que concubin . je ne réaliserai ces projets que dans douze ans , lorsque j aurai un métier sûr et une situation aisée . j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'vivre', u'avec', u'un', u'homme', u'soit', u'en', u'tant', u'que', u'mari'] +suite + soit en tant que concubin . je ne réaliserai ces projets que dans douze ans , lorsque j aurai un métier sûr et une situation aisée . j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'soit', u'en', u'tant', u'que', u'concubin'] +suite + je ne réaliserai ces projets que dans douze ans , lorsque j aurai un métier sûr et une situation aisée . j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'je', u'ne', u'r\xe9aliserai', u'ces', u'projets', u'que', u'dans', u'douze', u'ans'] +suite + lorsque j aurai un métier sûr et une situation aisée . j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'lorsque', u'j', u'aurai', u'un', u'm\xe9tier', u's\xfbr', u'et', u'une', u'situation', u'ais\xe9e'] +suite + j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an'] +suite + mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'mes', u'projets', u'professionnels'] +suite + il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans'] +suite + j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice'] +suite + rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus'] +suite +en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier'] +suite + trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9'] +suite + me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler'] +suite + je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'je', u'trouve', u'cela', u'passionnant'] +suite + j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'j', u'ai', u'choisi', u'ce', u'm\xe9tier'] +suite + car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire'] +suite + rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable'] +suite + bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0'] +suite + il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre'] +suite + cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'cela', u'me', u'fait', u'un', u'peu', u'peur'] +suite + mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0'] +suite +quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler'] +suite + à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler'] +suite +vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'vraiment', u'que', u'dans', u'dix', u'ans'] +suite + ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre'] +suite +société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent'] +suite +réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage'] +suite + donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes'] +suite +dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser'] +suite + changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'ce', u'que', u'je', u'veux', u'faire', u'comme', u'projet', u'depuis', u'toujours'] +suite + avoir un bon métier qui paie , ne pas avoir d enfants , ne pas me marier , avoir mon indépendance , avoir une super voiture , être biologiste , ça depuis l âge de quinze ans , aller depuis toujours en amérique , depuis toujours , aller en haut , ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'avoir', u'un', u'bon', u'm\xe9tier', u'qui', u'paie'] +suite + ne pas avoir d enfants , ne pas me marier , avoir mon indépendance , avoir une super voiture , être biologiste , ça depuis l âge de quinze ans , aller depuis toujours en amérique , depuis toujours , aller en haut , ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'ne', u'pas', u'avoir', u'd', u'enfants', u',', u'ne', u'pas', u'me', u'marier'] +suite + avoir mon indépendance , avoir une super voiture , être biologiste , ça depuis l âge de quinze ans , aller depuis toujours en amérique , depuis toujours , aller en haut , ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'avoir', u'mon', u'ind\xe9pendance', u',', u'avoir', u'une', u'super', u'voiture'] +suite + être biologiste , ça depuis l âge de quinze ans , aller depuis toujours en amérique , depuis toujours , aller en haut , ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'\xeatre', u'biologiste', u',', u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans'] +suite + aller depuis toujours en amérique , depuis toujours , aller en haut , ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique'] +suite + depuis toujours , aller en haut , ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'depuis', u'toujours', u',', u'aller', u'en', u'haut'] +suite + ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans'] +suite + depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones'] +suite +dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours'] +suite + avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de'] +suite +faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te'] +suite + depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'depuis', u'toujours'] +suite + avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois'] +suite + pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement'] +suite +réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'r\xe9ussir', u'des', u'projets'] +suite + il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus'] +suite +confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir'] +suite + cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat'] +suite + avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat'] +suite + car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours'] +suite +se le permettre$ +reste +True +texte_uce +[u'se', u'le', u'permettre'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'quatre', u'ou', u'trois', u'enfants'] +suite + mais en attendant , je veux arriver à mon bac professionnel , enfin continuer mes études , avoir un bon métier ? je veux en premier une bonne situation puis ensuite fonder une famille dans au moins neuf ans . ce qui faudrait changer pour que les jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'mais', u'en', u'attendant'] +suite + je veux arriver à mon bac professionnel , enfin continuer mes études , avoir un bon métier ? je veux en premier une bonne situation puis ensuite fonder une famille dans au moins neuf ans . ce qui faudrait changer pour que les jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'je', u'veux', u'arriver', u'\xe0', u'mon', u'bac', u'professionnel'] +suite + enfin continuer mes études , avoir un bon métier ? je veux en premier une bonne situation puis ensuite fonder une famille dans au moins neuf ans . ce qui faudrait changer pour que les jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'enfin', u'continuer', u'mes', u'\xe9tudes', u',', u'avoir', u'un', u'bon', u'm\xe9tier'] +suite + je veux en premier une bonne situation puis ensuite fonder une famille dans au moins neuf ans . ce qui faudrait changer pour que les jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'je', u'veux', u'en', u'premier', u'une', u'bonne', u'situation'] +suite +puis ensuite fonder une famille dans au moins neuf ans . ce qui faudrait changer pour que les jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'puis', u'ensuite', u'fonder', u'une', u'famille', u'dans', u'au', u'moins', u'neuf', u'ans'] +suite + ce qui faudrait changer pour que les jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les'] +suite +jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets'] +suite +sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures'] +suite + maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage'] +suite + il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel'] +suite + je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi'] +suite + je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment'] +suite +que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'que', u'mes', u'parents'] +suite + je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai'] +suite +entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'enti\xe8rement', u'confiance'] +suite + fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e'] +suite + mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine'] +suite + aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire'] +suite + monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'monitrice', u'et', u'\xe9ducatrice'] +suite + ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non'] +suite + mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis'] +suite + car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi'] +suite +ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'ce', u'moque', u'du', u'mien'] +suite + dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re'] +suite + dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines'] +suite + mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'mariage', u'dans', u'dix', u',', u'quinze', u'ans'] +suite + la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re'] +suite +dans quarante ans$ +reste +True +texte_uce +[u'dans', u'quarante', u'ans'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'concubinage', u'avec', u'des', u'gens', u'c\xe9l\xe8bre'] +suite + avoir une voiture de sport , plusieurs villas , avec mes associés on enquêteraient sur les vols , je veux vivre dans une île désertes avec plein de mecs .$ +reste +True +texte_uce +[u'avoir', u'une', u'voiture', u'de', u'sport', u',', u'plusieurs', u'villas'] +suite + avec mes associés on enquêteraient sur les vols , je veux vivre dans une île désertes avec plein de mecs .$ +reste +True +texte_uce +[u'avec', u'mes', u'associ\xe9s', u'on', u'enqu\xeateraient', u'sur', u'les', u'vols'] +suite + je veux vivre dans une île désertes avec plein de mecs .$ +reste +True +texte_uce +[u'je', u'veux', u'vivre', u'dans', u'une', u'\xeele', u'd\xe9sertes', u'avec'] +suite +plein de mecs .$ +reste +True +texte_uce +[u'plein', u'de', u'mecs', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u'j', u'aimerai', u'rentrer', u'au'] +suite +lycée pour continuer mes études , faire de l électronique , après si je réussi ces premières études je compte continuer encore deux ans dans l informatique , être technicien supérieur . il n y a pas longtemps que j ai décidé cela , l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'lyc\xe9e', u'pour', u'continuer', u'mes', u'\xe9tudes'] +suite + faire de l électronique , après si je réussi ces premières études je compte continuer encore deux ans dans l informatique , être technicien supérieur . il n y a pas longtemps que j ai décidé cela , l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'faire', u'de', u'l', u'\xe9lectronique'] +suite + après si je réussi ces premières études je compte continuer encore deux ans dans l informatique , être technicien supérieur . il n y a pas longtemps que j ai décidé cela , l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'apr\xe8s', u'si', u'je', u'r\xe9ussi', u'ces', u'premi\xe8res', u'\xe9tudes'] +suite +je compte continuer encore deux ans dans l informatique , être technicien supérieur . il n y a pas longtemps que j ai décidé cela , l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'je', u'compte', u'continuer', u'encore', u'deux', u'ans', u'dans'] +suite +l informatique , être technicien supérieur . il n y a pas longtemps que j ai décidé cela , l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'l', u'informatique', u',', u'\xeatre', u'technicien', u'sup\xe9rieur'] +suite + il n y a pas longtemps que j ai décidé cela , l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'il', u'n', u'y', u'a', u'pas', u'longtemps', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'cela'] +suite + l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'l', u'ann\xe9e', u'derni\xe8re'] +suite + je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire'] +suite + en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur'] +suite +car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel'] +suite + ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le'] +suite +cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires'] +suite + comme je l ai déjà dit .$ +reste +True +texte_uce +[u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'continuer', u'mes', u'\xe9tudes'] +suite + mais pas trop longtemps , je veux passer mon brevet , et ensuite voir du coté d une formation technique , un truc de mécanicien , enfin des études pas longues . ma vie sentimentale , je pense me marier , après mes études , après avoir une super maison et aussi une ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'mais', u'pas', u'trop', u'longtemps', u',', u'je', u'veux', u'passer', u'mon', u'brevet'] +suite + et ensuite voir du coté d une formation technique , un truc de mécanicien , enfin des études pas longues . ma vie sentimentale , je pense me marier , après mes études , après avoir une super maison et aussi une ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'et', u'ensuite', u'voir', u'du', u'cot\xe9', u'd', u'une', u'formation', u'technique'] +suite + un truc de mécanicien , enfin des études pas longues . ma vie sentimentale , je pense me marier , après mes études , après avoir une super maison et aussi une ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'un', u'truc', u'de', u'm\xe9canicien', u',', u'enfin', u'des', u'\xe9tudes', u'pas', u'longues'] +suite + ma vie sentimentale , je pense me marier , après mes études , après avoir une super maison et aussi une ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier'] +suite + après mes études , après avoir une super maison et aussi une ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'apr\xe8s', u'mes', u'\xe9tudes'] +suite + après avoir une super maison et aussi une ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une'] +suite +ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'ou', u'plein', u'de', u'voitures'] +suite + je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'je', u'suis', u'ceinture', u'noire', u'de', u'judo'] +suite + et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du'] +suite +temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'temps', u'pour', u'la', u'comp\xe9tition'] +suite + dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours'] +suite +à des enfants$ +reste +True +texte_uce +[u'\xe0', u'des', u'enfants'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi'] +suite + je voudrais bien continuer un petit peu mes études , mais pas trop longtemps , je ne suis pas très bon à l école , enfin je ne sais pas trop ce que je vais faire au niveau professionnel , parce_que à l école je ne suis pas bon . au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'continuer', u'un', u'petit', u'peu', u'mes', u'\xe9tudes'] +suite + mais pas trop longtemps , je ne suis pas très bon à l école , enfin je ne sais pas trop ce que je vais faire au niveau professionnel , parce_que à l école je ne suis pas bon . au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'mais', u'pas', u'trop', u'longtemps'] +suite + je ne suis pas très bon à l école , enfin je ne sais pas trop ce que je vais faire au niveau professionnel , parce_que à l école je ne suis pas bon . au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'je', u'ne', u'suis', u'pas', u'tr\xe8s', u'bon', u'\xe0', u'l', u'\xe9cole'] +suite + enfin je ne sais pas trop ce que je vais faire au niveau professionnel , parce_que à l école je ne suis pas bon . au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'enfin', u'je', u'ne', u'sais', u'pas', u'trop', u'ce', u'que', u'je', u'vais'] +suite +faire au niveau professionnel , parce_que à l école je ne suis pas bon . au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'faire', u'au', u'niveau', u'professionnel'] +suite + parce_que à l école je ne suis pas bon . au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'parce_que', u'\xe0', u'l', u'\xe9cole', u'je', u'ne', u'suis', u'pas', u'bon'] +suite + au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'au', u'niveau', u'sentimental'] +suite + je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum'] +suite + bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'bien', u'plus', u'tard', u'bien', u'plus', u'tard'] +suite + peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier'] +suite + ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'ou', u'vivre', u'en', u'concubin'] +suite + enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine'] +suite + je voudrais bien rentrer en seconde , et puis continuer mes études , rentrer à la faculté , ou bien dans une formation plus technique , enfin le minimum c est d avoir mon baccalauréat , c est mon premier projet , pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'rentrer', u'en', u'seconde'] +suite + et puis continuer mes études , rentrer à la faculté , ou bien dans une formation plus technique , enfin le minimum c est d avoir mon baccalauréat , c est mon premier projet , pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'et', u'puis', u'continuer', u'mes', u'\xe9tudes'] +suite + rentrer à la faculté , ou bien dans une formation plus technique , enfin le minimum c est d avoir mon baccalauréat , c est mon premier projet , pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'rentrer', u'\xe0', u'la', u'facult\xe9'] +suite + ou bien dans une formation plus technique , enfin le minimum c est d avoir mon baccalauréat , c est mon premier projet , pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'ou', u'bien', u'dans', u'une', u'formation', u'plus', u'technique'] +suite + enfin le minimum c est d avoir mon baccalauréat , c est mon premier projet , pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'enfin', u'le', u'minimum', u'c', u'est', u'd', u'avoir', u'mon', u'baccalaur\xe9at'] +suite + c est mon premier projet , pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'c', u'est', u'mon', u'premier', u'projet'] +suite + pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'pour', u'le', u'choix', u'professionnel'] +suite + j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider'] +suite + niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'niveau', u'sentimental'] +suite + je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y'] +suite +voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'voir', u'bien', u'clair'] +suite + je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'je', u'pense', u'certainement', u'fonder', u'une', u'famille'] +suite + mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s'] +suite +avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier'] +suite + pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple'] +suite + ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas'] +suite + je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour'] +suite +les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune'] +suite + avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine'] +suite + je compte rentrer au lycée pour préparer un bac technique , après je compte faire une formation technique , mais je ne sais pas encore vraiment ce que je veux faire , je suis assez bon dans la mécanique , certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'je', u'compte', u'rentrer', u'au', u'lyc\xe9e', u'pour', u'pr\xe9parer'] +suite +un bac technique , après je compte faire une formation technique , mais je ne sais pas encore vraiment ce que je veux faire , je suis assez bon dans la mécanique , certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'un', u'bac', u'technique'] +suite + après je compte faire une formation technique , mais je ne sais pas encore vraiment ce que je veux faire , je suis assez bon dans la mécanique , certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'compte', u'faire', u'une', u'formation', u'technique'] +suite + mais je ne sais pas encore vraiment ce que je veux faire , je suis assez bon dans la mécanique , certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'mais', u'je', u'ne', u'sais', u'pas', u'encore', u'vraiment', u'ce'] +suite +que je veux faire , je suis assez bon dans la mécanique , certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'que', u'je', u'veux', u'faire'] +suite + je suis assez bon dans la mécanique , certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'je', u'suis', u'assez', u'bon', u'dans', u'la', u'm\xe9canique'] +suite + certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'certainement', u'que', u'je', u'vais', u'essayer', u'de'] +suite +travailler de ce coté$ +reste +True +texte_uce +[u'travailler', u'de', u'ce', u'cot\xe9'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'au', u'niveau', u'professionnel'] +suite + le minimum pour l instant c est de passer mon brevet , en cas de réussite , et je pense que ça va marcher , continuer au lycée . je voudrais bien devenir professeur de mathématique ou de gymnastique , enfin un truc dans ce style , ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'le', u'minimum', u'pour', u'l', u'instant', u'c', u'est', u'de', u'passer', u'mon', u'brevet'] +suite + en cas de réussite , et je pense que ça va marcher , continuer au lycée . je voudrais bien devenir professeur de mathématique ou de gymnastique , enfin un truc dans ce style , ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'en', u'cas', u'de', u'r\xe9ussite', u',', u'et', u'je', u'pense', u'que', u'\xe7a', u'va', u'marcher'] +suite + continuer au lycée . je voudrais bien devenir professeur de mathématique ou de gymnastique , enfin un truc dans ce style , ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'continuer', u'au', u'lyc\xe9e'] +suite + je voudrais bien devenir professeur de mathématique ou de gymnastique , enfin un truc dans ce style , ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'devenir', u'professeur', u'de'] +suite +mathématique ou de gymnastique , enfin un truc dans ce style , ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'math\xe9matique', u'ou', u'de', u'gymnastique'] +suite + enfin un truc dans ce style , ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'enfin', u'un', u'truc', u'dans', u'ce', u'style'] +suite + ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport'] +suite + niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'niveau', u'sentimental'] +suite + je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser'] +suite + je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille'] +suite + avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances'] +suite + c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir'] +suite + après ça tourne au délire$ +reste +True +texte_uce +[u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'vivre', u'loin', u'de', u'la', u'ville', u'dans'] +suite +une île déserte , avec de super appareils de musique , et une image grand écran en direct du festival , rien que musique et image , je veux pas m inscrire dans la profession après t as envie d une famille , d une voiture , et puis tu arrêtes pas d avoir envie de ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'une', u'\xeele', u'd\xe9serte', u',', u'avec', u'de', u'super', u'appareils', u'de', u'musique'] +suite + et une image grand écran en direct du festival , rien que musique et image , je veux pas m inscrire dans la profession après t as envie d une famille , d une voiture , et puis tu arrêtes pas d avoir envie de ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'et', u'une', u'image', u'grand', u'\xe9cran', u'en', u'direct', u'du', u'festival'] +suite + rien que musique et image , je veux pas m inscrire dans la profession après t as envie d une famille , d une voiture , et puis tu arrêtes pas d avoir envie de ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'rien', u'que', u'musique', u'et', u'image'] +suite + je veux pas m inscrire dans la profession après t as envie d une famille , d une voiture , et puis tu arrêtes pas d avoir envie de ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession'] +suite +après t as envie d une famille , d une voiture , et puis tu arrêtes pas d avoir envie de ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille', u',', u'd', u'une', u'voiture'] +suite + et puis tu arrêtes pas d avoir envie de ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de'] +suite +ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'ceci', u'ou', u'de', u'cela'] +suite + coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets'] +suite + je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec'] +suite +la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon'] +suite + au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l'] +suite +histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'histoire', u'est', u'class\xe9e'] +suite + loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques'] +suite +et de la gente humaine$ +reste +True +texte_uce +[u'et', u'de', u'la', u'gente', u'humaine'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'au', u'moins', u'des', u'enfants'] +suite + mais en attendant , je veux arriver à une profession par rapport au baccalauréat technique que je veux passer , en premier , une bonne situation , et après fonder une famille , ça il me faudra bien une dizaine d années . ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'mais', u'en', u'attendant'] +suite + je veux arriver à une profession par rapport au baccalauréat technique que je veux passer , en premier , une bonne situation , et après fonder une famille , ça il me faudra bien une dizaine d années . ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'je', u'veux', u'arriver', u'\xe0', u'une', u'profession', u'par'] +suite +rapport au baccalauréat technique que je veux passer , en premier , une bonne situation , et après fonder une famille , ça il me faudra bien une dizaine d années . ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'rapport', u'au', u'baccalaur\xe9at', u'technique', u'que', u'je', u'veux', u'passer'] +suite + en premier , une bonne situation , et après fonder une famille , ça il me faudra bien une dizaine d années . ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'en', u'premier', u',', u'une', u'bonne', u'situation'] +suite + et après fonder une famille , ça il me faudra bien une dizaine d années . ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'et', u'apr\xe8s', u'fonder', u'une', u'famille'] +suite + ça il me faudra bien une dizaine d années . ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'\xe7a', u'il', u'me', u'faudra', u'bien', u'une', u'dizaine', u'd', u'ann\xe9es'] +suite + ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'ce', u'qui', u'est', u'difficile'] +suite + c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident'] +suite + sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre'] +suite +avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'avec', u'des', u'copines', u'et', u'm', u'amuser'] +suite + ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9'] +suite + après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier'] +suite + après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je'] +suite +suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'suis', u'grand_m\xe8re'] +suite + je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'je', u'veux', u'travailler', u'dans', u'le', u'social'] +suite + être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re'] +suite + ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'familiale', u',', u'je', u'pense', u'pas', u'que', u'je', u'vais', u'me', u'marier'] +suite + mais je veux tout de même avoir des enfants et puis vivre avec un homme , mais je veux garder mon indépendance , ça fait un an que je pense à tout ça , mais d_abord il faut penser avoir un métier . ça fait deux ans que j ai décidé d être dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'mais', u'je', u'veux', u'tout', u'de', u'm\xeame', u'avoir', u'des', u'enfants'] +suite +et puis vivre avec un homme , mais je veux garder mon indépendance , ça fait un an que je pense à tout ça , mais d_abord il faut penser avoir un métier . ça fait deux ans que j ai décidé d être dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'et', u'puis', u'vivre', u'avec', u'un', u'homme'] +suite + mais je veux garder mon indépendance , ça fait un an que je pense à tout ça , mais d_abord il faut penser avoir un métier . ça fait deux ans que j ai décidé d être dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'mais', u'je', u'veux', u'garder', u'mon', u'ind\xe9pendance'] +suite + ça fait un an que je pense à tout ça , mais d_abord il faut penser avoir un métier . ça fait deux ans que j ai décidé d être dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'pense', u'\xe0', u'tout', u'\xe7a'] +suite + mais d_abord il faut penser avoir un métier . ça fait deux ans que j ai décidé d être dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier'] +suite + ça fait deux ans que j ai décidé d être dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre'] +suite +dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'dessinatrice', u'de', u'mode'] +suite + travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'travailler', u'dans', u'la', u'conception', u'des', u'grands'] +suite +noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'noms', u'de', u'la', u'mode'] +suite + j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement'] +suite + l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection'] +suite + car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut'] +suite + mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup'] +suite + dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's'] +suite +améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets'] +suite + il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'compte', u'surtout', u'avoir', u'mon', u'ind\xe9pendance'] +suite + pour ça il y a pas de mystère , il faut que je travaille par rapport aux études , passer mon brevet , ensuite aller jusqu_à la terminale et préparer une formation technique , je pense à l informatique , pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'pour', u'\xe7a', u'il', u'y', u'a', u'pas', u'de', u'myst\xe8re'] +suite + il faut que je travaille par rapport aux études , passer mon brevet , ensuite aller jusqu_à la terminale et préparer une formation technique , je pense à l informatique , pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'il', u'faut', u'que', u'je', u'travaille', u'par', u'rapport', u'aux', u'\xe9tudes'] +suite + passer mon brevet , ensuite aller jusqu_à la terminale et préparer une formation technique , je pense à l informatique , pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'passer', u'mon', u'brevet'] +suite + ensuite aller jusqu_à la terminale et préparer une formation technique , je pense à l informatique , pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'ensuite', u'aller', u'jusqu_\xe0', u'la', u'terminale', u'et'] +suite +préparer une formation technique , je pense à l informatique , pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'pr\xe9parer', u'une', u'formation', u'technique'] +suite + je pense à l informatique , pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'je', u'pense', u'\xe0', u'l', u'informatique'] +suite + pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage'] +suite + l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon'] +suite +indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'ind\xe9pendance', u'mat\xe9rielle'] +suite + niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'niveau', u'sentimental'] +suite + surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation'] +suite + sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'sinon', u'vivre', u'avec', u'un', u'homme'] +suite + il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets'] +suite + pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille'] +suite +dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me'] +suite + c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas'] +suite +trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'trop', u'\xe0', u'comprendre', u'le', u'monde'] +suite + mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants'] +suite + je compte me consacrer entièrement à ma famille , à mes enfants et à mon mari , je veux pouvoir l aider dans son travail , travailler avec lui , et l aider dans son travail pour qu il ait plus de temps pour sa famille , en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'je', u'compte', u'me', u'consacrer', u'enti\xe8rement', u'\xe0', u'ma', u'famille'] +suite + à mes enfants et à mon mari , je veux pouvoir l aider dans son travail , travailler avec lui , et l aider dans son travail pour qu il ait plus de temps pour sa famille , en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'\xe0', u'mes', u'enfants', u'et', u'\xe0', u'mon', u'mari'] +suite + je veux pouvoir l aider dans son travail , travailler avec lui , et l aider dans son travail pour qu il ait plus de temps pour sa famille , en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'je', u'veux', u'pouvoir', u'l', u'aider', u'dans', u'son', u'travail'] +suite + travailler avec lui , et l aider dans son travail pour qu il ait plus de temps pour sa famille , en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'travailler', u'avec', u'lui'] +suite + et l aider dans son travail pour qu il ait plus de temps pour sa famille , en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il'] +suite +ait plus de temps pour sa famille , en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille'] +suite + en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie'] +suite + je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'je', u'pr\xe9parerai', u'un', u'm\xe9tier'] +suite + qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants'] +suite + travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait'] +suite + je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je'] +suite +fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re'] +suite + j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon'] +suite +point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison'] +suite + et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants'] +suite + j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager'] +suite + mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide'] +suite + surtout si on veut des enfants .$ +reste +True +texte_uce +[u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u',', u'je', u'compte', u'devenir', u'officier', u'de', u'la', u'paix'] +suite + j aurais voulu devenir sportif , plus particulièrement dans le football , mais devenir flic , c est plus passionnant . dans cinq ans , je compte me marier avec une femme brune qui aura de beaux yeux , il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'j', u'aurais', u'voulu', u'devenir', u'sportif'] +suite + plus particulièrement dans le football , mais devenir flic , c est plus passionnant . dans cinq ans , je compte me marier avec une femme brune qui aura de beaux yeux , il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'plus', u'particuli\xe8rement', u'dans', u'le', u'football'] +suite + mais devenir flic , c est plus passionnant . dans cinq ans , je compte me marier avec une femme brune qui aura de beaux yeux , il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'mais', u'devenir', u'flic', u',', u'c', u'est', u'plus', u'passionnant'] +suite + dans cinq ans , je compte me marier avec une femme brune qui aura de beaux yeux , il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'dans', u'cinq', u'ans'] +suite + je compte me marier avec une femme brune qui aura de beaux yeux , il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'je', u'compte', u'me', u'marier', u'avec', u'une', u'femme', u'brune'] +suite +qui aura de beaux yeux , il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'qui', u'aura', u'de', u'beaux', u'yeux'] +suite + il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et'] +suite +belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'belle', u'physiquement', u',', u'et', u'mignonne', u'de', u't\xeate'] +suite + avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants'] +suite + deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able'] +suite + offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme'] +suite + et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille'] +suite + je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'travail'] +suite + le faire pendant deux ans , puis avoir un accident du travail pour toucher de l argent tranquillement . je veux me marier cinq fois , avoir une maison secondaire une masse de voitures , rentrer dans la politique pour dormir , avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'le', u'faire', u'pendant', u'deux', u'ans'] +suite + puis avoir un accident du travail pour toucher de l argent tranquillement . je veux me marier cinq fois , avoir une maison secondaire une masse de voitures , rentrer dans la politique pour dormir , avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'puis', u'avoir', u'un', u'accident', u'du', u'travail', u'pour'] +suite +toucher de l argent tranquillement . je veux me marier cinq fois , avoir une maison secondaire une masse de voitures , rentrer dans la politique pour dormir , avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'toucher', u'de', u'l', u'argent', u'tranquillement'] +suite + je veux me marier cinq fois , avoir une maison secondaire une masse de voitures , rentrer dans la politique pour dormir , avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'cinq', u'fois'] +suite + avoir une maison secondaire une masse de voitures , rentrer dans la politique pour dormir , avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures'] +suite + rentrer dans la politique pour dormir , avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir'] +suite + avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes'] +suite + et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail'] +suite + tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir'] +suite +vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avec', u'une', u'jolie', u'femme', u'qui'] +suite +soit aimable , faire du sport de temps en temps , je veux faire professeur de mathématiques , quelque chose qui se rapproche de cela , avoir de bonnes relations avec mes parents , rester avec eux le plus de temps possible . il faut que les jeunes puissent plus s exprimer$ +reste +True +texte_uce +[u'soit', u'aimable', u',', u'faire', u'du', u'sport', u'de', u'temps', u'en', u'temps'] +suite + je veux faire professeur de mathématiques , quelque chose qui se rapproche de cela , avoir de bonnes relations avec mes parents , rester avec eux le plus de temps possible . il faut que les jeunes puissent plus s exprimer$ +reste +True +texte_uce +[u'je', u'veux', u'faire', u'professeur', u'de', u'math\xe9matiques'] +suite + quelque chose qui se rapproche de cela , avoir de bonnes relations avec mes parents , rester avec eux le plus de temps possible . il faut que les jeunes puissent plus s exprimer$ +reste +True +texte_uce +[u'quelque', u'chose', u'qui', u'se', u'rapproche', u'de', u'cela'] +suite + avoir de bonnes relations avec mes parents , rester avec eux le plus de temps possible . il faut que les jeunes puissent plus s exprimer$ +reste +True +texte_uce +[u'avoir', u'de', u'bonnes', u'relations', u'avec', u'mes', u'parents'] +suite + rester avec eux le plus de temps possible . il faut que les jeunes puissent plus s exprimer$ +reste +True +texte_uce +[u'rester', u'avec', u'eux', u'le', u'plus', u'de', u'temps', u'possible'] +suite + il faut que les jeunes puissent plus s exprimer$ +reste +True +texte_uce +[u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'faire', u'des', u'voyages', u',', u'voir', u'beaucoup', u'de', u'monde'] +suite + faire des choses uniques dans tous les domaines , ne pas faire comme tout le monde , laisser quelque chose derrière moi , j aimerais faire un métier qui serve à quelque chose , certains de mes projets sont réalisables maintenant , ne pas rester toute ma vie dans une cage à lapin , ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'faire', u'des', u'choses', u'uniques', u'dans', u'tous', u'les', u'domaines'] +suite + ne pas faire comme tout le monde , laisser quelque chose derrière moi , j aimerais faire un métier qui serve à quelque chose , certains de mes projets sont réalisables maintenant , ne pas rester toute ma vie dans une cage à lapin , ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'ne', u'pas', u'faire', u'comme', u'tout', u'le', u'monde'] +suite + laisser quelque chose derrière moi , j aimerais faire un métier qui serve à quelque chose , certains de mes projets sont réalisables maintenant , ne pas rester toute ma vie dans une cage à lapin , ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'laisser', u'quelque', u'chose', u'derri\xe8re', u'moi'] +suite + j aimerais faire un métier qui serve à quelque chose , certains de mes projets sont réalisables maintenant , ne pas rester toute ma vie dans une cage à lapin , ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'j', u'aimerais', u'faire', u'un', u'm\xe9tier', u'qui', u'serve', u'\xe0', u'quelque', u'chose'] +suite + certains de mes projets sont réalisables maintenant , ne pas rester toute ma vie dans une cage à lapin , ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant'] +suite + ne pas rester toute ma vie dans une cage à lapin , ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin'] +suite + ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter'] +suite +uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame'] +suite +si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent'] +suite + ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres'] +suite + ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'tout', u'd_abord', u'avoir', u'une', u'bonne'] +suite +situation professionnel et stable , je voudrais aussi vivre avec ma mère , car mes parents sont divorcés , et je vis avec mon père , j aimerais faire un travail avec des jeunes enfants , dans ma vie sentimentale , je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'situation', u'professionnel', u'et', u'stable'] +suite + je voudrais aussi vivre avec ma mère , car mes parents sont divorcés , et je vis avec mon père , j aimerais faire un travail avec des jeunes enfants , dans ma vie sentimentale , je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'je', u'voudrais', u'aussi', u'vivre', u'avec', u'ma', u'm\xe8re'] +suite + car mes parents sont divorcés , et je vis avec mon père , j aimerais faire un travail avec des jeunes enfants , dans ma vie sentimentale , je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'car', u'mes', u'parents', u'sont', u'divorc\xe9s'] +suite + et je vis avec mon père , j aimerais faire un travail avec des jeunes enfants , dans ma vie sentimentale , je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'et', u'je', u'vis', u'avec', u'mon', u'p\xe8re'] +suite + j aimerais faire un travail avec des jeunes enfants , dans ma vie sentimentale , je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'j', u'aimerais', u'faire', u'un', u'travail', u'avec', u'des', u'jeunes', u'enfants'] +suite + dans ma vie sentimentale , je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'dans', u'ma', u'vie', u'sentimentale'] +suite + je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas'] +suite +jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage'] +suite + je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les'] +suite +études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en'] +suite +s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u's', u'en', u'pas', u'capable'] +suite + les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets'] +suite +à n importe quel âge$ +reste +True +texte_uce +[u'\xe0', u'n', u'importe', u'quel', u'\xe2ge'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'rester', u'c\xe9libataire', u'et', u'vivre', u'en', u'concubinage'] +suite + je ne veux pas d enfants car pour moi c est une contrainte , je veux au niveau professionnel devenir kinésithérapeute , car c est un milieu où on a le contact avec le milieu sportif , je veux me rendre utile , c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'd', u'enfants', u'car', u'pour', u'moi', u'c'] +suite +est une contrainte , je veux au niveau professionnel devenir kinésithérapeute , car c est un milieu où on a le contact avec le milieu sportif , je veux me rendre utile , c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'est', u'une', u'contrainte'] +suite + je veux au niveau professionnel devenir kinésithérapeute , car c est un milieu où on a le contact avec le milieu sportif , je veux me rendre utile , c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'je', u'veux', u'au', u'niveau', u'professionnel', u'devenir'] +suite +kinésithérapeute , car c est un milieu où on a le contact avec le milieu sportif , je veux me rendre utile , c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'kin\xe9sith\xe9rapeute'] +suite + car c est un milieu où on a le contact avec le milieu sportif , je veux me rendre utile , c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'car', u'c', u'est', u'un', u'milieu', u'o\xf9', u'on', u'a', u'le', u'contact'] +suite +avec le milieu sportif , je veux me rendre utile , c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'avec', u'le', u'milieu', u'sportif', u',', u'je', u'veux', u'me', u'rendre', u'utile'] +suite + c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir'] +suite + il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'il', u'faut', u'\xeatre', u'solide'] +suite + car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame'] +suite + sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir'] +suite +journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football'] +suite + je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'je', u'veux', u'informer', u',', u'\xeatre', u'utile'] +suite + ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un'] +suite +bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre'] +suite +commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'commande', u'par', u'un', u'sup\xe9rieur'] +suite + je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'est', u'pas', u'de', u'projet', u'de', u'vie'] +suite + je verrai bien ce que me réserve le cours de la vie , avant de penser à tout cela , il faut que je profite de la vie$ +reste +True +texte_uce +[u'je', u'verrai', u'bien', u'ce', u'que', u'me', u'r\xe9serve', u'le', u'cours', u'de', u'la', u'vie'] +suite + avant de penser à tout cela , il faut que je profite de la vie$ +reste +True +texte_uce +[u'avant', u'de', u'penser', u'\xe0', u'tout', u'cela'] +suite + il faut que je profite de la vie$ +reste +True +texte_uce +[u'il', u'faut', u'que', u'je', u'profite', u'de', u'la', u'vie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'passer', u'mon', u'bac', u'et', u'r\xe9ussir', u'dans', u'le'] +suite +domaine artistique$ +reste +True +texte_uce +[u'domaine', u'artistique'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'vais', u'essayer', u'd', u'avoir', u'mon', u'brevet'] +suite + après je passe le concours de la gendarmerie , et le concours à l armée , je veux réussir dans le domaine sportif .$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'passe', u'le', u'concours', u'de', u'la', u'gendarmerie'] +suite + et le concours à l armée , je veux réussir dans le domaine sportif .$ +reste +True +texte_uce +[u'et', u'le', u'concours', u'\xe0', u'l', u'arm\xe9e'] +suite + je veux réussir dans le domaine sportif .$ +reste +True +texte_uce +[u'je', u'veux', u'r\xe9ussir', u'dans', u'le', u'domaine', u'sportif', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'devenir', u'v\xe9t\xe9rinaire', u',', u'j', u'y', u'pense', u'depuis', u'six', u'ans'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'sur', u'le', u'plan', u'familial'] +suite + je veux rester célibataire le plus longtemps possible , éventuellement avoir des enfants mais dans vingt ans , je veux avoir un boulot intéressant , pratiquer un sport régulièrement , je n ai jamais eu l intention d avoir des enfants , et ça fait deux ans que j ai décidé de ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'je', u'veux', u'rester', u'c\xe9libataire', u'le', u'plus', u'longtemps', u'possible'] +suite + éventuellement avoir des enfants mais dans vingt ans , je veux avoir un boulot intéressant , pratiquer un sport régulièrement , je n ai jamais eu l intention d avoir des enfants , et ça fait deux ans que j ai décidé de ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'\xe9ventuellement', u'avoir', u'des', u'enfants', u'mais', u'dans', u'vingt', u'ans'] +suite + je veux avoir un boulot intéressant , pratiquer un sport régulièrement , je n ai jamais eu l intention d avoir des enfants , et ça fait deux ans que j ai décidé de ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'un', u'boulot', u'int\xe9ressant'] +suite + pratiquer un sport régulièrement , je n ai jamais eu l intention d avoir des enfants , et ça fait deux ans que j ai décidé de ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'pratiquer', u'un', u'sport', u'r\xe9guli\xe8rement'] +suite + je n ai jamais eu l intention d avoir des enfants , et ça fait deux ans que j ai décidé de ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'je', u'n', u'ai', u'jamais', u'eu', u'l', u'intention', u'd', u'avoir', u'des', u'enfants'] +suite + et ça fait deux ans que j ai décidé de ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de'] +suite +ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'quand', u'j', u'aurai', u'trouver', u'l', u'homme', u'id\xe9al'] +suite + je veux me marier avoir des enfants et une belle maison , je voudrais travailler dans le professionnel de la publicité , le dessin , mais je n ai pas de bons résultats , depuis que je suis petite je rêve d avoir une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avoir', u'des', u'enfants', u'et'] +suite +une belle maison , je voudrais travailler dans le professionnel de la publicité , le dessin , mais je n ai pas de bons résultats , depuis que je suis petite je rêve d avoir une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'une', u'belle', u'maison'] +suite + je voudrais travailler dans le professionnel de la publicité , le dessin , mais je n ai pas de bons résultats , depuis que je suis petite je rêve d avoir une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'je', u'voudrais', u'travailler', u'dans', u'le', u'professionnel'] +suite +de la publicité , le dessin , mais je n ai pas de bons résultats , depuis que je suis petite je rêve d avoir une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'de', u'la', u'publicit\xe9', u',', u'le', u'dessin'] +suite + mais je n ai pas de bons résultats , depuis que je suis petite je rêve d avoir une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'mais', u'je', u'n', u'ai', u'pas', u'de', u'bons', u'r\xe9sultats'] +suite + depuis que je suis petite je rêve d avoir une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir'] +suite +une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'une', u'voiture', u'et', u'une', u'belle', u'maison'] +suite + mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait'] +suite +travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'travailler', u'pour', u'cela'] +suite + maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en'] +suite +travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9'] +suite + je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants'] +suite +dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans'] +suite + avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et'] +suite +après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'apr\xe8s', u'acheter', u'une', u'maison'] +suite + je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re'] +suite + pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets'] +suite + il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'mon', u'baccalaur\xe9at', u'avoir', u'un', u'bon', u'm\xe9tier'] +suite + continuer le patinage , vivre heureuse , être heureuse , tout ça dans une dizaine d années$ +reste +True +texte_uce +[u'continuer', u'le', u'patinage', u',', u'vivre', u'heureuse'] +suite + être heureuse , tout ça dans une dizaine d années$ +reste +True +texte_uce +[u'\xeatre', u'heureuse', u',', u'tout', u'\xe7a', u'dans', u'une', u'dizaine', u'd', u'ann\xe9es'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'un', u'bon', u'brevet'] +suite + pas de différence entre le beau et le laid , pas de différence entre les filles et les garçons et que les gens ne jugent pas , je ne sais pas je voudrais qu il n y ait pas de guerre et que des enfants meurent à cause de la connerie des adultes , ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'pas', u'de', u'diff\xe9rence', u'entre', u'le', u'beau', u'et', u'le', u'laid'] +suite + pas de différence entre les filles et les garçons et que les gens ne jugent pas , je ne sais pas je voudrais qu il n y ait pas de guerre et que des enfants meurent à cause de la connerie des adultes , ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'pas', u'de', u'diff\xe9rence', u'entre', u'les', u'filles', u'et', u'les'] +suite +garçons et que les gens ne jugent pas , je ne sais pas je voudrais qu il n y ait pas de guerre et que des enfants meurent à cause de la connerie des adultes , ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'gar\xe7ons', u'et', u'que', u'les', u'gens', u'ne', u'jugent', u'pas'] +suite + je ne sais pas je voudrais qu il n y ait pas de guerre et que des enfants meurent à cause de la connerie des adultes , ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'je', u'ne', u'sais', u'pas', u'je', u'voudrais', u'qu', u'il', u'n', u'y', u'ait'] +suite +pas de guerre et que des enfants meurent à cause de la connerie des adultes , ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent'] +suite +à cause de la connerie des adultes , ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes'] +suite + ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants'] +suite +innocents qui se font tuer$ +reste +True +texte_uce +[u'innocents', u'qui', u'se', u'font', u'tuer'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'dix', u'ans', u'que', u'je', u'pense', u'continuer', u'mes'] +suite +études pour pouvoir avoir une bonne place dans mon pays , un meilleur salaire , ce projet , me prendra bien dix ans car je veux faire un cycle long il me faut du courage , de la persévérance et de l intelligence , je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'\xe9tudes', u'pour', u'pouvoir', u'avoir', u'une', u'bonne', u'place'] +suite +dans mon pays , un meilleur salaire , ce projet , me prendra bien dix ans car je veux faire un cycle long il me faut du courage , de la persévérance et de l intelligence , je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'dans', u'mon', u'pays', u',', u'un', u'meilleur', u'salaire'] +suite + ce projet , me prendra bien dix ans car je veux faire un cycle long il me faut du courage , de la persévérance et de l intelligence , je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'ce', u'projet'] +suite + me prendra bien dix ans car je veux faire un cycle long il me faut du courage , de la persévérance et de l intelligence , je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'me', u'prendra', u'bien', u'dix', u'ans', u'car', u'je', u'veux', u'faire'] +suite +un cycle long il me faut du courage , de la persévérance et de l intelligence , je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'un', u'cycle', u'long', u'il', u'me', u'faut', u'du', u'courage'] +suite + de la persévérance et de l intelligence , je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence'] +suite + je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des'] +suite +meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'meilleures', u'conditions', u'de', u'vie'] +suite + les études sont longues et difficiles$ +reste +True +texte_uce +[u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'm\xe9tier', u'bien', u',', u'arriver', u'\xe0', u'bien', u'nager'] +suite + mes projets sont réalisables car modestes , je veux aussi une grande voilière , ce qu il faut c est que les gens soient plus attentifs aux autres et qu ils les aident pour réaliser leurs projets$ +reste +True +texte_uce +[u'mes', u'projets', u'sont', u'r\xe9alisables', u'car', u'modestes'] +suite + je veux aussi une grande voilière , ce qu il faut c est que les gens soient plus attentifs aux autres et qu ils les aident pour réaliser leurs projets$ +reste +True +texte_uce +[u'je', u'veux', u'aussi', u'une', u'grande', u'voili\xe8re'] +suite + ce qu il faut c est que les gens soient plus attentifs aux autres et qu ils les aident pour réaliser leurs projets$ +reste +True +texte_uce +[u'ce', u'qu', u'il', u'faut', u'c', u'est', u'que', u'les', u'gens', u'soient'] +suite +plus attentifs aux autres et qu ils les aident pour réaliser leurs projets$ +reste +True +texte_uce +[u'plus', u'attentifs', u'aux', u'autres', u'et', u'qu', u'ils', u'les'] +suite +aident pour réaliser leurs projets$ +reste +True +texte_uce +[u'aident', u'pour', u'r\xe9aliser', u'leurs', u'projets'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'jusqu_au'] +suite +baccalauréat et faire un boulot qui me plaît je veux avoir une belle voiture de sport , une femme et un enfant minimum$ +reste +True +texte_uce +[u'baccalaur\xe9at', u'et', u'faire', u'un', u'boulot', u'qui', u'me'] +suite +plaît je veux avoir une belle voiture de sport , une femme et un enfant minimum$ +reste +True +texte_uce +[u'pla\xeet', u'je', u'veux', u'avoir', u'une', u'belle', u'voiture', u'de', u'sport'] +suite + une femme et un enfant minimum$ +reste +True +texte_uce +[u'une', u'femme', u'et', u'un', u'enfant', u'minimum'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'pense', u'rentrer', u'\xe0', u'l', u'\xe9cole', u'd', u'h\xf4telerie', u'et'] +suite +essayer d avoir un bon diplôme , avoir un salaire très fort et travailler dans un restaurant comme cuisinier et apprenti , j espère que je vais faire la fête avant de me marier , après je profite de ma femme et je lui fais des enfants , après je deviens milliardaire , je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'essayer', u'd', u'avoir', u'un', u'bon', u'dipl\xf4me'] +suite + avoir un salaire très fort et travailler dans un restaurant comme cuisinier et apprenti , j espère que je vais faire la fête avant de me marier , après je profite de ma femme et je lui fais des enfants , après je deviens milliardaire , je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'avoir', u'un', u'salaire', u'tr\xe8s', u'fort', u'et', u'travailler'] +suite +dans un restaurant comme cuisinier et apprenti , j espère que je vais faire la fête avant de me marier , après je profite de ma femme et je lui fais des enfants , après je deviens milliardaire , je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'dans', u'un', u'restaurant', u'comme', u'cuisinier', u'et', u'apprenti'] +suite + j espère que je vais faire la fête avant de me marier , après je profite de ma femme et je lui fais des enfants , après je deviens milliardaire , je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'j', u'esp\xe8re', u'que', u'je', u'vais', u'faire', u'la', u'f\xeate', u'avant', u'de', u'me', u'marier'] +suite + après je profite de ma femme et je lui fais des enfants , après je deviens milliardaire , je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui'] +suite +fais des enfants , après je deviens milliardaire , je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'fais', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'deviens', u'milliardaire'] +suite + je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'je', u'prends', u'la', u'retraite', u'anticip\xe9e'] +suite + plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'faire', u'de', u'longues', u'\xe9tudes'] +suite + et avoir un bon métier , aussi passer mon permis un appartement être indépendante et avoir un chat , il ne faut pas que je fasse tout en même temps je ne veux pas me sentir bousculer , pour la famille l idéal c est d avoir un mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'et', u'avoir', u'un', u'bon', u'm\xe9tier'] +suite + aussi passer mon permis un appartement être indépendante et avoir un chat , il ne faut pas que je fasse tout en même temps je ne veux pas me sentir bousculer , pour la famille l idéal c est d avoir un mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'aussi', u'passer', u'mon', u'permis', u'un', u'appartement'] +suite +être indépendante et avoir un chat , il ne faut pas que je fasse tout en même temps je ne veux pas me sentir bousculer , pour la famille l idéal c est d avoir un mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'\xeatre', u'ind\xe9pendante', u'et', u'avoir', u'un', u'chat'] +suite + il ne faut pas que je fasse tout en même temps je ne veux pas me sentir bousculer , pour la famille l idéal c est d avoir un mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'il', u'ne', u'faut', u'pas', u'que', u'je', u'fasse', u'tout', u'en', u'm\xeame'] +suite +temps je ne veux pas me sentir bousculer , pour la famille l idéal c est d avoir un mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'temps', u'je', u'ne', u'veux', u'pas', u'me', u'sentir', u'bousculer'] +suite + pour la famille l idéal c est d avoir un mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un'] +suite +mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'mari', u'et', u'des', u'enfants'] +suite + après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour'] +suite +pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'pouvoir', u'partir', u'en', u'voyage'] +suite + j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien'] +suite + c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager'] +suite + bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans'] +suite +le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'le', u'grand', u'cycle'] +suite + après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la'] +suite +vie avant de m attacher$ +reste +True +texte_uce +[u'vie', u'avant', u'de', u'm', u'attacher'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'\xe9t\xe9', u'\xe0', u'l', u'h\xf4pital', u'et', u'l\xe0', u'j', u'ai', u'compris'] +suite +que les métiers dans le sanitaire c était important , essentiel pour la société , car ils savent les vies et évitent les malheurs , c est pour cela que j ai décidé d être infirmière , donc poursuivre mes études et me marier un jour et avoir des enfants$ +reste +True +texte_uce +[u'que', u'les', u'm\xe9tiers', u'dans', u'le', u'sanitaire', u'c', u'\xe9tait', u'important'] +suite + essentiel pour la société , car ils savent les vies et évitent les malheurs , c est pour cela que j ai décidé d être infirmière , donc poursuivre mes études et me marier un jour et avoir des enfants$ +reste +True +texte_uce +[u'essentiel', u'pour', u'la', u'soci\xe9t\xe9'] +suite + car ils savent les vies et évitent les malheurs , c est pour cela que j ai décidé d être infirmière , donc poursuivre mes études et me marier un jour et avoir des enfants$ +reste +True +texte_uce +[u'car', u'ils', u'savent', u'les', u'vies', u'et', u'\xe9vitent', u'les', u'malheurs'] +suite + c est pour cela que j ai décidé d être infirmière , donc poursuivre mes études et me marier un jour et avoir des enfants$ +reste +True +texte_uce +[u'c', u'est', u'pour', u'cela', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'infirmi\xe8re'] +suite + donc poursuivre mes études et me marier un jour et avoir des enfants$ +reste +True +texte_uce +[u'donc', u'poursuivre', u'mes', u'\xe9tudes', u'et', u'me', u'marier'] +suite +un jour et avoir des enfants$ +reste +True +texte_uce +[u'un', u'jour', u'et', u'avoir', u'des', u'enfants'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'plus', u'tard', u'je', u'veux', u'devenir', u'styliste', u'car', u'la'] +suite +mode ça m attire bien , je veux devenir un grand styliste , comme tout le monde je veux devenir riche et vivre sans problème , je suis certaine de ne pas me marier , mais j ai tout de même une idée de l homme idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'mode', u'\xe7a', u'm', u'attire', u'bien'] +suite + je veux devenir un grand styliste , comme tout le monde je veux devenir riche et vivre sans problème , je suis certaine de ne pas me marier , mais j ai tout de même une idée de l homme idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'je', u'veux', u'devenir', u'un', u'grand', u'styliste'] +suite + comme tout le monde je veux devenir riche et vivre sans problème , je suis certaine de ne pas me marier , mais j ai tout de même une idée de l homme idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'comme', u'tout', u'le', u'monde', u'je', u'veux', u'devenir', u'riche'] +suite +et vivre sans problème , je suis certaine de ne pas me marier , mais j ai tout de même une idée de l homme idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'et', u'vivre', u'sans', u'probl\xe8me'] +suite + je suis certaine de ne pas me marier , mais j ai tout de même une idée de l homme idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'je', u'suis', u'certaine', u'de', u'ne', u'pas', u'me', u'marier'] +suite + mais j ai tout de même une idée de l homme idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme'] +suite +idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9'] +suite + beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants'] +suite + je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'je', u'veux', u'une', u'grande', u'maison'] +suite + pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison'] +suite + je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde'] +suite + je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'je', u'veux', u'une', u'grande', u'voiture'] +suite + je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'faire', u'des', u'\xe9tudes', u'dans', u'la', u'comptabilit\xe9'] +suite + et dans dix ans travailler , je ne veux pas me marier tout de suite je veux avoir un appartement pour moi seule ou avec une amie , et essayer de vivre seule sans mes parents , je veux goûter la liberté sans les parents , ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'et', u'dans', u'dix', u'ans', u'travailler'] +suite + je ne veux pas me marier tout de suite je veux avoir un appartement pour moi seule ou avec une amie , et essayer de vivre seule sans mes parents , je veux goûter la liberté sans les parents , ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'tout', u'de', u'suite'] +suite +je veux avoir un appartement pour moi seule ou avec une amie , et essayer de vivre seule sans mes parents , je veux goûter la liberté sans les parents , ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'un', u'appartement', u'pour', u'moi', u'seule'] +suite +ou avec une amie , et essayer de vivre seule sans mes parents , je veux goûter la liberté sans les parents , ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'ou', u'avec', u'une', u'amie'] +suite + et essayer de vivre seule sans mes parents , je veux goûter la liberté sans les parents , ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents'] +suite + je veux goûter la liberté sans les parents , ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents'] +suite + ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'aimerais', u'devenir', u'informaticienne'] +suite + je l ai décidé cette année car dans ma classe on choisit une orientation et on envisage différents métiers ils vont être réalisables dans dix ans car c est là que je vais avoir fini mes études , je voudrai aller aux jeux olympiques , je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'je', u'l', u'ai', u'd\xe9cid\xe9', u'cette', u'ann\xe9e', u'car', u'dans', u'ma'] +suite +classe on choisit une orientation et on envisage différents métiers ils vont être réalisables dans dix ans car c est là que je vais avoir fini mes études , je voudrai aller aux jeux olympiques , je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'classe', u'on', u'choisit', u'une', u'orientation', u'et', u'on'] +suite +envisage différents métiers ils vont être réalisables dans dix ans car c est là que je vais avoir fini mes études , je voudrai aller aux jeux olympiques , je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'envisage', u'diff\xe9rents', u'm\xe9tiers', u'ils', u'vont', u'\xeatre'] +suite +réalisables dans dix ans car c est là que je vais avoir fini mes études , je voudrai aller aux jeux olympiques , je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'r\xe9alisables', u'dans', u'dix', u'ans', u'car', u'c', u'est', u'l\xe0', u'que'] +suite +je vais avoir fini mes études , je voudrai aller aux jeux olympiques , je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'je', u'vais', u'avoir', u'fini', u'mes', u'\xe9tudes'] +suite + je voudrai aller aux jeux olympiques , je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques'] +suite + je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage'] +suite +il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes'] +suite +pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs'] +suite +projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer'] +suite +ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne'] +suite +veulent pas faire$ +reste +True +texte_uce +[u'veulent', u'pas', u'faire'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'un', u'an', u'je', u'pars', u'de', u'chez', u'moi'] +suite + je passe mon permis de voiture et je trouve un travail je loue une maison et je passe une belle vie et après je me marie$ +reste +True +texte_uce +[u'je', u'passe', u'mon', u'permis', u'de', u'voiture', u'et', u'je'] +suite +trouve un travail je loue une maison et je passe une belle vie et après je me marie$ +reste +True +texte_uce +[u'trouve', u'un', u'travail', u'je', u'loue', u'une', u'maison', u'et'] +suite +je passe une belle vie et après je me marie$ +reste +True +texte_uce +[u'je', u'passe', u'une', u'belle', u'vie', u'et', u'apr\xe8s', u'je', u'me', u'marie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'bon', u'm\xe9tier', u'dans', u'le', u'domaine', u'sportif'] +suite + avoir beaucoup d argent et avoir une bonne vie de famille , plus de politique , plus de clochards , plus de famine plus de racisme pas de maçon qui ne gagnent pas leur vie à cause de l orientation dans le collège on gâche sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'avoir', u'beaucoup', u'd', u'argent', u'et', u'avoir', u'une', u'bonne'] +suite +vie de famille , plus de politique , plus de clochards , plus de famine plus de racisme pas de maçon qui ne gagnent pas leur vie à cause de l orientation dans le collège on gâche sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'vie', u'de', u'famille', u',', u'plus', u'de', u'politique'] +suite + plus de clochards , plus de famine plus de racisme pas de maçon qui ne gagnent pas leur vie à cause de l orientation dans le collège on gâche sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'plus', u'de', u'clochards'] +suite + plus de famine plus de racisme pas de maçon qui ne gagnent pas leur vie à cause de l orientation dans le collège on gâche sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de'] +suite +maçon qui ne gagnent pas leur vie à cause de l orientation dans le collège on gâche sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'ma\xe7on', u'qui', u'ne', u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause'] +suite +de l orientation dans le collège on gâche sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che'] +suite +sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me'] +suite +sentir dans ma peau$ +reste +True +texte_uce +[u'sentir', u'dans', u'ma', u'peau'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'commence', u'\xe0', u'avoir', u'des'] +suite +projets je veux un boulot qui me fasse gagner de l argent , la médecine , je vais me lancer dans le sport je vais m inscrire dans un grand club , faire de longues études , pour ma vie sentimental rencontrer des filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'projets', u'je', u'veux', u'un', u'boulot', u'qui', u'me', u'fasse'] +suite +gagner de l argent , la médecine , je vais me lancer dans le sport je vais m inscrire dans un grand club , faire de longues études , pour ma vie sentimental rencontrer des filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'gagner', u'de', u'l', u'argent', u',', u'la', u'm\xe9decine'] +suite + je vais me lancer dans le sport je vais m inscrire dans un grand club , faire de longues études , pour ma vie sentimental rencontrer des filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'je', u'vais', u'me', u'lancer', u'dans', u'le', u'sport', u'je', u'vais'] +suite +m inscrire dans un grand club , faire de longues études , pour ma vie sentimental rencontrer des filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'm', u'inscrire', u'dans', u'un', u'grand', u'club'] +suite + faire de longues études , pour ma vie sentimental rencontrer des filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'faire', u'de', u'longues', u'\xe9tudes'] +suite + pour ma vie sentimental rencontrer des filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'pour', u'ma', u'vie', u'sentimental', u'rencontrer', u'des'] +suite +filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'filles', u'faire', u'des', u'connaissances', u'agr\xe9ables'] +suite + je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'je', u'veux', u'le', u'permis'] +suite + pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux'] +suite +rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'ne', u'sais', u'rien', u'sur', u'mes', u'projets', u'je', u'ne', u'sais'] +suite +pas je ne sais pas$ +reste +True +texte_uce +[u'pas', u'je', u'ne', u'sais', u'pas'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'de', u'projet', u'en', u'ce', u'moment', u'je', u'ne'] +suite +pense qu aux filles je ne pense qu à cela je ne pense qu aux filles , les filles$ +reste +True +texte_uce +[u'pense', u'qu', u'aux', u'filles', u'je', u'ne', u'pense', u'qu', u'\xe0', u'cela'] +suite +je ne pense qu aux filles , les filles$ +reste +True +texte_uce +[u'je', u'ne', u'pense', u'qu', u'aux', u'filles', u',', u'les', u'filles'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'je', u'pars', u'de', u'chez', u'moi'] +suite + et je passe mon permis de conduire après je me marie et je pratique à fond la religion je veux profiter de la vie mais après c est l enfer$ +reste +True +texte_uce +[u'et', u'je', u'passe', u'mon', u'permis', u'de', u'conduire', u'apr\xe8s'] +suite +je me marie et je pratique à fond la religion je veux profiter de la vie mais après c est l enfer$ +reste +True +texte_uce +[u'je', u'me', u'marie', u'et', u'je', u'pratique', u'\xe0', u'fond', u'la'] +suite +religion je veux profiter de la vie mais après c est l enfer$ +reste +True +texte_uce +[u'religion', u'je', u'veux', u'profiter', u'de', u'la', u'vie', u'mais'] +suite +après c est l enfer$ +reste +True +texte_uce +[u'apr\xe8s', u'c', u'est', u'l', u'enfer'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'femme', u'et', u'un', u'appartement'] +suite + pour la profession je voudrais m orienter vers une formation technique pour réaliser tout cela il faut que je travaille après quand je serai vieux je veux faire le pèlerinage , si tout va bien$ +reste +True +texte_uce +[u'pour', u'la', u'profession', u'je', u'voudrais', u'm', u'orienter'] +suite +vers une formation technique pour réaliser tout cela il faut que je travaille après quand je serai vieux je veux faire le pèlerinage , si tout va bien$ +reste +True +texte_uce +[u'vers', u'une', u'formation', u'technique', u'pour', u'r\xe9aliser'] +suite +tout cela il faut que je travaille après quand je serai vieux je veux faire le pèlerinage , si tout va bien$ +reste +True +texte_uce +[u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'apr\xe8s'] +suite +quand je serai vieux je veux faire le pèlerinage , si tout va bien$ +reste +True +texte_uce +[u'quand', u'je', u'serai', u'vieux', u'je', u'veux', u'faire', u'le', u'p\xe8lerinage'] +suite + si tout va bien$ +reste +True +texte_uce +[u'si', u'tout', u'va', u'bien'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'compte', u'faire', u'une', u'formation', u'technique'] +suite +et après cette formation fonder une famille et avoir une voiture$ +reste +True +texte_uce +[u'et', u'apr\xe8s', u'cette', u'formation', u'fonder', u'une', u'famille'] +suite +et avoir une voiture$ +reste +True +texte_uce +[u'et', u'avoir', u'une', u'voiture'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'\xe0', u'la', u'majorit\xe9'] +suite + je veux avoir un appartement , je ferai des petits boulots je veux mon indépendance , je veux continuer mes études en faisant les petits boulots une formation technique , avec une bonne formation fonder une famille et essayer d être heureux$ +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'un', u'appartement'] +suite + je ferai des petits boulots je veux mon indépendance , je veux continuer mes études en faisant les petits boulots une formation technique , avec une bonne formation fonder une famille et essayer d être heureux$ +reste +True +texte_uce +[u'je', u'ferai', u'des', u'petits', u'boulots', u'je', u'veux', u'mon', u'ind\xe9pendance'] +suite + je veux continuer mes études en faisant les petits boulots une formation technique , avec une bonne formation fonder une famille et essayer d être heureux$ +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'en', u'faisant'] +suite +les petits boulots une formation technique , avec une bonne formation fonder une famille et essayer d être heureux$ +reste +True +texte_uce +[u'les', u'petits', u'boulots', u'une', u'formation', u'technique'] +suite + avec une bonne formation fonder une famille et essayer d être heureux$ +reste +True +texte_uce +[u'avec', u'une', u'bonne', u'formation', u'fonder', u'une', u'famille'] +suite +et essayer d être heureux$ +reste +True +texte_uce +[u'et', u'essayer', u'd', u'\xeatre', u'heureux'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'voyager'] +suite + dans tout le monde avoir plein de voitures et de femmes je veux être riche et avoir plein de femmes$ +reste +True +texte_uce +[u'dans', u'tout', u'le', u'monde', u'avoir', u'plein', u'de', u'voitures'] +suite +et de femmes je veux être riche et avoir plein de femmes$ +reste +True +texte_uce +[u'et', u'de', u'femmes', u'je', u'veux', u'\xeatre', u'riche', u'et', u'avoir'] +suite +plein de femmes$ +reste +True +texte_uce +[u'plein', u'de', u'femmes'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'professeur', u'de', u'physique'] +suite +et pour cela il faut que je continue mes études , ensuite j espère me marier , avoir une voiture et une maison$ +reste +True +texte_uce +[u'et', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'continue', u'mes', u'\xe9tudes'] +suite + ensuite j espère me marier , avoir une voiture et une maison$ +reste +True +texte_uce +[u'ensuite', u'j', u'esp\xe8re', u'me', u'marier'] +suite + avoir une voiture et une maison$ +reste +True +texte_uce +[u'avoir', u'une', u'voiture', u'et', u'une', u'maison'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'un', u'bon', u'boulot', u'qui', u'me', u'rapporte', u'de', u'l', u'argent'] +suite + et je veux pouvoir faire des voyages , je veux continuer dans la danse et devenir une professionnel , je veux continuer à garder des liens avec ma famille car elle est sacrée je veux aussi un super mari pour que ça se réalise il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'et', u'je', u'veux', u'pouvoir', u'faire', u'des', u'voyages'] +suite + je veux continuer dans la danse et devenir une professionnel , je veux continuer à garder des liens avec ma famille car elle est sacrée je veux aussi un super mari pour que ça se réalise il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'dans', u'la', u'danse', u'et', u'devenir'] +suite +une professionnel , je veux continuer à garder des liens avec ma famille car elle est sacrée je veux aussi un super mari pour que ça se réalise il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'une', u'professionnel'] +suite + je veux continuer à garder des liens avec ma famille car elle est sacrée je veux aussi un super mari pour que ça se réalise il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec'] +suite +ma famille car elle est sacrée je veux aussi un super mari pour que ça se réalise il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'ma', u'famille', u'car', u'elle', u'est', u'sacr\xe9e', u'je', u'veux'] +suite +aussi un super mari pour que ça se réalise il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise'] +suite +il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'toujours', u'garder', u'des', u'liens', u'avec', u'ma'] +suite +famille au niveau de mon métier je veux faire un travail social , je veux me marier et fonder une famille et avoir de belles maisons j espère voyager dans tout le monde , je pense pouvoir réaliser tout cela par rapport à mon mariage$ +reste +True +texte_uce +[u'famille', u'au', u'niveau', u'de', u'mon', u'm\xe9tier', u'je', u'veux'] +suite +faire un travail social , je veux me marier et fonder une famille et avoir de belles maisons j espère voyager dans tout le monde , je pense pouvoir réaliser tout cela par rapport à mon mariage$ +reste +True +texte_uce +[u'faire', u'un', u'travail', u'social'] +suite + je veux me marier et fonder une famille et avoir de belles maisons j espère voyager dans tout le monde , je pense pouvoir réaliser tout cela par rapport à mon mariage$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille'] +suite +et avoir de belles maisons j espère voyager dans tout le monde , je pense pouvoir réaliser tout cela par rapport à mon mariage$ +reste +True +texte_uce +[u'et', u'avoir', u'de', u'belles', u'maisons', u'j', u'esp\xe8re', u'voyager'] +suite +dans tout le monde , je pense pouvoir réaliser tout cela par rapport à mon mariage$ +reste +True +texte_uce +[u'dans', u'tout', u'le', u'monde'] +suite + je pense pouvoir réaliser tout cela par rapport à mon mariage$ +reste +True +texte_uce +[u'je', u'pense', u'pouvoir', u'r\xe9aliser', u'tout', u'cela', u'par'] +suite +rapport à mon mariage$ +reste +True +texte_uce +[u'rapport', u'\xe0', u'mon', u'mariage'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'bonne', u'qualification', u'pour'] +suite +le métier et ça sera possible si je continue mes études après cela penser à la vie sentimentale$ +reste +True +texte_uce +[u'le', u'm\xe9tier', u'et', u'\xe7a', u'sera', u'possible', u'si', u'je', u'continue'] +suite +mes études après cela penser à la vie sentimentale$ +reste +True +texte_uce +[u'mes', u'\xe9tudes', u'apr\xe8s', u'cela', u'penser', u'\xe0', u'la', u'vie', u'sentimentale'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'pour', u'faire'] +suite +de l anglais ou la médecine , il faut multiplier les centres de rencontre pour les jeunes je veux vivre dans un grand et beau pays dans un pays de la liberté je veux rencontrer des gens connus et me marier avec une vedette$ +reste +True +texte_uce +[u'de', u'l', u'anglais', u'ou', u'la', u'm\xe9decine'] +suite + il faut multiplier les centres de rencontre pour les jeunes je veux vivre dans un grand et beau pays dans un pays de la liberté je veux rencontrer des gens connus et me marier avec une vedette$ +reste +True +texte_uce +[u'il', u'faut', u'multiplier', u'les', u'centres', u'de', u'rencontre'] +suite +pour les jeunes je veux vivre dans un grand et beau pays dans un pays de la liberté je veux rencontrer des gens connus et me marier avec une vedette$ +reste +True +texte_uce +[u'pour', u'les', u'jeunes', u'je', u'veux', u'vivre', u'dans', u'un', u'grand'] +suite +et beau pays dans un pays de la liberté je veux rencontrer des gens connus et me marier avec une vedette$ +reste +True +texte_uce +[u'et', u'beau', u'pays', u'dans', u'un', u'pays', u'de', u'la', u'libert\xe9'] +suite +je veux rencontrer des gens connus et me marier avec une vedette$ +reste +True +texte_uce +[u'je', u'veux', u'rencontrer', u'des', u'gens', u'connus', u'et', u'me'] +suite +marier avec une vedette$ +reste +True +texte_uce +[u'marier', u'avec', u'une', u'vedette'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'et', u'faire', u'un'] +suite +travail intéressant et qui rapporte de l argent , je veux me marier et fonder une famille , je veux vivre dans un beau pays je veux beaucoup voyager , une fois bien profiter de la vie je pense faire des enfants et m en occuper , si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'travail', u'int\xe9ressant', u'et', u'qui', u'rapporte', u'de', u'l', u'argent'] +suite + je veux me marier et fonder une famille , je veux vivre dans un beau pays je veux beaucoup voyager , une fois bien profiter de la vie je pense faire des enfants et m en occuper , si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille'] +suite + je veux vivre dans un beau pays je veux beaucoup voyager , une fois bien profiter de la vie je pense faire des enfants et m en occuper , si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'je', u'veux', u'vivre', u'dans', u'un', u'beau', u'pays', u'je', u'veux'] +suite +beaucoup voyager , une fois bien profiter de la vie je pense faire des enfants et m en occuper , si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'beaucoup', u'voyager'] +suite + une fois bien profiter de la vie je pense faire des enfants et m en occuper , si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense'] +suite +faire des enfants et m en occuper , si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper'] +suite + si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour'] +suite +plus profiter de la vie$ +reste +True +texte_uce +[u'plus', u'profiter', u'de', u'la', u'vie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'une', u'danseuse', u'et', u'en', u'faire', u'mon', u'm\xe9tier'] +suite + mais pour cela il faut de l argent sinon je vais faire un travail de technique en biologie , je veux me marier avec un super mari mais je n ai pas trop d espoir à ce niveau là$ +reste +True +texte_uce +[u'mais', u'pour', u'cela', u'il', u'faut', u'de', u'l', u'argent', u'sinon'] +suite +je vais faire un travail de technique en biologie , je veux me marier avec un super mari mais je n ai pas trop d espoir à ce niveau là$ +reste +True +texte_uce +[u'je', u'vais', u'faire', u'un', u'travail', u'de', u'technique', u'en', u'biologie'] +suite + je veux me marier avec un super mari mais je n ai pas trop d espoir à ce niveau là$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avec', u'un', u'super', u'mari', u'mais'] +suite +je n ai pas trop d espoir à ce niveau là$ +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'trop', u'd', u'espoir', u'\xe0', u'ce', u'niveau', u'l\xe0'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'de', u'toute', u'fa\xe7on', u'\xe0', u'la', u'majorit\xe9', u'je', u'serai', u'libre'] +suite +et je pourrais faire ce qu il me plaît même si j ai envie de passer dans une autre classe$ +reste +True +texte_uce +[u'et', u'je', u'pourrais', u'faire', u'ce', u'qu', u'il', u'me', u'pla\xeet'] +suite +même si j ai envie de passer dans une autre classe$ +reste +True +texte_uce +[u'm\xeame', u'si', u'j', u'ai', u'envie', u'de', u'passer', u'dans', u'une', u'autre', u'classe'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'pense', u'd_abord', u'faire', u'mes', u'\xe9tudes', u'une'] +suite +formation technique dans le commerce , quelque chose qui soit à la portée des mes propres possibilités$ +reste +True +texte_uce +[u'formation', u'technique', u'dans', u'le', u'commerce'] +suite + quelque chose qui soit à la portée des mes propres possibilités$ +reste +True +texte_uce +[u'quelque', u'chose', u'qui', u'soit', u'\xe0', u'la', u'port\xe9e', u'des'] +suite +mes propres possibilités$ +reste +True +texte_uce +[u'mes', u'propres', u'possibilit\xe9s'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'faire', u'un', u'travail', u'dans', u'le', u'social'] +suite +commencer par une préparation d infirmière donc continuer mes études et ensuite faire une spécialisation par rapport aux enfants , je pense d_abord à ma vie de métier , le reste on ne sais pas vraiment , le hasard , mais pour le métier , il faut travailler .$ +reste +True +texte_uce +[u'commencer', u'par', u'une', u'pr\xe9paration', u'd', u'infirmi\xe8re'] +suite +donc continuer mes études et ensuite faire une spécialisation par rapport aux enfants , je pense d_abord à ma vie de métier , le reste on ne sais pas vraiment , le hasard , mais pour le métier , il faut travailler .$ +reste +True +texte_uce +[u'donc', u'continuer', u'mes', u'\xe9tudes', u'et', u'ensuite', u'faire'] +suite +une spécialisation par rapport aux enfants , je pense d_abord à ma vie de métier , le reste on ne sais pas vraiment , le hasard , mais pour le métier , il faut travailler .$ +reste +True +texte_uce +[u'une', u'sp\xe9cialisation', u'par', u'rapport', u'aux', u'enfants'] +suite + je pense d_abord à ma vie de métier , le reste on ne sais pas vraiment , le hasard , mais pour le métier , il faut travailler .$ +reste +True +texte_uce +[u'je', u'pense', u'd_abord', u'\xe0', u'ma', u'vie', u'de', u'm\xe9tier'] +suite + le reste on ne sais pas vraiment , le hasard , mais pour le métier , il faut travailler .$ +reste +True +texte_uce +[u'le', u'reste', u'on', u'ne', u'sais', u'pas', u'vraiment', u',', u'le', u'hasard'] +suite + mais pour le métier , il faut travailler .$ +reste +True +texte_uce +[u'mais', u'pour', u'le', u'm\xe9tier', u',', u'il', u'faut', u'travailler', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'l', u'habitude', u'de', u'faire', u'des', u'projets', u',', u'je', u'vis', u'au', u'jour', u'le', u'jour'] +suite + les adolescents font des projets à partir du moment où il se rendent compte qu ils ne doivent compter que sur eux même et qu ils doivent se prendre en charge de quel genre de projets s agit il ? projet pour mon métier , une vie assez facile , sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'les', u'adolescents', u'font', u'des', u'projets', u'\xe0', u'partir', u'du', u'moment', u'o\xf9', u'il', u'se', u'rendent', u'compte', u'qu', u'ils', u'ne', u'doivent', u'compter', u'que', u'sur', u'eux', u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il', u'?', u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile'] +suite + sans trop d argent ni trop peu , une maison , une voiture , une moto , tout ça grâce à la police , car je veux devenir policier . projet sentimental , en ce moment , je suis avec une fille ceci depuis 9 mois , et je veux que cela dure encore longtemps . projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps'] +suite + projets futurs : avoir mon brevet du collège , passer en seconde , ce qu il faudrait améliorer dans notre société actuelle pour que nos projets soient réalisables c est avoir à coeur ce que l on veut faire ne jamais y renoncer , ne jamais se décourager$ +reste +True +texte_uce +[u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u',', u'devenir', u'un', u'jour', u'professeur', u'de', u'fran\xe7ais', u'ou', u'd', u'histoire', u'g\xe9ographie', u';', u'me', u'marier', u';', u'avoir', u'un', u'enfant', u'pas', u'plus', u',', u'faire', u'construire', u'une', u'maison', u'et', u'si', u'possible', u',', u'ne', u'pas', u'vivre', u'en', u'ville', u',', u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne'] +suite + passer mon permis de conduire , avoir une ou plusieurs voitures . pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures'] +suite + pour que les jeunes puissent réussir leurs projets plus facilement il faudrait d_abord que la vie en général , devienne moins dure et moins chère que les jeunes des le départ ne soient pas obligés à prendre des crédits pour tout .$ +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral', u',', u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'seraient', u'de', u'devenir', u'v\xe9t\xe9rinaire', u',', u'd', u'avoir', u'une', u'belle', u'maison', u'\xe0', u'la', u'montagne', u'et', u'une', u'au', u'bord', u'de', u'la', u'mer', u',', u'avoir', u'une', u'femme', u'un', u'enfant', u',', u'une', u'grosse', u'voiture', u'de', u'sport', u'et', u'aussi', u'une', u'grosse', u'moto', u'.', u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition'] +suite + devenir champion de tir à l arc , tir à la carabine , devenir champion du monde de la chasse à courre , avec les meilleurs chiens , avoir un chenil . enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine', u',', u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil'] +suite + enlever le quanta , éliminer les centrales nucléaires , faire exploser toutes les centrales du monde entier car elles polluent les rivières , enlever les engrais chimiques qui polluent les nappes phréatiques , enlever les centrales électriques .$ +reste +True +texte_uce +[u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'familiaux', u',', u'je', u'pense', u'ne', u'pas', u'me', u'marier', u'mais', u'avoir', u'des', u'enfants', u',', u'au', u'moins', u'deux', u'enfants', u',', u'vivre', u'avec', u'un', u'homme', u'soit', u'en', u'tant', u'que', u'mari', u',', u'soit', u'en', u'tant', u'que', u'concubin'] +suite + je ne réaliserai ces projets que dans douze ans , lorsque j aurai un métier sûr et une situation aisée . j ai projetai cela il y a environ un an . mes projets professionnels , il y a environ trois ou quatre ans , j ai décidé d être conceptrice , rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'je', u'ne', u'r\xe9aliserai', u'ces', u'projets', u'que', u'dans', u'douze', u'ans', u',', u'lorsque', u'j', u'aurai', u'un', u'm\xe9tier', u's\xfbr', u'et', u'une', u'situation', u'ais\xe9e', u'.', u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an', u'.', u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice'] +suite + rédactrice en publicité et j ai de plus en plus envie de faire ce métier . trouver des idées pour une publicité , me plaît beaucoup , imaginer , fabuler , je trouve cela passionnant . j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant'] +suite + j ai choisi ce métier , car dans la publicité on peut tout faire , rien n est impossible et je trouve ça formidable . bien sûr pour en arriver là , il va falloir travailler dur et se battre . cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre'] +suite + cela me fait un peu peur , mais dans la vie si on veut arriver à quelque chose il faut se battre et travailler , à mon avis je ne pourrai travailler vraiment que dans dix ans . ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans'] +suite + ce qu il faudrait améliorer dans notre société pour que les jeunes puissent réaliser leurs projets serait réduire le chômage , donner plus de possibilité aux jeunes dans les université , initiation pour les réaliser , changer l enseignement , la pédagogie des profs .$ +reste +True +texte_uce +[u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement'] +suite + la pédagogie des profs .$ +reste +True +texte_uce +[u'la', u'p\xe9dagogie', u'des', u'profs', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'ce', u'que', u'je', u'veux', u'faire', u'comme', u'projet', u'depuis', u'toujours', u',', u'avoir', u'un', u'bon', u'm\xe9tier', u'qui', u'paie', u',', u'ne', u'pas', u'avoir', u'd', u'enfants', u',', u'ne', u'pas', u'me', u'marier', u',', u'avoir', u'mon', u'ind\xe9pendance', u',', u'avoir', u'une', u'super', u'voiture', u',', u'\xeatre', u'biologiste', u',', u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans'] +suite + aller depuis toujours en amérique , depuis toujours , aller en haut , ça aussi à l age de quinze ans , depuis toujours avoir plein de téléphones dans mon appartement , depuis toujours , avoir la pilule quand j aurai envie de faire l amour avec un mec , avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique', u',', u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec'] +suite + avoir un corps d athlète , depuis toujours , avoir mon permis provisoire depuis trois mois . pour que les jeunes puissent plus facilement réussir des projets , il faudrait que les parents aient plus confiance en leurs enfants , et les laissent agir . cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir'] +suite + cela est de même pour l etat , avoir les moyens financiers donner par l etat , car les parents ne peuvent pas toujours se le permettre$ +reste +True +texte_uce +[u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'quatre', u'ou', u'trois', u'enfants', u',', u'mais', u'en', u'attendant', u',', u'je', u'veux', u'arriver', u'\xe0', u'mon', u'bac', u'professionnel', u',', u'enfin', u'continuer', u'mes', u'\xe9tudes', u',', u'avoir', u'un', u'bon', u'm\xe9tier'] +suite + je veux en premier une bonne situation puis ensuite fonder une famille dans au moins neuf ans . ce qui faudrait changer pour que les jeunes puissent réaliser leurs projets sont les études qui sont un peu trop dures . maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'je', u'veux', u'en', u'premier', u'une', u'bonne', u'situation', u'puis', u'ensuite', u'fonder', u'une', u'famille', u'dans', u'au', u'moins', u'neuf', u'ans', u'.', u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures'] +suite + maintenant pour faire femme de ménage , il faut avoir un brevet d enseignement professionnel . je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel'] +suite + je veux que mon mari travaille et moi aussi , je veux élever mes enfants différemment que mes parents , je me marierai avec un homme en qui j ai entièrement confiance . fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance'] +suite + fonder une famille unie a été toujours mon idée , mais pour un métier je ne suis pas certaine . aujourd_hui je sais ce que je veux faire , monitrice et éducatrice . ma mère est d accord , mon père non , mais je me moque de son avis , car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis'] +suite + car il n a pas ma charge et que lui aussi ce moque du mien . dans cinq ans je débute ma carrière , dans trois ans , j ai un appartement avec des copines , mariage dans dix , quinze ans , la maison pareil et enfin être grand_mère dans quarante ans$ +reste +True +texte_uce +[u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'concubinage', u'avec', u'des', u'gens', u'c\xe9l\xe8bre', u',', u'avoir', u'une', u'voiture', u'de', u'sport', u',', u'plusieurs', u'villas', u',', u'avec', u'mes', u'associ\xe9s', u'on', u'enqu\xeateraient', u'sur', u'les', u'vols', u',', u'je', u'veux', u'vivre', u'dans', u'une', u'\xeele', u'd\xe9sertes', u'avec', u'plein', u'de', u'mecs', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u'j', u'aimerai', u'rentrer', u'au', u'lyc\xe9e', u'pour', u'continuer', u'mes', u'\xe9tudes', u',', u'faire', u'de', u'l', u'\xe9lectronique', u',', u'apr\xe8s', u'si', u'je', u'r\xe9ussi', u'ces', u'premi\xe8res', u'\xe9tudes', u'je', u'compte', u'continuer', u'encore', u'deux', u'ans', u'dans', u'l', u'informatique', u',', u'\xeatre', u'technicien', u'sup\xe9rieur'] +suite + il n y a pas longtemps que j ai décidé cela , l année dernière , je ne savais pas encore ce que je voulais faire , en dehors du dessin assisté par ordinateur car je suis assez bon en dessin industriel , ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'il', u'n', u'y', u'a', u'pas', u'longtemps', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'cela', u',', u'l', u'ann\xe9e', u'derni\xe8re', u',', u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire', u',', u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel'] +suite + ça je peux le faire plus tard dans le cadre de mes études universitaires , comme je l ai déjà dit .$ +reste +True +texte_uce +[u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'continuer', u'mes', u'\xe9tudes', u',', u'mais', u'pas', u'trop', u'longtemps', u',', u'je', u'veux', u'passer', u'mon', u'brevet', u',', u'et', u'ensuite', u'voir', u'du', u'cot\xe9', u'd', u'une', u'formation', u'technique', u',', u'un', u'truc', u'de', u'm\xe9canicien', u',', u'enfin', u'des', u'\xe9tudes', u'pas', u'longues', u'.', u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier'] +suite + après mes études , après avoir une super maison et aussi une ou plein de voitures . je suis ceinture noire de judo , et je voudrais continuer à consacrer du temps pour la compétition , dans le club ou je suis je donne des cours à des enfants$ +reste +True +texte_uce +[u'apr\xe8s', u'mes', u'\xe9tudes', u',', u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une', u'ou', u'plein', u'de', u'voitures', u'.', u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u',', u'je', u'voudrais', u'bien', u'continuer', u'un', u'petit', u'peu', u'mes', u'\xe9tudes', u',', u'mais', u'pas', u'trop', u'longtemps', u',', u'je', u'ne', u'suis', u'pas', u'tr\xe8s', u'bon', u'\xe0', u'l', u'\xe9cole', u',', u'enfin', u'je', u'ne', u'sais', u'pas', u'trop', u'ce', u'que', u'je', u'vais', u'faire', u'au', u'niveau', u'professionnel', u',', u'parce_que', u'\xe0', u'l', u'\xe9cole', u'je', u'ne', u'suis', u'pas', u'bon'] +suite + au niveau sentimental , je compte d_abord m amuser au maximum , bien plus tard bien plus tard , peut être je vais me marier , ou vivre en concubin , enfin avoir une vie un peu plus stable$ +reste +True +texte_uce +[u'au', u'niveau', u'sentimental', u',', u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum', u',', u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier', u',', u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u',', u'je', u'voudrais', u'bien', u'rentrer', u'en', u'seconde', u',', u'et', u'puis', u'continuer', u'mes', u'\xe9tudes', u',', u'rentrer', u'\xe0', u'la', u'facult\xe9', u',', u'ou', u'bien', u'dans', u'une', u'formation', u'plus', u'technique', u',', u'enfin', u'le', u'minimum', u'c', u'est', u'd', u'avoir', u'mon', u'baccalaur\xe9at', u',', u'c', u'est', u'mon', u'premier', u'projet'] +suite + pour le choix professionnel , j ai encore du temps avant de me décider . niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'pour', u'le', u'choix', u'professionnel', u',', u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider'] +suite + niveau sentimental , je crois que je suis encore jeune pour y voir bien clair , je pense certainement fonder une famille , mais cela ne pourra se faire qu après avoir bien travailler au niveau du métier , pas avoir un gosse sans boulot par exemple , ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple'] +suite + ça ça serait galère , je n y pense même pas . je pense essayer de voyager rien que pour les vacances et le faire tant que je suis jeune , avec une famille ça devient beaucoup plus difficile$ +reste +True +texte_uce +[u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u',', u'je', u'compte', u'rentrer', u'au', u'lyc\xe9e', u'pour', u'pr\xe9parer', u'un', u'bac', u'technique', u',', u'apr\xe8s', u'je', u'compte', u'faire', u'une', u'formation', u'technique', u',', u'mais', u'je', u'ne', u'sais', u'pas', u'encore', u'vraiment', u'ce', u'que', u'je', u'veux', u'faire', u',', u'je', u'suis', u'assez', u'bon', u'dans', u'la', u'm\xe9canique'] +suite + certainement que je vais essayer de travailler de ce coté$ +reste +True +texte_uce +[u'certainement', u'que', u'je', u'vais', u'essayer', u'de', u'travailler', u'de', u'ce', u'cot\xe9'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'au', u'niveau', u'professionnel', u',', u'le', u'minimum', u'pour', u'l', u'instant', u'c', u'est', u'de', u'passer', u'mon', u'brevet', u',', u'en', u'cas', u'de', u'r\xe9ussite', u',', u'et', u'je', u'pense', u'que', u'\xe7a', u'va', u'marcher', u',', u'continuer', u'au', u'lyc\xe9e'] +suite + je voudrais bien devenir professeur de mathématique ou de gymnastique , enfin un truc dans ce style , ça peut être moniteur de sport , plutôt le sport . niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'devenir', u'professeur', u'de', u'math\xe9matique', u'ou', u'de', u'gymnastique', u',', u'enfin', u'un', u'truc', u'dans', u'ce', u'style', u',', u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport'] +suite + niveau sentimental , je crois que j ai encore le temps d y penser , je voudrais bien fonder une famille , avoir une maison et pouvoir partir en vacances , c est le minimum qu on peut vouloir , après ça tourne au délire$ +reste +True +texte_uce +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'vivre', u'loin', u'de', u'la', u'ville', u'dans', u'une', u'\xeele', u'd\xe9serte', u',', u'avec', u'de', u'super', u'appareils', u'de', u'musique', u',', u'et', u'une', u'image', u'grand', u'\xe9cran', u'en', u'direct', u'du', u'festival', u',', u'rien', u'que', u'musique', u'et', u'image', u',', u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille'] +suite + d une voiture , et puis tu arrêtes pas d avoir envie de ceci ou de cela . coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela'] +suite + coté sentimental vraiment pas de projets , je veux vivre sur une île déserte avec la mer en face et surtout pas de bateaux à l horizon , au cas où quelques jets de grenades et l histoire est classée , loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e'] +suite + loin du trafic polluant des mécaniques et de la gente humaine$ +reste +True +texte_uce +[u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'au', u'moins', u'des', u'enfants', u',', u'mais', u'en', u'attendant', u',', u'je', u'veux', u'arriver', u'\xe0', u'une', u'profession', u'par', u'rapport', u'au', u'baccalaur\xe9at', u'technique', u'que', u'je', u'veux', u'passer', u',', u'en', u'premier', u',', u'une', u'bonne', u'situation', u',', u'et', u'apr\xe8s', u'fonder', u'une', u'famille'] +suite + ça il me faudra bien une dizaine d années . ce qui est difficile , c est que les études c est pas évident . sinon je veux avant de me marier vivre avec des copines et m amuser , ça je le ferai à la majorité , après je travaille dans mon métier , après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'\xe7a', u'il', u'me', u'faudra', u'bien', u'une', u'dizaine', u'd', u'ann\xe9es', u'.', u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident', u'.', u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier'] +suite + après je me marie les gosses et après je suis grand_mère . je veux travailler dans le social , être assistante sociale , ou aide ménagère , ou un boulot avec des gosses de toute manière$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'familiale', u',', u'je', u'pense', u'pas', u'que', u'je', u'vais', u'me', u'marier', u',', u'mais', u'je', u'veux', u'tout', u'de', u'm\xeame', u'avoir', u'des', u'enfants', u'et', u'puis', u'vivre', u'avec', u'un', u'homme', u',', u'mais', u'je', u'veux', u'garder', u'mon', u'ind\xe9pendance', u',', u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'pense', u'\xe0', u'tout', u'\xe7a', u',', u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier'] +suite + ça fait deux ans que j ai décidé d être dessinatrice de mode , travailler dans la conception des grands noms de la mode , j aime bien imaginer plein de vêtement , l habit c est mon truc , mais pas la confection , car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection'] +suite + car là on ne peut pas imaginer tout ce qu on veut , mais pour cela il faut que je travaille beaucoup . dans notre société il faut que ça s améliore pour que les jeunes réalisent leurs projets , il faut changer la pédagogie des professeurs .$ +reste +True +texte_uce +[u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'compte', u'surtout', u'avoir', u'mon', u'ind\xe9pendance', u',', u'pour', u'\xe7a', u'il', u'y', u'a', u'pas', u'de', u'myst\xe8re', u',', u'il', u'faut', u'que', u'je', u'travaille', u'par', u'rapport', u'aux', u'\xe9tudes', u',', u'passer', u'mon', u'brevet', u',', u'ensuite', u'aller', u'jusqu_\xe0', u'la', u'terminale', u'et', u'pr\xe9parer', u'une', u'formation', u'technique', u',', u'je', u'pense', u'\xe0', u'l', u'informatique'] +suite + pour éviter d être au chômage , l essentiel pour moi étant d acquérir mon indépendance matérielle . niveau sentimental , surtout pas de famille avant d avoir ma situation , sinon vivre avec un homme , il peut ne pas déranger mes projets . pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle', u'.', u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets'] +suite + pour tout cela il faut que je travaille dans les études , le problème , c est que les études ne nous aident pas trop à comprendre le monde , mais il y a peut_être rien à y comprendre .$ +reste +True +texte_uce +[u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u',', u'je', u'compte', u'me', u'consacrer', u'enti\xe8rement', u'\xe0', u'ma', u'famille', u',', u'\xe0', u'mes', u'enfants', u'et', u'\xe0', u'mon', u'mari', u',', u'je', u'veux', u'pouvoir', u'l', u'aider', u'dans', u'son', u'travail', u',', u'travailler', u'avec', u'lui'] +suite + et l aider dans son travail pour qu il ait plus de temps pour sa famille , en attendant de rencontrer l homme de ma vie , je préparerai un métier , qui me permettra de travailler avec des enfants , travailler dans une crèche , ça me plairait , je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille', u',', u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait'] +suite + je sais pas trop ce qu il faut que je fasse comme études , de toute manière , j aime les enfants et c est déjà un bon point pour moi , j espère avoir une grande maison , et payer tout ce que je veux à mes enfants , j espère qu on pourra voyager , mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager'] +suite + mais l essentiel c est de fonder une famille solide , surtout si on veut des enfants .$ +reste +True +texte_uce +[u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u',', u'je', u'compte', u'devenir', u'officier', u'de', u'la', u'paix', u',', u'j', u'aurais', u'voulu', u'devenir', u'sportif', u',', u'plus', u'particuli\xe8rement', u'dans', u'le', u'football', u',', u'mais', u'devenir', u'flic', u',', u'c', u'est', u'plus', u'passionnant'] +suite + dans cinq ans , je compte me marier avec une femme brune qui aura de beaux yeux , il faudra qu elle soit intelligente et belle physiquement , et mignonne de tête , avec ma femme je pense avoir des enfants , deux enfants et mener une vie agréable , offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u',', u'je', u'compte', u'me', u'marier', u'avec', u'une', u'femme', u'brune', u'qui', u'aura', u'de', u'beaux', u'yeux', u',', u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et', u'belle', u'physiquement', u',', u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants', u',', u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able'] +suite + offrir tout ce que veut ma femme , et aussi à toute la famille . je tiens en étant flic garder la société dans la paix$ +reste +True +texte_uce +[u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'travail', u',', u'le', u'faire', u'pendant', u'deux', u'ans', u',', u'puis', u'avoir', u'un', u'accident', u'du', u'travail', u'pour', u'toucher', u'de', u'l', u'argent', u'tranquillement'] +suite + je veux me marier cinq fois , avoir une maison secondaire une masse de voitures , rentrer dans la politique pour dormir , avoir un énorme lit pour dormir avec plein de femmes , et des femmes de chambre pour faire tout le travail , tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'cinq', u'fois', u',', u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures', u',', u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir', u',', u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail'] +suite + tuer les personnes qui m agacent et mourir vieux sans donner d argent à personne$ +reste +True +texte_uce +[u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avec', u'une', u'jolie', u'femme', u'qui', u'soit', u'aimable', u',', u'faire', u'du', u'sport', u'de', u'temps', u'en', u'temps', u',', u'je', u'veux', u'faire', u'professeur', u'de', u'math\xe9matiques', u',', u'quelque', u'chose', u'qui', u'se', u'rapproche', u'de', u'cela', u',', u'avoir', u'de', u'bonnes', u'relations', u'avec', u'mes', u'parents'] +suite + rester avec eux le plus de temps possible . il faut que les jeunes puissent plus s exprimer$ +reste +True +texte_uce +[u'rester', u'avec', u'eux', u'le', u'plus', u'de', u'temps', u'possible', u'.', u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'faire', u'des', u'voyages', u',', u'voir', u'beaucoup', u'de', u'monde', u',', u'faire', u'des', u'choses', u'uniques', u'dans', u'tous', u'les', u'domaines', u',', u'ne', u'pas', u'faire', u'comme', u'tout', u'le', u'monde', u',', u'laisser', u'quelque', u'chose', u'derri\xe8re', u'moi', u',', u'j', u'aimerais', u'faire', u'un', u'm\xe9tier', u'qui', u'serve', u'\xe0', u'quelque', u'chose'] +suite + certains de mes projets sont réalisables maintenant , ne pas rester toute ma vie dans une cage à lapin , ne pas être un mouton qui se fasse exploiter uniquement pour les autres être libre même si je ne gagne pas beaucoup d argent , ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant', u',', u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent'] +suite + ne pas être comme les autres , ne jamais vieillir dans ma tête .$ +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'tout', u'd_abord', u'avoir', u'une', u'bonne', u'situation', u'professionnel', u'et', u'stable', u',', u'je', u'voudrais', u'aussi', u'vivre', u'avec', u'ma', u'm\xe8re', u',', u'car', u'mes', u'parents', u'sont', u'divorc\xe9s', u',', u'et', u'je', u'vis', u'avec', u'mon', u'p\xe8re', u',', u'j', u'aimerais', u'faire', u'un', u'travail', u'avec', u'des', u'jeunes', u'enfants', u',', u'dans', u'ma', u'vie', u'sentimentale'] +suite + je ne veux pas me marier du moins pas jeune je préfère vivre en concubinage , je veux aussi être vétérinaire mais les études sont trop difficiles et je ne m en s en pas capable , les adolescents peuvent avoir des projets à n importe quel âge$ +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'rester', u'c\xe9libataire', u'et', u'vivre', u'en', u'concubinage', u',', u'je', u'ne', u'veux', u'pas', u'd', u'enfants', u'car', u'pour', u'moi', u'c', u'est', u'une', u'contrainte', u',', u'je', u'veux', u'au', u'niveau', u'professionnel', u'devenir', u'kin\xe9sith\xe9rapeute', u',', u'car', u'c', u'est', u'un', u'milieu', u'o\xf9', u'on', u'a', u'le', u'contact', u'avec', u'le', u'milieu', u'sportif'] +suite + je veux me rendre utile , c est un métier difficile à acquérir , il faut être solide , car il faut être capable de s organiser soi même , sinon si ça va pas je peux devenir journaliste sportive surtout pour le football , je veux informer , être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir', u',', u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer'] +suite + être utile , ne pas être fonctionnaire derrière un bureau à remplir des papiers et à être commande par un supérieur , je ne veux pas d une vie monotone , métro boulot dodo$ +reste +True +texte_uce +[u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'est', u'pas', u'de', u'projet', u'de', u'vie', u',', u'je', u'verrai', u'bien', u'ce', u'que', u'me', u'r\xe9serve', u'le', u'cours', u'de', u'la', u'vie', u',', u'avant', u'de', u'penser', u'\xe0', u'tout', u'cela', u',', u'il', u'faut', u'que', u'je', u'profite', u'de', u'la', u'vie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'passer', u'mon', u'bac', u'et', u'r\xe9ussir', u'dans', u'le', u'domaine', u'artistique'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'vais', u'essayer', u'd', u'avoir', u'mon', u'brevet', u',', u'apr\xe8s', u'je', u'passe', u'le', u'concours', u'de', u'la', u'gendarmerie', u',', u'et', u'le', u'concours', u'\xe0', u'l', u'arm\xe9e', u',', u'je', u'veux', u'r\xe9ussir', u'dans', u'le', u'domaine', u'sportif', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'devenir', u'v\xe9t\xe9rinaire', u',', u'j', u'y', u'pense', u'depuis', u'six', u'ans'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'sur', u'le', u'plan', u'familial', u',', u'je', u'veux', u'rester', u'c\xe9libataire', u'le', u'plus', u'longtemps', u'possible', u',', u'\xe9ventuellement', u'avoir', u'des', u'enfants', u'mais', u'dans', u'vingt', u'ans', u',', u'je', u'veux', u'avoir', u'un', u'boulot', u'int\xe9ressant', u',', u'pratiquer', u'un', u'sport', u'r\xe9guli\xe8rement'] +suite + je n ai jamais eu l intention d avoir des enfants , et ça fait deux ans que j ai décidé de ne pas me marier , je veux avoir de l argent$ +reste +True +texte_uce +[u'je', u'n', u'ai', u'jamais', u'eu', u'l', u'intention', u'd', u'avoir', u'des', u'enfants', u',', u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'quand', u'j', u'aurai', u'trouver', u'l', u'homme', u'id\xe9al', u',', u'je', u'veux', u'me', u'marier', u'avoir', u'des', u'enfants', u'et', u'une', u'belle', u'maison', u',', u'je', u'voudrais', u'travailler', u'dans', u'le', u'professionnel', u'de', u'la', u'publicit\xe9', u',', u'le', u'dessin', u',', u'mais', u'je', u'n', u'ai', u'pas', u'de', u'bons', u'r\xe9sultats'] +suite + depuis que je suis petite je rêve d avoir une voiture et une belle maison , mais je ne savais pas qu il fallait travailler pour cela , maintenant j espère réaliser mon rêve en travaillant et en mettant de l argent de coté , je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison', u',', u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9'] +suite + je veux me marier et avoir des enfants dans dix ans commencer ma carrière dans cinq ans , avoir un appartement avec des copines et après acheter une maison , je veux aussi être grand_mère ; pour que les jeunes réalisent leurs projets , il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets'] +suite + il faut que les parents leur fasse confiance$ +reste +True +texte_uce +[u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'mon', u'baccalaur\xe9at', u'avoir', u'un', u'bon', u'm\xe9tier', u',', u'continuer', u'le', u'patinage', u',', u'vivre', u'heureuse', u',', u'\xeatre', u'heureuse', u',', u'tout', u'\xe7a', u'dans', u'une', u'dizaine', u'd', u'ann\xe9es'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'un', u'bon', u'brevet', u',', u'pas', u'de', u'diff\xe9rence', u'entre', u'le', u'beau', u'et', u'le', u'laid', u',', u'pas', u'de', u'diff\xe9rence', u'entre', u'les', u'filles', u'et', u'les', u'gar\xe7ons', u'et', u'que', u'les', u'gens', u'ne', u'jugent', u'pas'] +suite + je ne sais pas je voudrais qu il n y ait pas de guerre et que des enfants meurent à cause de la connerie des adultes , ils détruisent l avenir des enfants innocents qui se font tuer$ +reste +True +texte_uce +[u'je', u'ne', u'sais', u'pas', u'je', u'voudrais', u'qu', u'il', u'n', u'y', u'ait', u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent', u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes', u',', u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'dix', u'ans', u'que', u'je', u'pense', u'continuer', u'mes', u'\xe9tudes', u'pour', u'pouvoir', u'avoir', u'une', u'bonne', u'place', u'dans', u'mon', u'pays', u',', u'un', u'meilleur', u'salaire', u',', u'ce', u'projet', u',', u'me', u'prendra', u'bien', u'dix', u'ans', u'car', u'je', u'veux', u'faire', u'un', u'cycle', u'long', u'il', u'me', u'faut', u'du', u'courage', u',', u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence'] +suite + je voudrais être docteur pour obtenir des meilleures conditions de vie , les études sont longues et difficiles$ +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'm\xe9tier', u'bien', u',', u'arriver', u'\xe0', u'bien', u'nager', u',', u'mes', u'projets', u'sont', u'r\xe9alisables', u'car', u'modestes', u',', u'je', u'veux', u'aussi', u'une', u'grande', u'voili\xe8re', u',', u'ce', u'qu', u'il', u'faut', u'c', u'est', u'que', u'les', u'gens', u'soient', u'plus', u'attentifs', u'aux', u'autres', u'et', u'qu', u'ils', u'les', u'aident', u'pour', u'r\xe9aliser', u'leurs', u'projets'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'jusqu_au', u'baccalaur\xe9at', u'et', u'faire', u'un', u'boulot', u'qui', u'me', u'pla\xeet', u'je', u'veux', u'avoir', u'une', u'belle', u'voiture', u'de', u'sport', u',', u'une', u'femme', u'et', u'un', u'enfant', u'minimum'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'pense', u'rentrer', u'\xe0', u'l', u'\xe9cole', u'd', u'h\xf4telerie', u'et', u'essayer', u'd', u'avoir', u'un', u'bon', u'dipl\xf4me', u',', u'avoir', u'un', u'salaire', u'tr\xe8s', u'fort', u'et', u'travailler', u'dans', u'un', u'restaurant', u'comme', u'cuisinier', u'et', u'apprenti', u',', u'j', u'esp\xe8re', u'que', u'je', u'vais', u'faire', u'la', u'f\xeate', u'avant', u'de', u'me', u'marier'] +suite + après je profite de ma femme et je lui fais des enfants , après je deviens milliardaire , je prends la retraite anticipée , plein de filles et mourir sans regret$ +reste +True +texte_uce +[u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui', u'fais', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'faire', u'de', u'longues', u'\xe9tudes', u',', u'et', u'avoir', u'un', u'bon', u'm\xe9tier', u',', u'aussi', u'passer', u'mon', u'permis', u'un', u'appartement', u'\xeatre', u'ind\xe9pendante', u'et', u'avoir', u'un', u'chat', u',', u'il', u'ne', u'faut', u'pas', u'que', u'je', u'fasse', u'tout', u'en', u'm\xeame', u'temps', u'je', u'ne', u'veux', u'pas', u'me', u'sentir', u'bousculer'] +suite + pour la famille l idéal c est d avoir un mari et des enfants , après je mets de l argent de côté pour pouvoir partir en voyage . j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un', u'mari', u'et', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage'] +suite + j ai fais un voyage dernièrement et j aime bien , c est pour cela que je veux voyager , bon je veux faire des longues études dans le grand cycle , après je me marie mais je profite de la vie avant de m attacher$ +reste +True +texte_uce +[u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien', u',', u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'\xe9t\xe9', u'\xe0', u'l', u'h\xf4pital', u'et', u'l\xe0', u'j', u'ai', u'compris', u'que', u'les', u'm\xe9tiers', u'dans', u'le', u'sanitaire', u'c', u'\xe9tait', u'important', u',', u'essentiel', u'pour', u'la', u'soci\xe9t\xe9', u',', u'car', u'ils', u'savent', u'les', u'vies', u'et', u'\xe9vitent', u'les', u'malheurs', u',', u'c', u'est', u'pour', u'cela', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'infirmi\xe8re'] +suite + donc poursuivre mes études et me marier un jour et avoir des enfants$ +reste +True +texte_uce +[u'donc', u'poursuivre', u'mes', u'\xe9tudes', u'et', u'me', u'marier', u'un', u'jour', u'et', u'avoir', u'des', u'enfants'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'plus', u'tard', u'je', u'veux', u'devenir', u'styliste', u'car', u'la', u'mode', u'\xe7a', u'm', u'attire', u'bien', u',', u'je', u'veux', u'devenir', u'un', u'grand', u'styliste', u',', u'comme', u'tout', u'le', u'monde', u'je', u'veux', u'devenir', u'riche', u'et', u'vivre', u'sans', u'probl\xe8me', u',', u'je', u'suis', u'certaine', u'de', u'ne', u'pas', u'me', u'marier'] +suite + mais j ai tout de même une idée de l homme idéal grand brun yeux bleus musclé , beau quoi , je ne veux que deux enfants , je veux une grande maison , pas ici et même un autre maison , je veux faire le tour du monde , je veux une grande voiture , je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9', u',', u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture'] +suite + je veux rencontrer des stars du cinéma$ +reste +True +texte_uce +[u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'faire', u'des', u'\xe9tudes', u'dans', u'la', u'comptabilit\xe9', u',', u'et', u'dans', u'dix', u'ans', u'travailler', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'tout', u'de', u'suite', u'je', u'veux', u'avoir', u'un', u'appartement', u'pour', u'moi', u'seule', u'ou', u'avec', u'une', u'amie', u',', u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents'] +suite + je veux goûter la liberté sans les parents , ensuite continuer le travail même si je me marie$ +reste +True +texte_uce +[u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'aimerais', u'devenir', u'informaticienne', u',', u'je', u'l', u'ai', u'd\xe9cid\xe9', u'cette', u'ann\xe9e', u'car', u'dans', u'ma', u'classe', u'on', u'choisit', u'une', u'orientation', u'et', u'on', u'envisage', u'diff\xe9rents', u'm\xe9tiers', u'ils', u'vont', u'\xeatre', u'r\xe9alisables', u'dans', u'dix', u'ans', u'car', u'c', u'est', u'l\xe0', u'que', u'je', u'vais', u'avoir', u'fini', u'mes', u'\xe9tudes'] +suite + je voudrai aller aux jeux olympiques , je voudrais un garçon mais pas de mariage il faut avoir plus confiance aux jeunes pour leur permettre de réaliser leurs projets ne pas les diriger leur imposer ce qui n est pas nécessaire et qu ils ne veulent pas faire$ +reste +True +texte_uce +[u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques', u',', u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne'] +suite +veulent pas faire$ +reste +True +texte_uce +[u'veulent', u'pas', u'faire'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'un', u'an', u'je', u'pars', u'de', u'chez', u'moi', u',', u'je', u'passe', u'mon', u'permis', u'de', u'voiture', u'et', u'je', u'trouve', u'un', u'travail', u'je', u'loue', u'une', u'maison', u'et', u'je', u'passe', u'une', u'belle', u'vie', u'et', u'apr\xe8s', u'je', u'me', u'marie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'bon', u'm\xe9tier', u'dans', u'le', u'domaine', u'sportif', u',', u'avoir', u'beaucoup', u'd', u'argent', u'et', u'avoir', u'une', u'bonne', u'vie', u'de', u'famille', u',', u'plus', u'de', u'politique', u',', u'plus', u'de', u'clochards'] +suite + plus de famine plus de racisme pas de maçon qui ne gagnent pas leur vie à cause de l orientation dans le collège on gâche sa vie ce que je veux c est de bien me sentir dans ma peau$ +reste +True +texte_uce +[u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de', u'ma\xe7on', u'qui', u'ne', u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'commence', u'\xe0', u'avoir', u'des', u'projets', u'je', u'veux', u'un', u'boulot', u'qui', u'me', u'fasse', u'gagner', u'de', u'l', u'argent', u',', u'la', u'm\xe9decine', u',', u'je', u'vais', u'me', u'lancer', u'dans', u'le', u'sport', u'je', u'vais', u'm', u'inscrire', u'dans', u'un', u'grand', u'club', u',', u'faire', u'de', u'longues', u'\xe9tudes'] +suite + pour ma vie sentimental rencontrer des filles faire des connaissances agréables , je veux le permis , pour moi mes parents c est sacré je veux rester le plus longtemps avec eux$ +reste +True +texte_uce +[u'pour', u'ma', u'vie', u'sentimental', u'rencontrer', u'des', u'filles', u'faire', u'des', u'connaissances', u'agr\xe9ables', u',', u'je', u'veux', u'le', u'permis', u',', u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux', u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'ne', u'sais', u'rien', u'sur', u'mes', u'projets', u'je', u'ne', u'sais', u'pas', u'je', u'ne', u'sais', u'pas'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'de', u'projet', u'en', u'ce', u'moment', u'je', u'ne', u'pense', u'qu', u'aux', u'filles', u'je', u'ne', u'pense', u'qu', u'\xe0', u'cela', u'je', u'ne', u'pense', u'qu', u'aux', u'filles', u',', u'les', u'filles'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'je', u'pars', u'de', u'chez', u'moi', u',', u'et', u'je', u'passe', u'mon', u'permis', u'de', u'conduire', u'apr\xe8s', u'je', u'me', u'marie', u'et', u'je', u'pratique', u'\xe0', u'fond', u'la', u'religion', u'je', u'veux', u'profiter', u'de', u'la', u'vie', u'mais', u'apr\xe8s', u'c', u'est', u'l', u'enfer'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'femme', u'et', u'un', u'appartement', u',', u'pour', u'la', u'profession', u'je', u'voudrais', u'm', u'orienter', u'vers', u'une', u'formation', u'technique', u'pour', u'r\xe9aliser', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'apr\xe8s', u'quand', u'je', u'serai', u'vieux', u'je', u'veux', u'faire', u'le', u'p\xe8lerinage', u',', u'si', u'tout', u'va', u'bien'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'compte', u'faire', u'une', u'formation', u'technique', u'et', u'apr\xe8s', u'cette', u'formation', u'fonder', u'une', u'famille', u'et', u'avoir', u'une', u'voiture'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'\xe0', u'la', u'majorit\xe9', u',', u'je', u'veux', u'avoir', u'un', u'appartement', u',', u'je', u'ferai', u'des', u'petits', u'boulots', u'je', u'veux', u'mon', u'ind\xe9pendance', u',', u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'en', u'faisant', u'les', u'petits', u'boulots', u'une', u'formation', u'technique'] +suite + avec une bonne formation fonder une famille et essayer d être heureux$ +reste +True +texte_uce +[u'avec', u'une', u'bonne', u'formation', u'fonder', u'une', u'famille', u'et', u'essayer', u'd', u'\xeatre', u'heureux'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'voyager', u',', u'dans', u'tout', u'le', u'monde', u'avoir', u'plein', u'de', u'voitures', u'et', u'de', u'femmes', u'je', u'veux', u'\xeatre', u'riche', u'et', u'avoir', u'plein', u'de', u'femmes'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'professeur', u'de', u'physique', u'et', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'continue', u'mes', u'\xe9tudes', u',', u'ensuite', u'j', u'esp\xe8re', u'me', u'marier', u',', u'avoir', u'une', u'voiture', u'et', u'une', u'maison'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'un', u'bon', u'boulot', u'qui', u'me', u'rapporte', u'de', u'l', u'argent', u',', u'et', u'je', u'veux', u'pouvoir', u'faire', u'des', u'voyages', u',', u'je', u'veux', u'continuer', u'dans', u'la', u'danse', u'et', u'devenir', u'une', u'professionnel'] +suite + je veux continuer à garder des liens avec ma famille car elle est sacrée je veux aussi un super mari pour que ça se réalise il faut de la chance , il faut compter sur dieu$ +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'car', u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'toujours', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'au', u'niveau', u'de', u'mon', u'm\xe9tier', u'je', u'veux', u'faire', u'un', u'travail', u'social', u',', u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille', u'et', u'avoir', u'de', u'belles', u'maisons', u'j', u'esp\xe8re', u'voyager', u'dans', u'tout', u'le', u'monde'] +suite + je pense pouvoir réaliser tout cela par rapport à mon mariage$ +reste +True +texte_uce +[u'je', u'pense', u'pouvoir', u'r\xe9aliser', u'tout', u'cela', u'par', u'rapport', u'\xe0', u'mon', u'mariage'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'bonne', u'qualification', u'pour', u'le', u'm\xe9tier', u'et', u'\xe7a', u'sera', u'possible', u'si', u'je', u'continue', u'mes', u'\xe9tudes', u'apr\xe8s', u'cela', u'penser', u'\xe0', u'la', u'vie', u'sentimentale'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'pour', u'faire', u'de', u'l', u'anglais', u'ou', u'la', u'm\xe9decine'] +suite + il faut multiplier les centres de rencontre pour les jeunes je veux vivre dans un grand et beau pays dans un pays de la liberté je veux rencontrer des gens connus et me marier avec une vedette$ +reste +True +texte_uce +[u'il', u'faut', u'multiplier', u'les', u'centres', u'de', u'rencontre', u'pour', u'les', u'jeunes', u'je', u'veux', u'vivre', u'dans', u'un', u'grand', u'et', u'beau', u'pays', u'dans', u'un', u'pays', u'de', u'la', u'libert\xe9', u'je', u'veux', u'rencontrer', u'des', u'gens', u'connus', u'et', u'me', u'marier', u'avec', u'une', u'vedette'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'et', u'faire', u'un', u'travail', u'int\xe9ressant', u'et', u'qui', u'rapporte', u'de', u'l', u'argent', u',', u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille', u',', u'je', u'veux', u'vivre', u'dans', u'un', u'beau', u'pays', u'je', u'veux', u'beaucoup', u'voyager'] +suite + une fois bien profiter de la vie je pense faire des enfants et m en occuper , si je pouvais avoir plus de liberté pour plus profiter de la vie$ +reste +True +texte_uce +[u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense', u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper', u',', u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'une', u'danseuse', u'et', u'en', u'faire', u'mon', u'm\xe9tier', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'de', u'l', u'argent', u'sinon', u'je', u'vais', u'faire', u'un', u'travail', u'de', u'technique', u'en', u'biologie', u',', u'je', u'veux', u'me', u'marier', u'avec', u'un', u'super', u'mari', u'mais', u'je', u'n', u'ai', u'pas', u'trop', u'd', u'espoir', u'\xe0', u'ce', u'niveau', u'l\xe0'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'de', u'toute', u'fa\xe7on', u'\xe0', u'la', u'majorit\xe9', u'je', u'serai', u'libre', u'et', u'je', u'pourrais', u'faire', u'ce', u'qu', u'il', u'me', u'pla\xeet', u'm\xeame', u'si', u'j', u'ai', u'envie', u'de', u'passer', u'dans', u'une', u'autre', u'classe'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'pense', u'd_abord', u'faire', u'mes', u'\xe9tudes', u'une', u'formation', u'technique', u'dans', u'le', u'commerce', u',', u'quelque', u'chose', u'qui', u'soit', u'\xe0', u'la', u'port\xe9e', u'des', u'mes', u'propres', u'possibilit\xe9s'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'faire', u'un', u'travail', u'dans', u'le', u'social', u'commencer', u'par', u'une', u'pr\xe9paration', u'd', u'infirmi\xe8re', u'donc', u'continuer', u'mes', u'\xe9tudes', u'et', u'ensuite', u'faire', u'une', u'sp\xe9cialisation', u'par', u'rapport', u'aux', u'enfants', u',', u'je', u'pense', u'd_abord', u'\xe0', u'ma', u'vie', u'de', u'm\xe9tier', u',', u'le', u'reste', u'on', u'ne', u'sais', u'pas', u'vraiment'] +suite + le hasard , mais pour le métier , il faut travailler .$ +reste +True +texte_uce +[u'le', u'hasard', u',', u'mais', u'pour', u'le', u'm\xe9tier', u',', u'il', u'faut', u'travailler', u'.'] +suite + +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'l', u'habitude', u'de', u'faire', u'des', u'projets', u',', u'je', u'vis', u'au', u'jour', u'le', u'jour'] +suite +[u'les', u'adolescents', u'font', u'des', u'projets', u'\xe0', u'partir', u'du', u'moment', u'o\xf9', u'il', u'se', u'rendent', u'compte', u'qu', u'ils', u'ne', u'doivent', u'compter', u'que', u'sur', u'eux', u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il', u'?', u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'les', u'adolescents', u'font', u'des', u'projets', u'\xe0', u'partir', u'du', u'moment', u'o\xf9', u'il', u'se', u'rendent', u'compte', u'qu', u'ils', u'ne', u'doivent', u'compter', u'que', u'sur', u'eux', u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il'] +suite +[u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier'] +suite +[u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs'] +suite +[u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u',', u'devenir', u'un', u'jour', u'professeur', u'de', u'fran\xe7ais', u'ou', u'd', u'histoire', u'g\xe9ographie', u';', u'me', u'marier', u';', u'avoir', u'un', u'enfant', u'pas', u'plus', u',', u'faire', u'construire', u'une', u'maison', u'et', u'si', u'possible', u',', u'ne', u'pas', u'vivre', u'en', u'ville'] +suite +[u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne', u',', u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral', u',', u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne', u',', u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral'] +suite +[u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'seraient', u'de', u'devenir', u'v\xe9t\xe9rinaire', u',', u'd', u'avoir', u'une', u'belle', u'maison', u'\xe0', u'la', u'montagne', u'et', u'une', u'au', u'bord', u'de', u'la', u'mer', u',', u'avoir', u'une', u'femme', u'un', u'enfant', u',', u'une', u'grosse', u'voiture', u'de', u'sport', u'et', u'aussi', u'une', u'grosse', u'moto'] +suite +[u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition', u'.', u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine', u',', u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil', u'.', u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition', u'.', u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine', u',', u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil'] +suite +[u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'familiaux', u',', u'je', u'pense', u'ne', u'pas', u'me', u'marier', u'mais', u'avoir', u'des', u'enfants', u',', u'au', u'moins', u'deux', u'enfants', u',', u'vivre', u'avec', u'un', u'homme', u'soit', u'en', u'tant', u'que', u'mari', u',', u'soit', u'en', u'tant', u'que', u'concubin'] +suite +[u'je', u'ne', u'r\xe9aliserai', u'ces', u'projets', u'que', u'dans', u'douze', u'ans', u',', u'lorsque', u'j', u'aurai', u'un', u'm\xe9tier', u's\xfbr', u'et', u'une', u'situation', u'ais\xe9e', u'.', u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an', u'.', u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'r\xe9aliserai', u'ces', u'projets', u'que', u'dans', u'douze', u'ans', u',', u'lorsque', u'j', u'aurai', u'un', u'm\xe9tier', u's\xfbr', u'et', u'une', u'situation', u'ais\xe9e', u'.', u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an'] +suite +[u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier'] +suite +[u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable'] +suite +[u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler'] +suite +[u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9'] +suite +[u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'ce', u'que', u'je', u'veux', u'faire', u'comme', u'projet', u'depuis', u'toujours', u',', u'avoir', u'un', u'bon', u'm\xe9tier', u'qui', u'paie', u',', u'ne', u'pas', u'avoir', u'd', u'enfants', u',', u'ne', u'pas', u'me', u'marier', u',', u'avoir', u'mon', u'ind\xe9pendance', u',', u'avoir', u'une', u'super', u'voiture', u',', u'\xeatre', u'biologiste'] +suite +[u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans', u',', u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique', u',', u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans', u',', u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique', u',', u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement'] +suite +[u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois'] +suite +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'quatre', u'ou', u'trois', u'enfants', u',', u'mais', u'en', u'attendant', u',', u'je', u'veux', u'arriver', u'\xe0', u'mon', u'bac', u'professionnel', u',', u'enfin', u'continuer', u'mes', u'\xe9tudes', u',', u'avoir', u'un', u'bon', u'm\xe9tier'] +suite +[u'je', u'veux', u'en', u'premier', u'une', u'bonne', u'situation', u'puis', u'ensuite', u'fonder', u'une', u'famille', u'dans', u'au', u'moins', u'neuf', u'ans', u'.', u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures', u'.', u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel', u'.', u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'en', u'premier', u'une', u'bonne', u'situation', u'puis', u'ensuite', u'fonder', u'une', u'famille', u'dans', u'au', u'moins', u'neuf', u'ans', u'.', u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures'] +suite +[u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel', u'.', u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel', u'.', u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance'] +suite +[u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice'] +suite +[u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien'] +suite +[u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'concubinage', u'avec', u'des', u'gens', u'c\xe9l\xe8bre', u',', u'avoir', u'une', u'voiture', u'de', u'sport', u',', u'plusieurs', u'villas', u',', u'avec', u'mes', u'associ\xe9s', u'on', u'enqu\xeateraient', u'sur', u'les', u'vols', u',', u'je', u'veux', u'vivre', u'dans', u'une', u'\xeele', u'd\xe9sertes', u'avec', u'plein', u'de', u'mecs', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u'j', u'aimerai', u'rentrer', u'au', u'lyc\xe9e', u'pour', u'continuer', u'mes', u'\xe9tudes', u',', u'faire', u'de', u'l', u'\xe9lectronique', u',', u'apr\xe8s', u'si', u'je', u'r\xe9ussi', u'ces', u'premi\xe8res', u'\xe9tudes', u'je', u'compte', u'continuer', u'encore', u'deux', u'ans', u'dans', u'l', u'informatique', u',', u'\xeatre', u'technicien', u'sup\xe9rieur'] +suite +[u'il', u'n', u'y', u'a', u'pas', u'longtemps', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'cela', u',', u'l', u'ann\xe9e', u'derni\xe8re', u',', u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire', u',', u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel', u',', u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.', u'$'] +reste +True +texte_uce +[u'il', u'n', u'y', u'a', u'pas', u'longtemps', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'cela', u',', u'l', u'ann\xe9e', u'derni\xe8re', u',', u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire', u',', u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel'] +suite +[u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.', u'$'] +reste +True +texte_uce +[u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'continuer', u'mes', u'\xe9tudes', u',', u'mais', u'pas', u'trop', u'longtemps', u',', u'je', u'veux', u'passer', u'mon', u'brevet', u',', u'et', u'ensuite', u'voir', u'du', u'cot\xe9', u'd', u'une', u'formation', u'technique', u',', u'un', u'truc', u'de', u'm\xe9canicien', u',', u'enfin', u'des', u'\xe9tudes', u'pas', u'longues'] +suite +[u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier', u',', u'apr\xe8s', u'mes', u'\xe9tudes', u',', u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une', u'ou', u'plein', u'de', u'voitures', u'.', u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier', u',', u'apr\xe8s', u'mes', u'\xe9tudes', u',', u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une', u'ou', u'plein', u'de', u'voitures'] +suite +[u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u',', u'je', u'voudrais', u'bien', u'continuer', u'un', u'petit', u'peu', u'mes', u'\xe9tudes', u',', u'mais', u'pas', u'trop', u'longtemps', u',', u'je', u'ne', u'suis', u'pas', u'tr\xe8s', u'bon', u'\xe0', u'l', u'\xe9cole', u',', u'enfin', u'je', u'ne', u'sais', u'pas', u'trop', u'ce', u'que', u'je', u'vais', u'faire', u'au', u'niveau', u'professionnel', u',', u'parce_que', u'\xe0', u'l', u'\xe9cole', u'je', u'ne', u'suis', u'pas', u'bon'] +suite +[u'au', u'niveau', u'sentimental', u',', u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum', u',', u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier', u',', u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable', u'$'] +reste +True +texte_uce +[u'au', u'niveau', u'sentimental', u',', u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum', u',', u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier', u',', u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u',', u'je', u'voudrais', u'bien', u'rentrer', u'en', u'seconde', u',', u'et', u'puis', u'continuer', u'mes', u'\xe9tudes', u',', u'rentrer', u'\xe0', u'la', u'facult\xe9', u',', u'ou', u'bien', u'dans', u'une', u'formation', u'plus', u'technique', u',', u'enfin', u'le', u'minimum', u'c', u'est', u'd', u'avoir', u'mon', u'baccalaur\xe9at'] +suite +[u'c', u'est', u'mon', u'premier', u'projet', u',', u'pour', u'le', u'choix', u'professionnel', u',', u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'c', u'est', u'mon', u'premier', u'projet', u',', u'pour', u'le', u'choix', u'professionnel', u',', u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider'] +suite +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier'] +suite +[u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u',', u'je', u'compte', u'rentrer', u'au', u'lyc\xe9e', u'pour', u'pr\xe9parer', u'un', u'bac', u'technique', u',', u'apr\xe8s', u'je', u'compte', u'faire', u'une', u'formation', u'technique', u',', u'mais', u'je', u'ne', u'sais', u'pas', u'encore', u'vraiment', u'ce', u'que', u'je', u'veux', u'faire', u',', u'je', u'suis', u'assez', u'bon', u'dans', u'la', u'm\xe9canique', u',', u'certainement', u'que', u'je', u'vais', u'essayer', u'de', u'travailler', u'de', u'ce', u'cot\xe9'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'au', u'niveau', u'professionnel', u',', u'le', u'minimum', u'pour', u'l', u'instant', u'c', u'est', u'de', u'passer', u'mon', u'brevet', u',', u'en', u'cas', u'de', u'r\xe9ussite', u',', u'et', u'je', u'pense', u'que', u'\xe7a', u'va', u'marcher', u',', u'continuer', u'au', u'lyc\xe9e'] +suite +[u'je', u'voudrais', u'bien', u'devenir', u'professeur', u'de', u'math\xe9matique', u'ou', u'de', u'gymnastique', u',', u'enfin', u'un', u'truc', u'dans', u'ce', u'style', u',', u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'devenir', u'professeur', u'de', u'math\xe9matique', u'ou', u'de', u'gymnastique', u',', u'enfin', u'un', u'truc', u'dans', u'ce', u'style', u',', u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport'] +suite +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'vivre', u'loin', u'de', u'la', u'ville', u'dans', u'une', u'\xeele', u'd\xe9serte', u',', u'avec', u'de', u'super', u'appareils', u'de', u'musique', u',', u'et', u'une', u'image', u'grand', u'\xe9cran', u'en', u'direct', u'du', u'festival', u',', u'rien', u'que', u'musique', u'et', u'image'] +suite +[u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille', u',', u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela', u'.', u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille', u',', u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela', u'.', u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets'] +suite +[u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'au', u'moins', u'des', u'enfants', u',', u'mais', u'en', u'attendant', u',', u'je', u'veux', u'arriver', u'\xe0', u'une', u'profession', u'par', u'rapport', u'au', u'baccalaur\xe9at', u'technique', u'que', u'je', u'veux', u'passer', u',', u'en', u'premier', u',', u'une', u'bonne', u'situation', u',', u'et', u'apr\xe8s', u'fonder', u'une', u'famille', u',', u'\xe7a', u'il', u'me', u'faudra', u'bien', u'une', u'dizaine', u'd', u'ann\xe9es'] +suite +[u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident', u'.', u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident', u'.', u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9'] +suite +[u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'familiale', u',', u'je', u'pense', u'pas', u'que', u'je', u'vais', u'me', u'marier', u',', u'mais', u'je', u'veux', u'tout', u'de', u'm\xeame', u'avoir', u'des', u'enfants', u'et', u'puis', u'vivre', u'avec', u'un', u'homme', u',', u'mais', u'je', u'veux', u'garder', u'mon', u'ind\xe9pendance', u',', u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'pense', u'\xe0', u'tout', u'\xe7a', u',', u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier'] +suite +[u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc'] +suite +[u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'compte', u'surtout', u'avoir', u'mon', u'ind\xe9pendance', u',', u'pour', u'\xe7a', u'il', u'y', u'a', u'pas', u'de', u'myst\xe8re', u',', u'il', u'faut', u'que', u'je', u'travaille', u'par', u'rapport', u'aux', u'\xe9tudes', u',', u'passer', u'mon', u'brevet', u',', u'ensuite', u'aller', u'jusqu_\xe0', u'la', u'terminale', u'et', u'pr\xe9parer', u'une', u'formation', u'technique'] +suite +[u'je', u'pense', u'\xe0', u'l', u'informatique', u',', u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle', u'.', u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets', u'.', u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'je', u'pense', u'\xe0', u'l', u'informatique', u',', u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle', u'.', u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets'] +suite +[u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u',', u'je', u'compte', u'me', u'consacrer', u'enti\xe8rement', u'\xe0', u'ma', u'famille', u',', u'\xe0', u'mes', u'enfants', u'et', u'\xe0', u'mon', u'mari', u',', u'je', u'veux', u'pouvoir', u'l', u'aider', u'dans', u'son', u'travail', u',', u'travailler', u'avec', u'lui'] +suite +[u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille', u',', u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille', u',', u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants'] +suite +[u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi'] +suite +[u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u',', u'je', u'compte', u'devenir', u'officier', u'de', u'la', u'paix', u',', u'j', u'aurais', u'voulu', u'devenir', u'sportif', u',', u'plus', u'particuli\xe8rement', u'dans', u'le', u'football', u',', u'mais', u'devenir', u'flic', u',', u'c', u'est', u'plus', u'passionnant'] +suite +[u'dans', u'cinq', u'ans', u',', u'je', u'compte', u'me', u'marier', u'avec', u'une', u'femme', u'brune', u'qui', u'aura', u'de', u'beaux', u'yeux', u',', u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et', u'belle', u'physiquement', u',', u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants', u',', u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u',', u'je', u'compte', u'me', u'marier', u'avec', u'une', u'femme', u'brune', u'qui', u'aura', u'de', u'beaux', u'yeux', u',', u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et', u'belle', u'physiquement', u',', u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants'] +suite +[u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'travail', u',', u'le', u'faire', u'pendant', u'deux', u'ans', u',', u'puis', u'avoir', u'un', u'accident', u'du', u'travail', u'pour', u'toucher', u'de', u'l', u'argent', u'tranquillement'] +suite +[u'je', u'veux', u'me', u'marier', u'cinq', u'fois', u',', u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures', u',', u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir', u',', u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail', u',', u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'cinq', u'fois', u',', u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures', u',', u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir', u',', u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail'] +suite +[u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avec', u'une', u'jolie', u'femme', u'qui', u'soit', u'aimable', u',', u'faire', u'du', u'sport', u'de', u'temps', u'en', u'temps', u',', u'je', u'veux', u'faire', u'professeur', u'de', u'math\xe9matiques', u',', u'quelque', u'chose', u'qui', u'se', u'rapproche', u'de', u'cela', u',', u'avoir', u'de', u'bonnes', u'relations', u'avec', u'mes', u'parents', u',', u'rester', u'avec', u'eux', u'le', u'plus', u'de', u'temps', u'possible'] +suite +[u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer', u'$'] +reste +True +texte_uce +[u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'faire', u'des', u'voyages', u',', u'voir', u'beaucoup', u'de', u'monde', u',', u'faire', u'des', u'choses', u'uniques', u'dans', u'tous', u'les', u'domaines', u',', u'ne', u'pas', u'faire', u'comme', u'tout', u'le', u'monde', u',', u'laisser', u'quelque', u'chose', u'derri\xe8re', u'moi', u',', u'j', u'aimerais', u'faire', u'un', u'm\xe9tier', u'qui', u'serve', u'\xe0', u'quelque', u'chose'] +suite +[u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant', u',', u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent', u',', u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant', u',', u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent'] +suite +[u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'tout', u'd_abord', u'avoir', u'une', u'bonne', u'situation', u'professionnel', u'et', u'stable', u',', u'je', u'voudrais', u'aussi', u'vivre', u'avec', u'ma', u'm\xe8re', u',', u'car', u'mes', u'parents', u'sont', u'divorc\xe9s', u',', u'et', u'je', u'vis', u'avec', u'mon', u'p\xe8re', u',', u'j', u'aimerais', u'faire', u'un', u'travail', u'avec', u'des', u'jeunes', u'enfants'] +suite +[u'dans', u'ma', u'vie', u'sentimentale', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'dans', u'ma', u'vie', u'sentimentale', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'rester', u'c\xe9libataire', u'et', u'vivre', u'en', u'concubinage', u',', u'je', u'ne', u'veux', u'pas', u'd', u'enfants', u'car', u'pour', u'moi', u'c', u'est', u'une', u'contrainte', u',', u'je', u'veux', u'au', u'niveau', u'professionnel', u'devenir', u'kin\xe9sith\xe9rapeute', u',', u'car', u'c', u'est', u'un', u'milieu', u'o\xf9', u'on', u'a', u'le', u'contact', u'avec', u'le', u'milieu', u'sportif'] +suite +[u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir', u',', u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir', u',', u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football'] +suite +[u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'est', u'pas', u'de', u'projet', u'de', u'vie', u',', u'je', u'verrai', u'bien', u'ce', u'que', u'me', u'r\xe9serve', u'le', u'cours', u'de', u'la', u'vie', u',', u'avant', u'de', u'penser', u'\xe0', u'tout', u'cela', u',', u'il', u'faut', u'que', u'je', u'profite', u'de', u'la', u'vie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'passer', u'mon', u'bac', u'et', u'r\xe9ussir', u'dans', u'le', u'domaine', u'artistique'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'vais', u'essayer', u'd', u'avoir', u'mon', u'brevet', u',', u'apr\xe8s', u'je', u'passe', u'le', u'concours', u'de', u'la', u'gendarmerie', u',', u'et', u'le', u'concours', u'\xe0', u'l', u'arm\xe9e', u',', u'je', u'veux', u'r\xe9ussir', u'dans', u'le', u'domaine', u'sportif', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'devenir', u'v\xe9t\xe9rinaire', u',', u'j', u'y', u'pense', u'depuis', u'six', u'ans'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'sur', u'le', u'plan', u'familial', u',', u'je', u'veux', u'rester', u'c\xe9libataire', u'le', u'plus', u'longtemps', u'possible', u',', u'\xe9ventuellement', u'avoir', u'des', u'enfants', u'mais', u'dans', u'vingt', u'ans', u',', u'je', u'veux', u'avoir', u'un', u'boulot', u'int\xe9ressant', u',', u'pratiquer', u'un', u'sport', u'r\xe9guli\xe8rement', u',', u'je', u'n', u'ai', u'jamais', u'eu', u'l', u'intention', u'd', u'avoir', u'des', u'enfants'] +suite +[u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent', u'$'] +reste +True +texte_uce +[u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'quand', u'j', u'aurai', u'trouver', u'l', u'homme', u'id\xe9al', u',', u'je', u'veux', u'me', u'marier', u'avoir', u'des', u'enfants', u'et', u'une', u'belle', u'maison', u',', u'je', u'voudrais', u'travailler', u'dans', u'le', u'professionnel', u'de', u'la', u'publicit\xe9', u',', u'le', u'dessin', u',', u'mais', u'je', u'n', u'ai', u'pas', u'de', u'bons', u'r\xe9sultats'] +suite +[u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison', u',', u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9', u',', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison', u',', u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9'] +suite +[u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'mon', u'baccalaur\xe9at', u'avoir', u'un', u'bon', u'm\xe9tier', u',', u'continuer', u'le', u'patinage', u',', u'vivre', u'heureuse', u',', u'\xeatre', u'heureuse', u',', u'tout', u'\xe7a', u'dans', u'une', u'dizaine', u'd', u'ann\xe9es'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'un', u'bon', u'brevet', u',', u'pas', u'de', u'diff\xe9rence', u'entre', u'le', u'beau', u'et', u'le', u'laid', u',', u'pas', u'de', u'diff\xe9rence', u'entre', u'les', u'filles', u'et', u'les', u'gar\xe7ons', u'et', u'que', u'les', u'gens', u'ne', u'jugent', u'pas'] +suite +[u'je', u'ne', u'sais', u'pas', u'je', u'voudrais', u'qu', u'il', u'n', u'y', u'ait', u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent', u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes', u',', u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'sais', u'pas', u'je', u'voudrais', u'qu', u'il', u'n', u'y', u'ait', u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent', u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes', u',', u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'dix', u'ans', u'que', u'je', u'pense', u'continuer', u'mes', u'\xe9tudes', u'pour', u'pouvoir', u'avoir', u'une', u'bonne', u'place', u'dans', u'mon', u'pays', u',', u'un', u'meilleur', u'salaire', u',', u'ce', u'projet', u',', u'me', u'prendra', u'bien', u'dix', u'ans', u'car', u'je', u'veux', u'faire', u'un', u'cycle', u'long', u'il', u'me', u'faut', u'du', u'courage'] +suite +[u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence', u',', u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles', u'$'] +reste +True +texte_uce +[u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence', u',', u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'm\xe9tier', u'bien', u',', u'arriver', u'\xe0', u'bien', u'nager', u',', u'mes', u'projets', u'sont', u'r\xe9alisables', u'car', u'modestes', u',', u'je', u'veux', u'aussi', u'une', u'grande', u'voili\xe8re', u',', u'ce', u'qu', u'il', u'faut', u'c', u'est', u'que', u'les', u'gens', u'soient', u'plus', u'attentifs', u'aux', u'autres', u'et', u'qu', u'ils', u'les', u'aident', u'pour', u'r\xe9aliser', u'leurs', u'projets'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'jusqu_au', u'baccalaur\xe9at', u'et', u'faire', u'un', u'boulot', u'qui', u'me', u'pla\xeet', u'je', u'veux', u'avoir', u'une', u'belle', u'voiture', u'de', u'sport', u',', u'une', u'femme', u'et', u'un', u'enfant', u'minimum'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'pense', u'rentrer', u'\xe0', u'l', u'\xe9cole', u'd', u'h\xf4telerie', u'et', u'essayer', u'd', u'avoir', u'un', u'bon', u'dipl\xf4me', u',', u'avoir', u'un', u'salaire', u'tr\xe8s', u'fort', u'et', u'travailler', u'dans', u'un', u'restaurant', u'comme', u'cuisinier', u'et', u'apprenti', u',', u'j', u'esp\xe8re', u'que', u'je', u'vais', u'faire', u'la', u'f\xeate', u'avant', u'de', u'me', u'marier'] +suite +[u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui', u'fais', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui', u'fais', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'faire', u'de', u'longues', u'\xe9tudes', u',', u'et', u'avoir', u'un', u'bon', u'm\xe9tier', u',', u'aussi', u'passer', u'mon', u'permis', u'un', u'appartement', u'\xeatre', u'ind\xe9pendante', u'et', u'avoir', u'un', u'chat', u',', u'il', u'ne', u'faut', u'pas', u'que', u'je', u'fasse', u'tout', u'en', u'm\xeame', u'temps', u'je', u'ne', u'veux', u'pas', u'me', u'sentir', u'bousculer'] +suite +[u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un', u'mari', u'et', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage', u'.', u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien', u',', u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un', u'mari', u'et', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage', u'.', u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien'] +suite +[u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'\xe9t\xe9', u'\xe0', u'l', u'h\xf4pital', u'et', u'l\xe0', u'j', u'ai', u'compris', u'que', u'les', u'm\xe9tiers', u'dans', u'le', u'sanitaire', u'c', u'\xe9tait', u'important', u',', u'essentiel', u'pour', u'la', u'soci\xe9t\xe9', u',', u'car', u'ils', u'savent', u'les', u'vies', u'et', u'\xe9vitent', u'les', u'malheurs'] +suite +[u'c', u'est', u'pour', u'cela', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'infirmi\xe8re', u',', u'donc', u'poursuivre', u'mes', u'\xe9tudes', u'et', u'me', u'marier', u'un', u'jour', u'et', u'avoir', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'c', u'est', u'pour', u'cela', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'infirmi\xe8re', u',', u'donc', u'poursuivre', u'mes', u'\xe9tudes', u'et', u'me', u'marier', u'un', u'jour', u'et', u'avoir', u'des', u'enfants'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'plus', u'tard', u'je', u'veux', u'devenir', u'styliste', u'car', u'la', u'mode', u'\xe7a', u'm', u'attire', u'bien', u',', u'je', u'veux', u'devenir', u'un', u'grand', u'styliste', u',', u'comme', u'tout', u'le', u'monde', u'je', u'veux', u'devenir', u'riche', u'et', u'vivre', u'sans', u'probl\xe8me', u',', u'je', u'suis', u'certaine', u'de', u'ne', u'pas', u'me', u'marier'] +suite +[u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9', u',', u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9', u',', u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison'] +suite +[u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'faire', u'des', u'\xe9tudes', u'dans', u'la', u'comptabilit\xe9', u',', u'et', u'dans', u'dix', u'ans', u'travailler', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'tout', u'de', u'suite', u'je', u'veux', u'avoir', u'un', u'appartement', u'pour', u'moi', u'seule', u'ou', u'avec', u'une', u'amie'] +suite +[u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents', u',', u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie', u'$'] +reste +True +texte_uce +[u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents', u',', u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'aimerais', u'devenir', u'informaticienne', u',', u'je', u'l', u'ai', u'd\xe9cid\xe9', u'cette', u'ann\xe9e', u'car', u'dans', u'ma', u'classe', u'on', u'choisit', u'une', u'orientation', u'et', u'on', u'envisage', u'diff\xe9rents', u'm\xe9tiers', u'ils', u'vont', u'\xeatre', u'r\xe9alisables', u'dans', u'dix', u'ans', u'car', u'c', u'est', u'l\xe0', u'que', u'je', u'vais', u'avoir', u'fini', u'mes', u'\xe9tudes'] +suite +[u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques', u',', u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques', u',', u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'un', u'an', u'je', u'pars', u'de', u'chez', u'moi', u',', u'je', u'passe', u'mon', u'permis', u'de', u'voiture', u'et', u'je', u'trouve', u'un', u'travail', u'je', u'loue', u'une', u'maison', u'et', u'je', u'passe', u'une', u'belle', u'vie', u'et', u'apr\xe8s', u'je', u'me', u'marie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'bon', u'm\xe9tier', u'dans', u'le', u'domaine', u'sportif', u',', u'avoir', u'beaucoup', u'd', u'argent', u'et', u'avoir', u'une', u'bonne', u'vie', u'de', u'famille', u',', u'plus', u'de', u'politique', u',', u'plus', u'de', u'clochards'] +suite +[u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de', u'ma\xe7on', u'qui', u'ne', u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau', u'$'] +reste +True +texte_uce +[u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de', u'ma\xe7on', u'qui', u'ne', u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'commence', u'\xe0', u'avoir', u'des', u'projets', u'je', u'veux', u'un', u'boulot', u'qui', u'me', u'fasse', u'gagner', u'de', u'l', u'argent', u',', u'la', u'm\xe9decine', u',', u'je', u'vais', u'me', u'lancer', u'dans', u'le', u'sport', u'je', u'vais', u'm', u'inscrire', u'dans', u'un', u'grand', u'club'] +suite +[u'faire', u'de', u'longues', u'\xe9tudes', u',', u'pour', u'ma', u'vie', u'sentimental', u'rencontrer', u'des', u'filles', u'faire', u'des', u'connaissances', u'agr\xe9ables', u',', u'je', u'veux', u'le', u'permis', u',', u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux', u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux', u'$'] +reste +True +texte_uce +[u'faire', u'de', u'longues', u'\xe9tudes', u',', u'pour', u'ma', u'vie', u'sentimental', u'rencontrer', u'des', u'filles', u'faire', u'des', u'connaissances', u'agr\xe9ables', u',', u'je', u'veux', u'le', u'permis', u',', u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux', u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'ne', u'sais', u'rien', u'sur', u'mes', u'projets', u'je', u'ne', u'sais', u'pas', u'je', u'ne', u'sais', u'pas'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'de', u'projet', u'en', u'ce', u'moment', u'je', u'ne', u'pense', u'qu', u'aux', u'filles', u'je', u'ne', u'pense', u'qu', u'\xe0', u'cela', u'je', u'ne', u'pense', u'qu', u'aux', u'filles', u',', u'les', u'filles'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'je', u'pars', u'de', u'chez', u'moi', u',', u'et', u'je', u'passe', u'mon', u'permis', u'de', u'conduire', u'apr\xe8s', u'je', u'me', u'marie', u'et', u'je', u'pratique', u'\xe0', u'fond', u'la', u'religion', u'je', u'veux', u'profiter', u'de', u'la', u'vie', u'mais', u'apr\xe8s', u'c', u'est', u'l', u'enfer'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'femme', u'et', u'un', u'appartement', u',', u'pour', u'la', u'profession', u'je', u'voudrais', u'm', u'orienter', u'vers', u'une', u'formation', u'technique', u'pour', u'r\xe9aliser', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'apr\xe8s', u'quand', u'je', u'serai', u'vieux', u'je', u'veux', u'faire', u'le', u'p\xe8lerinage', u',', u'si', u'tout', u'va', u'bien'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'compte', u'faire', u'une', u'formation', u'technique', u'et', u'apr\xe8s', u'cette', u'formation', u'fonder', u'une', u'famille', u'et', u'avoir', u'une', u'voiture'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'\xe0', u'la', u'majorit\xe9', u',', u'je', u'veux', u'avoir', u'un', u'appartement', u',', u'je', u'ferai', u'des', u'petits', u'boulots', u'je', u'veux', u'mon', u'ind\xe9pendance', u',', u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'en', u'faisant', u'les', u'petits', u'boulots', u'une', u'formation', u'technique', u',', u'avec', u'une', u'bonne', u'formation', u'fonder', u'une', u'famille', u'et', u'essayer', u'd', u'\xeatre', u'heureux'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'voyager', u',', u'dans', u'tout', u'le', u'monde', u'avoir', u'plein', u'de', u'voitures', u'et', u'de', u'femmes', u'je', u'veux', u'\xeatre', u'riche', u'et', u'avoir', u'plein', u'de', u'femmes'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'professeur', u'de', u'physique', u'et', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'continue', u'mes', u'\xe9tudes', u',', u'ensuite', u'j', u'esp\xe8re', u'me', u'marier', u',', u'avoir', u'une', u'voiture', u'et', u'une', u'maison'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'un', u'bon', u'boulot', u'qui', u'me', u'rapporte', u'de', u'l', u'argent', u',', u'et', u'je', u'veux', u'pouvoir', u'faire', u'des', u'voyages', u',', u'je', u'veux', u'continuer', u'dans', u'la', u'danse', u'et', u'devenir', u'une', u'professionnel'] +suite +[u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'car', u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'car', u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'toujours', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'au', u'niveau', u'de', u'mon', u'm\xe9tier', u'je', u'veux', u'faire', u'un', u'travail', u'social', u',', u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille', u'et', u'avoir', u'de', u'belles', u'maisons', u'j', u'esp\xe8re', u'voyager', u'dans', u'tout', u'le', u'monde', u',', u'je', u'pense', u'pouvoir', u'r\xe9aliser', u'tout', u'cela', u'par', u'rapport', u'\xe0', u'mon', u'mariage'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'bonne', u'qualification', u'pour', u'le', u'm\xe9tier', u'et', u'\xe7a', u'sera', u'possible', u'si', u'je', u'continue', u'mes', u'\xe9tudes', u'apr\xe8s', u'cela', u'penser', u'\xe0', u'la', u'vie', u'sentimentale'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'pour', u'faire', u'de', u'l', u'anglais', u'ou', u'la', u'm\xe9decine', u',', u'il', u'faut', u'multiplier', u'les', u'centres', u'de', u'rencontre', u'pour', u'les', u'jeunes', u'je', u'veux', u'vivre', u'dans', u'un', u'grand', u'et', u'beau', u'pays', u'dans', u'un', u'pays', u'de', u'la', u'libert\xe9', u'je', u'veux', u'rencontrer', u'des', u'gens', u'connus', u'et', u'me', u'marier', u'avec', u'une', u'vedette'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'et', u'faire', u'un', u'travail', u'int\xe9ressant', u'et', u'qui', u'rapporte', u'de', u'l', u'argent', u',', u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille', u',', u'je', u'veux', u'vivre', u'dans', u'un', u'beau', u'pays', u'je', u'veux', u'beaucoup', u'voyager'] +suite +[u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense', u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper', u',', u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie', u'$'] +reste +True +texte_uce +[u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense', u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper', u',', u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'une', u'danseuse', u'et', u'en', u'faire', u'mon', u'm\xe9tier', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'de', u'l', u'argent', u'sinon', u'je', u'vais', u'faire', u'un', u'travail', u'de', u'technique', u'en', u'biologie', u',', u'je', u'veux', u'me', u'marier', u'avec', u'un', u'super', u'mari', u'mais', u'je', u'n', u'ai', u'pas', u'trop', u'd', u'espoir', u'\xe0', u'ce', u'niveau', u'l\xe0'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'de', u'toute', u'fa\xe7on', u'\xe0', u'la', u'majorit\xe9', u'je', u'serai', u'libre', u'et', u'je', u'pourrais', u'faire', u'ce', u'qu', u'il', u'me', u'pla\xeet', u'm\xeame', u'si', u'j', u'ai', u'envie', u'de', u'passer', u'dans', u'une', u'autre', u'classe'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'pense', u'd_abord', u'faire', u'mes', u'\xe9tudes', u'une', u'formation', u'technique', u'dans', u'le', u'commerce', u',', u'quelque', u'chose', u'qui', u'soit', u'\xe0', u'la', u'port\xe9e', u'des', u'mes', u'propres', u'possibilit\xe9s'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'faire', u'un', u'travail', u'dans', u'le', u'social', u'commencer', u'par', u'une', u'pr\xe9paration', u'd', u'infirmi\xe8re', u'donc', u'continuer', u'mes', u'\xe9tudes', u'et', u'ensuite', u'faire', u'une', u'sp\xe9cialisation', u'par', u'rapport', u'aux', u'enfants', u',', u'je', u'pense', u'd_abord', u'\xe0', u'ma', u'vie', u'de', u'm\xe9tier', u',', u'le', u'reste', u'on', u'ne', u'sais', u'pas', u'vraiment'] +suite +[u'le', u'hasard', u',', u'mais', u'pour', u'le', u'm\xe9tier', u',', u'il', u'faut', u'travailler', u'.', u'$'] +reste +True +texte_uce +[u'le', u'hasard', u',', u'mais', u'pour', u'le', u'm\xe9tier', u',', u'il', u'faut', u'travailler', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'l', u'habitude', u'de', u'faire', u'des', u'projets'] +suite +[u'je', u'vis', u'au', u'jour', u'le', u'jour', u'.', u'les', u'adolescents', u'font', u'des', u'projets', u'\xe0', u'partir', u'du', u'moment', u'o\xf9', u'il', u'se', u'rendent', u'compte', u'qu', u'ils', u'ne', u'doivent', u'compter', u'que', u'sur', u'eux', u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il', u'?', u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'je', u'vis', u'au', u'jour', u'le', u'jour'] +suite +[u'les', u'adolescents', u'font', u'des', u'projets', u'\xe0', u'partir', u'du', u'moment', u'o\xf9', u'il', u'se', u'rendent', u'compte', u'qu', u'ils', u'ne', u'doivent', u'compter', u'que', u'sur', u'eux', u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il', u'?', u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'les', u'adolescents', u'font', u'des', u'projets', u'\xe0', u'partir', u'du', u'moment', u'o\xf9'] +suite +[u'se', u'rendent', u'compte', u'qu', u'ils', u'ne', u'doivent', u'compter', u'que', u'sur', u'eux', u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il', u'?', u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'se', u'rendent', u'compte', u'qu', u'ils', u'ne', u'doivent', u'compter', u'que', u'sur'] +suite +[u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il', u'?', u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'm\xeame', u'et', u'qu', u'ils', u'doivent', u'se', u'prendre', u'en', u'charge', u'de', u'quel', u'genre', u'de', u'projets', u's', u'agit', u'il'] +suite +[u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile', u',', u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'projet', u'pour', u'mon', u'm\xe9tier', u',', u'une', u'vie', u'assez', u'facile'] +suite +[u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison', u',', u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'sans', u'trop', u'd', u'argent', u'ni', u'trop', u'peu', u',', u'une', u'maison'] +suite +[u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier', u'.', u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'une', u'voiture', u',', u'une', u'moto', u',', u'tout', u'\xe7a', u'gr\xe2ce', u'\xe0', u'la', u'police', u',', u'car', u'je', u'veux', u'devenir', u'policier'] +suite +[u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps', u'.', u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'projet', u'sentimental', u',', u'en', u'ce', u'moment', u',', u'je', u'suis', u'avec', u'une', u'fille', u'ceci', u'depuis', u'9', u'mois', u',', u'et', u'je', u'veux', u'que', u'cela', u'dure', u'encore', u'longtemps'] +suite +[u'projets', u'futurs', u':', u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'projets', u'futurs'] +suite +[u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde', u',', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'avoir', u'mon', u'brevet', u'du', u'coll\xe8ge', u',', u'passer', u'en', u'seconde'] +suite +[u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour', u'que', u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'actuelle', u'pour'] +suite +[u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager', u'$'] +reste +True +texte_uce +[u'nos', u'projets', u'soient', u'r\xe9alisables', u'c', u'est', u'avoir', u'\xe0', u'coeur', u'ce', u'que', u'l', u'on', u'veut', u'faire', u'ne', u'jamais', u'y', u'renoncer', u',', u'ne', u'jamais', u'se', u'd\xe9courager'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u',', u'devenir', u'un', u'jour', u'professeur', u'de', u'fran\xe7ais', u'ou', u'd', u'histoire', u'g\xe9ographie'] +suite +[u'me', u'marier', u';', u'avoir', u'un', u'enfant', u'pas', u'plus', u',', u'faire', u'construire', u'une', u'maison', u'et', u'si', u'possible', u',', u'ne', u'pas', u'vivre', u'en', u'ville', u',', u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne', u',', u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral', u',', u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'me', u'marier'] +suite +[u'avoir', u'un', u'enfant', u'pas', u'plus', u',', u'faire', u'construire', u'une', u'maison', u'et', u'si', u'possible', u',', u'ne', u'pas', u'vivre', u'en', u'ville', u',', u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne', u',', u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral', u',', u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'avoir', u'un', u'enfant', u'pas', u'plus', u',', u'faire', u'construire', u'une', u'maison', u'et', u'si', u'possible'] +suite +[u'ne', u'pas', u'vivre', u'en', u'ville', u',', u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne', u',', u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral', u',', u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'vivre', u'en', u'ville', u',', u'plut\xf4t', u'dans', u'l', u'agglom\xe9ration', u'et', u'm\xeame', u'\xe0', u'la', u'campagne'] +suite +[u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral', u',', u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'passer', u'mon', u'permis', u'de', u'conduire', u',', u'avoir', u'une', u'ou', u'plusieurs', u'voitures'] +suite +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral', u',', u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9ussir', u'leurs', u'projets', u'plus', u'facilement', u'il', u'faudrait', u'd_abord', u'que', u'la', u'vie', u'en', u'g\xe9n\xe9ral'] +suite +[u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.', u'$'] +reste +True +texte_uce +[u'devienne', u'moins', u'dure', u'et', u'moins', u'ch\xe8re', u'que', u'les', u'jeunes', u'des', u'le', u'd\xe9part', u'ne', u'soient', u'pas', u'oblig\xe9s', u'\xe0', u'prendre', u'des', u'cr\xe9dits', u'pour', u'tout', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'seraient', u'de', u'devenir', u'v\xe9t\xe9rinaire'] +suite +[u'd', u'avoir', u'une', u'belle', u'maison', u'\xe0', u'la', u'montagne', u'et', u'une', u'au', u'bord', u'de', u'la', u'mer', u',', u'avoir', u'une', u'femme', u'un', u'enfant', u',', u'une', u'grosse', u'voiture', u'de', u'sport', u'et', u'aussi', u'une', u'grosse', u'moto', u'.', u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition', u'.', u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine', u',', u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil', u'.', u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'd', u'avoir', u'une', u'belle', u'maison', u'\xe0', u'la', u'montagne', u'et', u'une', u'au', u'bord', u'de', u'la', u'mer'] +suite +[u'avoir', u'une', u'femme', u'un', u'enfant', u',', u'une', u'grosse', u'voiture', u'de', u'sport', u'et', u'aussi', u'une', u'grosse', u'moto', u'.', u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition', u'.', u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine', u',', u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil', u'.', u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'avoir', u'une', u'femme', u'un', u'enfant', u',', u'une', u'grosse', u'voiture', u'de', u'sport', u'et', u'aussi', u'une', u'grosse', u'moto'] +suite +[u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition', u'.', u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine', u',', u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil', u'.', u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'aussi', u'de', u'sport', u'et', u'aussi', u'de', u'comp\xe9tition'] +suite +[u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine', u',', u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil', u'.', u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'devenir', u'champion', u'de', u'tir', u'\xe0', u'l', u'arc', u',', u'tir', u'\xe0', u'la', u'carabine'] +suite +[u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil', u'.', u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'devenir', u'champion', u'du', u'monde', u'de', u'la', u'chasse', u'\xe0', u'courre', u',', u'avec', u'les', u'meilleurs', u'chiens', u',', u'avoir', u'un', u'chenil'] +suite +[u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires', u',', u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'enlever', u'le', u'quanta', u',', u'\xe9liminer', u'les', u'centrales', u'nucl\xe9aires'] +suite +[u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res', u',', u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'faire', u'exploser', u'toutes', u'les', u'centrales', u'du', u'monde', u'entier', u'car', u'elles', u'polluent', u'les', u'rivi\xe8res'] +suite +[u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.', u'$'] +reste +True +texte_uce +[u'enlever', u'les', u'engrais', u'chimiques', u'qui', u'polluent', u'les', u'nappes', u'phr\xe9atiques', u',', u'enlever', u'les', u'centrales', u'\xe9lectriques', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'mes', u'projets', u'familiaux', u',', u'je', u'pense', u'ne', u'pas', u'me', u'marier', u'mais', u'avoir', u'des', u'enfants'] +suite +[u'au', u'moins', u'deux', u'enfants', u',', u'vivre', u'avec', u'un', u'homme', u'soit', u'en', u'tant', u'que', u'mari', u',', u'soit', u'en', u'tant', u'que', u'concubin', u'.', u'je', u'ne', u'r\xe9aliserai', u'ces', u'projets', u'que', u'dans', u'douze', u'ans', u',', u'lorsque', u'j', u'aurai', u'un', u'm\xe9tier', u's\xfbr', u'et', u'une', u'situation', u'ais\xe9e', u'.', u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an', u'.', u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'au', u'moins', u'deux', u'enfants', u',', u'vivre', u'avec', u'un', u'homme', u'soit', u'en', u'tant', u'que', u'mari', u',', u'soit', u'en', u'tant', u'que', u'concubin'] +suite +[u'je', u'ne', u'r\xe9aliserai', u'ces', u'projets', u'que', u'dans', u'douze', u'ans', u',', u'lorsque', u'j', u'aurai', u'un', u'm\xe9tier', u's\xfbr', u'et', u'une', u'situation', u'ais\xe9e', u'.', u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an', u'.', u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'r\xe9aliserai', u'ces', u'projets', u'que', u'dans', u'douze', u'ans', u',', u'lorsque', u'j', u'aurai', u'un', u'm\xe9tier', u's\xfbr', u'et', u'une', u'situation', u'ais\xe9e'] +suite +[u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an', u'.', u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'j', u'ai', u'projetai', u'cela', u'il', u'y', u'a', u'environ', u'un', u'an'] +suite +[u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans', u',', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'mes', u'projets', u'professionnels', u',', u'il', u'y', u'a', u'environ', u'trois', u'ou', u'quatre', u'ans'] +suite +[u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier', u'.', u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'conceptrice', u',', u'r\xe9dactrice', u'en', u'publicit\xe9', u'et', u'j', u'ai', u'de', u'plus', u'en', u'plus', u'envie', u'de', u'faire', u'ce', u'm\xe9tier'] +suite +[u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup', u',', u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'trouver', u'des', u'id\xe9es', u'pour', u'une', u'publicit\xe9', u',', u'me', u'pla\xeet', u'beaucoup'] +suite +[u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant', u'.', u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'imaginer', u',', u'fabuler', u',', u'je', u'trouve', u'cela', u'passionnant'] +suite +[u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable', u'.', u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'j', u'ai', u'choisi', u'ce', u'm\xe9tier', u',', u'car', u'dans', u'la', u'publicit\xe9', u'on', u'peut', u'tout', u'faire', u',', u'rien', u'n', u'est', u'impossible', u'et', u'je', u'trouve', u'\xe7a', u'formidable'] +suite +[u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre', u'.', u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'bien', u's\xfbr', u'pour', u'en', u'arriver', u'l\xe0', u',', u'il', u'va', u'falloir', u'travailler', u'dur', u'et', u'se', u'battre'] +suite +[u'cela', u'me', u'fait', u'un', u'peu', u'peur', u',', u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'cela', u'me', u'fait', u'un', u'peu', u'peur'] +suite +[u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler', u',', u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'mais', u'dans', u'la', u'vie', u'si', u'on', u'veut', u'arriver', u'\xe0', u'quelque', u'chose', u'il', u'faut', u'se', u'battre', u'et', u'travailler'] +suite +[u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans', u'.', u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'\xe0', u'mon', u'avis', u'je', u'ne', u'pourrai', u'travailler', u'vraiment', u'que', u'dans', u'dix', u'ans'] +suite +[u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage', u',', u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'ce', u'qu', u'il', u'faudrait', u'am\xe9liorer', u'dans', u'notre', u'soci\xe9t\xe9', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'serait', u'r\xe9duire', u'le', u'ch\xf4mage'] +suite +[u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.', u'$'] +reste +True +texte_uce +[u'donner', u'plus', u'de', u'possibilit\xe9', u'aux', u'jeunes', u'dans', u'les', u'universit\xe9', u',', u'initiation', u'pour', u'les', u'r\xe9aliser', u',', u'changer', u'l', u'enseignement', u',', u'la', u'p\xe9dagogie', u'des', u'profs', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'ce', u'que', u'je', u'veux', u'faire', u'comme', u'projet', u'depuis', u'toujours'] +suite +[u'avoir', u'un', u'bon', u'm\xe9tier', u'qui', u'paie', u',', u'ne', u'pas', u'avoir', u'd', u'enfants', u',', u'ne', u'pas', u'me', u'marier', u',', u'avoir', u'mon', u'ind\xe9pendance', u',', u'avoir', u'une', u'super', u'voiture', u',', u'\xeatre', u'biologiste', u',', u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans', u',', u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique', u',', u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'avoir', u'un', u'bon', u'm\xe9tier', u'qui', u'paie', u',', u'ne', u'pas', u'avoir', u'd', u'enfants'] +suite +[u'ne', u'pas', u'me', u'marier', u',', u'avoir', u'mon', u'ind\xe9pendance', u',', u'avoir', u'une', u'super', u'voiture', u',', u'\xeatre', u'biologiste', u',', u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans', u',', u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique', u',', u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'me', u'marier', u',', u'avoir', u'mon', u'ind\xe9pendance'] +suite +[u'avoir', u'une', u'super', u'voiture', u',', u'\xeatre', u'biologiste', u',', u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans', u',', u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique', u',', u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'avoir', u'une', u'super', u'voiture', u',', u'\xeatre', u'biologiste'] +suite +[u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans', u',', u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique', u',', u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'\xe7a', u'depuis', u'l', u'\xe2ge', u'de', u'quinze', u'ans', u',', u'aller', u'depuis', u'toujours', u'en', u'am\xe9rique'] +suite +[u'depuis', u'toujours', u',', u'aller', u'en', u'haut', u',', u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'depuis', u'toujours', u',', u'aller', u'en', u'haut'] +suite +[u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans', u',', u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'\xe7a', u'aussi', u'\xe0', u'l', u'age', u'de', u'quinze', u'ans'] +suite +[u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement', u',', u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'depuis', u'toujours', u'avoir', u'plein', u'de', u't\xe9l\xe9phones', u'dans', u'mon', u'appartement'] +suite +[u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec', u',', u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'depuis', u'toujours', u',', u'avoir', u'la', u'pilule', u'quand', u'j', u'aurai', u'envie', u'de', u'faire', u'l', u'amour', u'avec', u'un', u'mec'] +suite +[u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois', u'.', u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'avoir', u'un', u'corps', u'd', u'athl\xe8te', u',', u'depuis', u'toujours', u',', u'avoir', u'mon', u'permis', u'provisoire', u'depuis', u'trois', u'mois'] +suite +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets', u',', u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'puissent', u'plus', u'facilement', u'r\xe9ussir', u'des', u'projets'] +suite +[u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir', u'.', u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'il', u'faudrait', u'que', u'les', u'parents', u'aient', u'plus', u'confiance', u'en', u'leurs', u'enfants', u',', u'et', u'les', u'laissent', u'agir'] +suite +[u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat', u',', u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'cela', u'est', u'de', u'm\xeame', u'pour', u'l', u'etat'] +suite +[u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre', u'$'] +reste +True +texte_uce +[u'avoir', u'les', u'moyens', u'financiers', u'donner', u'par', u'l', u'etat', u',', u'car', u'les', u'parents', u'ne', u'peuvent', u'pas', u'toujours', u'se', u'le', u'permettre'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'quatre', u'ou', u'trois', u'enfants'] +suite +[u'mais', u'en', u'attendant', u',', u'je', u'veux', u'arriver', u'\xe0', u'mon', u'bac', u'professionnel', u',', u'enfin', u'continuer', u'mes', u'\xe9tudes', u',', u'avoir', u'un', u'bon', u'm\xe9tier', u'?', u'je', u'veux', u'en', u'premier', u'une', u'bonne', u'situation', u'puis', u'ensuite', u'fonder', u'une', u'famille', u'dans', u'au', u'moins', u'neuf', u'ans', u'.', u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures', u'.', u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel', u'.', u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'mais', u'en', u'attendant', u',', u'je', u'veux', u'arriver', u'\xe0', u'mon', u'bac', u'professionnel', u',', u'enfin', u'continuer', u'mes', u'\xe9tudes', u',', u'avoir', u'un', u'bon', u'm\xe9tier'] +suite +[u'je', u'veux', u'en', u'premier', u'une', u'bonne', u'situation', u'puis', u'ensuite', u'fonder', u'une', u'famille', u'dans', u'au', u'moins', u'neuf', u'ans', u'.', u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures', u'.', u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel', u'.', u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'en', u'premier', u'une', u'bonne', u'situation', u'puis', u'ensuite', u'fonder', u'une', u'famille', u'dans', u'au', u'moins', u'neuf', u'ans'] +suite +[u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures', u'.', u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel', u'.', u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'ce', u'qui', u'faudrait', u'changer', u'pour', u'que', u'les', u'jeunes', u'puissent', u'r\xe9aliser', u'leurs', u'projets', u'sont', u'les', u'\xe9tudes', u'qui', u'sont', u'un', u'peu', u'trop', u'dures'] +suite +[u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel', u'.', u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'maintenant', u'pour', u'faire', u'femme', u'de', u'm\xe9nage', u',', u'il', u'faut', u'avoir', u'un', u'brevet', u'd', u'enseignement', u'professionnel'] +suite +[u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi', u',', u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'que', u'mon', u'mari', u'travaille', u'et', u'moi', u'aussi'] +suite +[u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents', u',', u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'\xe9lever', u'mes', u'enfants', u'diff\xe9remment', u'que', u'mes', u'parents'] +suite +[u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance', u'.', u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'je', u'me', u'marierai', u'avec', u'un', u'homme', u'en', u'qui', u'j', u'ai', u'enti\xe8rement', u'confiance'] +suite +[u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine', u'.', u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'fonder', u'une', u'famille', u'unie', u'a', u'\xe9t\xe9', u'toujours', u'mon', u'id\xe9e', u',', u'mais', u'pour', u'un', u'm\xe9tier', u'je', u'ne', u'suis', u'pas', u'certaine'] +suite +[u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice', u'.', u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'aujourd_hui', u'je', u'sais', u'ce', u'que', u'je', u'veux', u'faire', u',', u'monitrice', u'et', u'\xe9ducatrice'] +suite +[u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non', u',', u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'ma', u'm\xe8re', u'est', u'd', u'accord', u',', u'mon', u'p\xe8re', u'non'] +suite +[u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien', u'.', u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'mais', u'je', u'me', u'moque', u'de', u'son', u'avis', u',', u'car', u'il', u'n', u'a', u'pas', u'ma', u'charge', u'et', u'que', u'lui', u'aussi', u'ce', u'moque', u'du', u'mien'] +suite +[u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans', u',', u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u'je', u'd\xe9bute', u'ma', u'carri\xe8re', u',', u'dans', u'trois', u'ans'] +suite +[u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans', u'$'] +reste +True +texte_uce +[u'j', u'ai', u'un', u'appartement', u'avec', u'des', u'copines', u',', u'mariage', u'dans', u'dix', u',', u'quinze', u'ans', u',', u'la', u'maison', u'pareil', u'et', u'enfin', u'\xeatre', u'grand_m\xe8re', u'dans', u'quarante', u'ans'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'concubinage', u'avec', u'des', u'gens', u'c\xe9l\xe8bre', u',', u'avoir', u'une', u'voiture', u'de', u'sport'] +suite +[u'plusieurs', u'villas', u',', u'avec', u'mes', u'associ\xe9s', u'on', u'enqu\xeateraient', u'sur', u'les', u'vols', u',', u'je', u'veux', u'vivre', u'dans', u'une', u'\xeele', u'd\xe9sertes', u'avec', u'plein', u'de', u'mecs', u'.', u'$'] +reste +True +texte_uce +[u'plusieurs', u'villas', u',', u'avec', u'mes', u'associ\xe9s', u'on', u'enqu\xeateraient', u'sur', u'les', u'vols', u',', u'je', u'veux', u'vivre', u'dans', u'une', u'\xeele', u'd\xe9sertes', u'avec', u'plein', u'de', u'mecs', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u'j', u'aimerai', u'rentrer', u'au', u'lyc\xe9e', u'pour', u'continuer', u'mes', u'\xe9tudes'] +suite +[u'faire', u'de', u'l', u'\xe9lectronique', u',', u'apr\xe8s', u'si', u'je', u'r\xe9ussi', u'ces', u'premi\xe8res', u'\xe9tudes', u'je', u'compte', u'continuer', u'encore', u'deux', u'ans', u'dans', u'l', u'informatique', u',', u'\xeatre', u'technicien', u'sup\xe9rieur', u'.', u'il', u'n', u'y', u'a', u'pas', u'longtemps', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'cela', u',', u'l', u'ann\xe9e', u'derni\xe8re', u',', u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire', u',', u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel', u',', u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.', u'$'] +reste +True +texte_uce +[u'faire', u'de', u'l', u'\xe9lectronique', u',', u'apr\xe8s', u'si', u'je', u'r\xe9ussi', u'ces', u'premi\xe8res', u'\xe9tudes', u'je', u'compte', u'continuer', u'encore', u'deux', u'ans', u'dans', u'l', u'informatique', u',', u'\xeatre', u'technicien', u'sup\xe9rieur'] +suite +[u'il', u'n', u'y', u'a', u'pas', u'longtemps', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'cela', u',', u'l', u'ann\xe9e', u'derni\xe8re', u',', u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire', u',', u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel', u',', u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.', u'$'] +reste +True +texte_uce +[u'il', u'n', u'y', u'a', u'pas', u'longtemps', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'cela'] +suite +[u'l', u'ann\xe9e', u'derni\xe8re', u',', u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire', u',', u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel', u',', u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.', u'$'] +reste +True +texte_uce +[u'l', u'ann\xe9e', u'derni\xe8re', u',', u'je', u'ne', u'savais', u'pas', u'encore', u'ce', u'que', u'je', u'voulais', u'faire'] +suite +[u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel', u',', u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.', u'$'] +reste +True +texte_uce +[u'en', u'dehors', u'du', u'dessin', u'assist\xe9', u'par', u'ordinateur', u'car', u'je', u'suis', u'assez', u'bon', u'en', u'dessin', u'industriel'] +suite +[u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.', u'$'] +reste +True +texte_uce +[u'\xe7a', u'je', u'peux', u'le', u'faire', u'plus', u'tard', u'dans', u'le', u'cadre', u'de', u'mes', u'\xe9tudes', u'universitaires', u',', u'comme', u'je', u'l', u'ai', u'd\xe9j\xe0', u'dit', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'continuer', u'mes', u'\xe9tudes', u',', u'mais', u'pas', u'trop', u'longtemps'] +suite +[u'je', u'veux', u'passer', u'mon', u'brevet', u',', u'et', u'ensuite', u'voir', u'du', u'cot\xe9', u'd', u'une', u'formation', u'technique', u',', u'un', u'truc', u'de', u'm\xe9canicien', u',', u'enfin', u'des', u'\xe9tudes', u'pas', u'longues', u'.', u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier', u',', u'apr\xe8s', u'mes', u'\xe9tudes', u',', u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une', u'ou', u'plein', u'de', u'voitures', u'.', u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'passer', u'mon', u'brevet', u',', u'et', u'ensuite', u'voir', u'du', u'cot\xe9', u'd', u'une', u'formation', u'technique'] +suite +[u'un', u'truc', u'de', u'm\xe9canicien', u',', u'enfin', u'des', u'\xe9tudes', u'pas', u'longues', u'.', u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier', u',', u'apr\xe8s', u'mes', u'\xe9tudes', u',', u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une', u'ou', u'plein', u'de', u'voitures', u'.', u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'un', u'truc', u'de', u'm\xe9canicien', u',', u'enfin', u'des', u'\xe9tudes', u'pas', u'longues'] +suite +[u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier', u',', u'apr\xe8s', u'mes', u'\xe9tudes', u',', u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une', u'ou', u'plein', u'de', u'voitures', u'.', u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'ma', u'vie', u'sentimentale', u',', u'je', u'pense', u'me', u'marier', u',', u'apr\xe8s', u'mes', u'\xe9tudes', u',', u'apr\xe8s', u'avoir', u'une', u'super', u'maison', u'et', u'aussi', u'une', u'ou', u'plein', u'de', u'voitures'] +suite +[u'je', u'suis', u'ceinture', u'noire', u'de', u'judo', u',', u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'je', u'suis', u'ceinture', u'noire', u'de', u'judo'] +suite +[u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'et', u'je', u'voudrais', u'continuer', u'\xe0', u'consacrer', u'du', u'temps', u'pour', u'la', u'comp\xe9tition', u',', u'dans', u'le', u'club', u'ou', u'je', u'suis', u'je', u'donne', u'des', u'cours', u'\xe0', u'des', u'enfants'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u',', u'je', u'voudrais', u'bien', u'continuer', u'un', u'petit', u'peu', u'mes', u'\xe9tudes'] +suite +[u'mais', u'pas', u'trop', u'longtemps', u',', u'je', u'ne', u'suis', u'pas', u'tr\xe8s', u'bon', u'\xe0', u'l', u'\xe9cole', u',', u'enfin', u'je', u'ne', u'sais', u'pas', u'trop', u'ce', u'que', u'je', u'vais', u'faire', u'au', u'niveau', u'professionnel', u',', u'parce_que', u'\xe0', u'l', u'\xe9cole', u'je', u'ne', u'suis', u'pas', u'bon', u'.', u'au', u'niveau', u'sentimental', u',', u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum', u',', u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier', u',', u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable', u'$'] +reste +True +texte_uce +[u'mais', u'pas', u'trop', u'longtemps', u',', u'je', u'ne', u'suis', u'pas', u'tr\xe8s', u'bon', u'\xe0', u'l', u'\xe9cole'] +suite +[u'enfin', u'je', u'ne', u'sais', u'pas', u'trop', u'ce', u'que', u'je', u'vais', u'faire', u'au', u'niveau', u'professionnel', u',', u'parce_que', u'\xe0', u'l', u'\xe9cole', u'je', u'ne', u'suis', u'pas', u'bon', u'.', u'au', u'niveau', u'sentimental', u',', u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum', u',', u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier', u',', u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable', u'$'] +reste +True +texte_uce +[u'enfin', u'je', u'ne', u'sais', u'pas', u'trop', u'ce', u'que', u'je', u'vais', u'faire', u'au', u'niveau', u'professionnel', u',', u'parce_que', u'\xe0', u'l', u'\xe9cole', u'je', u'ne', u'suis', u'pas', u'bon'] +suite +[u'au', u'niveau', u'sentimental', u',', u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum', u',', u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier', u',', u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable', u'$'] +reste +True +texte_uce +[u'au', u'niveau', u'sentimental', u',', u'je', u'compte', u'd_abord', u'm', u'amuser', u'au', u'maximum'] +suite +[u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier', u',', u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable', u'$'] +reste +True +texte_uce +[u'bien', u'plus', u'tard', u'bien', u'plus', u'tard', u',', u'peut', u'\xeatre', u'je', u'vais', u'me', u'marier'] +suite +[u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable', u'$'] +reste +True +texte_uce +[u'ou', u'vivre', u'en', u'concubin', u',', u'enfin', u'avoir', u'une', u'vie', u'un', u'peu', u'plus', u'stable'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u',', u'je', u'voudrais', u'bien', u'rentrer', u'en', u'seconde'] +suite +[u'et', u'puis', u'continuer', u'mes', u'\xe9tudes', u',', u'rentrer', u'\xe0', u'la', u'facult\xe9', u',', u'ou', u'bien', u'dans', u'une', u'formation', u'plus', u'technique', u',', u'enfin', u'le', u'minimum', u'c', u'est', u'd', u'avoir', u'mon', u'baccalaur\xe9at', u',', u'c', u'est', u'mon', u'premier', u'projet', u',', u'pour', u'le', u'choix', u'professionnel', u',', u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'et', u'puis', u'continuer', u'mes', u'\xe9tudes', u',', u'rentrer', u'\xe0', u'la', u'facult\xe9'] +suite +[u'ou', u'bien', u'dans', u'une', u'formation', u'plus', u'technique', u',', u'enfin', u'le', u'minimum', u'c', u'est', u'd', u'avoir', u'mon', u'baccalaur\xe9at', u',', u'c', u'est', u'mon', u'premier', u'projet', u',', u'pour', u'le', u'choix', u'professionnel', u',', u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'ou', u'bien', u'dans', u'une', u'formation', u'plus', u'technique'] +suite +[u'enfin', u'le', u'minimum', u'c', u'est', u'd', u'avoir', u'mon', u'baccalaur\xe9at', u',', u'c', u'est', u'mon', u'premier', u'projet', u',', u'pour', u'le', u'choix', u'professionnel', u',', u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'enfin', u'le', u'minimum', u'c', u'est', u'd', u'avoir', u'mon', u'baccalaur\xe9at'] +suite +[u'c', u'est', u'mon', u'premier', u'projet', u',', u'pour', u'le', u'choix', u'professionnel', u',', u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'c', u'est', u'mon', u'premier', u'projet', u',', u'pour', u'le', u'choix', u'professionnel'] +suite +[u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'j', u'ai', u'encore', u'du', u'temps', u'avant', u'de', u'me', u'd\xe9cider'] +suite +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair', u',', u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'je', u'suis', u'encore', u'jeune', u'pour', u'y', u'voir', u'bien', u'clair'] +suite +[u'je', u'pense', u'certainement', u'fonder', u'une', u'famille', u',', u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'je', u'pense', u'certainement', u'fonder', u'une', u'famille'] +suite +[u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier', u',', u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'mais', u'cela', u'ne', u'pourra', u'se', u'faire', u'qu', u'apr\xe8s', u'avoir', u'bien', u'travailler', u'au', u'niveau', u'du', u'm\xe9tier'] +suite +[u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas', u'.', u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'pas', u'avoir', u'un', u'gosse', u'sans', u'boulot', u'par', u'exemple', u',', u'\xe7a', u'\xe7a', u'serait', u'gal\xe8re', u',', u'je', u'n', u'y', u'pense', u'm\xeame', u'pas'] +suite +[u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune', u',', u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'je', u'pense', u'essayer', u'de', u'voyager', u'rien', u'que', u'pour', u'les', u'vacances', u'et', u'le', u'faire', u'tant', u'que', u'je', u'suis', u'jeune'] +suite +[u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile', u'$'] +reste +True +texte_uce +[u'avec', u'une', u'famille', u'\xe7a', u'devient', u'beaucoup', u'plus', u'difficile'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'l', u'ann\xe9e', u'prochaine', u',', u'je', u'compte', u'rentrer', u'au', u'lyc\xe9e', u'pour', u'pr\xe9parer', u'un', u'bac', u'technique'] +suite +[u'apr\xe8s', u'je', u'compte', u'faire', u'une', u'formation', u'technique', u',', u'mais', u'je', u'ne', u'sais', u'pas', u'encore', u'vraiment', u'ce', u'que', u'je', u'veux', u'faire', u',', u'je', u'suis', u'assez', u'bon', u'dans', u'la', u'm\xe9canique', u',', u'certainement', u'que', u'je', u'vais', u'essayer', u'de', u'travailler', u'de', u'ce', u'cot\xe9', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'compte', u'faire', u'une', u'formation', u'technique'] +suite +[u'mais', u'je', u'ne', u'sais', u'pas', u'encore', u'vraiment', u'ce', u'que', u'je', u'veux', u'faire', u',', u'je', u'suis', u'assez', u'bon', u'dans', u'la', u'm\xe9canique', u',', u'certainement', u'que', u'je', u'vais', u'essayer', u'de', u'travailler', u'de', u'ce', u'cot\xe9', u'$'] +reste +True +texte_uce +[u'mais', u'je', u'ne', u'sais', u'pas', u'encore', u'vraiment', u'ce', u'que', u'je', u'veux', u'faire'] +suite +[u'je', u'suis', u'assez', u'bon', u'dans', u'la', u'm\xe9canique', u',', u'certainement', u'que', u'je', u'vais', u'essayer', u'de', u'travailler', u'de', u'ce', u'cot\xe9', u'$'] +reste +True +texte_uce +[u'je', u'suis', u'assez', u'bon', u'dans', u'la', u'm\xe9canique', u',', u'certainement', u'que', u'je', u'vais', u'essayer', u'de', u'travailler', u'de', u'ce', u'cot\xe9'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'au', u'niveau', u'professionnel', u',', u'le', u'minimum', u'pour', u'l', u'instant', u'c', u'est', u'de', u'passer', u'mon', u'brevet'] +suite +[u'en', u'cas', u'de', u'r\xe9ussite', u',', u'et', u'je', u'pense', u'que', u'\xe7a', u'va', u'marcher', u',', u'continuer', u'au', u'lyc\xe9e', u'.', u'je', u'voudrais', u'bien', u'devenir', u'professeur', u'de', u'math\xe9matique', u'ou', u'de', u'gymnastique', u',', u'enfin', u'un', u'truc', u'dans', u'ce', u'style', u',', u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'en', u'cas', u'de', u'r\xe9ussite', u',', u'et', u'je', u'pense', u'que', u'\xe7a', u'va', u'marcher', u',', u'continuer', u'au', u'lyc\xe9e'] +suite +[u'je', u'voudrais', u'bien', u'devenir', u'professeur', u'de', u'math\xe9matique', u'ou', u'de', u'gymnastique', u',', u'enfin', u'un', u'truc', u'dans', u'ce', u'style', u',', u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'devenir', u'professeur', u'de', u'math\xe9matique', u'ou', u'de', u'gymnastique'] +suite +[u'enfin', u'un', u'truc', u'dans', u'ce', u'style', u',', u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport', u'.', u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'enfin', u'un', u'truc', u'dans', u'ce', u'style', u',', u'\xe7a', u'peut', u'\xeatre', u'moniteur', u'de', u'sport', u',', u'plut\xf4t', u'le', u'sport'] +suite +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser', u',', u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'niveau', u'sentimental', u',', u'je', u'crois', u'que', u'j', u'ai', u'encore', u'le', u'temps', u'd', u'y', u'penser'] +suite +[u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille', u',', u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'je', u'voudrais', u'bien', u'fonder', u'une', u'famille'] +suite +[u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire', u'$'] +reste +True +texte_uce +[u'avoir', u'une', u'maison', u'et', u'pouvoir', u'partir', u'en', u'vacances', u',', u'c', u'est', u'le', u'minimum', u'qu', u'on', u'peut', u'vouloir', u',', u'apr\xe8s', u'\xe7a', u'tourne', u'au', u'd\xe9lire'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'vivre', u'loin', u'de', u'la', u'ville', u'dans', u'une', u'\xeele', u'd\xe9serte'] +suite +[u'avec', u'de', u'super', u'appareils', u'de', u'musique', u',', u'et', u'une', u'image', u'grand', u'\xe9cran', u'en', u'direct', u'du', u'festival', u',', u'rien', u'que', u'musique', u'et', u'image', u',', u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille', u',', u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela', u'.', u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'avec', u'de', u'super', u'appareils', u'de', u'musique'] +suite +[u'et', u'une', u'image', u'grand', u'\xe9cran', u'en', u'direct', u'du', u'festival', u',', u'rien', u'que', u'musique', u'et', u'image', u',', u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille', u',', u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela', u'.', u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'et', u'une', u'image', u'grand', u'\xe9cran', u'en', u'direct', u'du', u'festival'] +suite +[u'rien', u'que', u'musique', u'et', u'image', u',', u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille', u',', u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela', u'.', u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'rien', u'que', u'musique', u'et', u'image'] +suite +[u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille', u',', u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela', u'.', u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'pas', u'm', u'inscrire', u'dans', u'la', u'profession', u'apr\xe8s', u't', u'as', u'envie', u'd', u'une', u'famille'] +suite +[u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela', u'.', u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'd', u'une', u'voiture', u',', u'et', u'puis', u'tu', u'arr\xeates', u'pas', u'd', u'avoir', u'envie', u'de', u'ceci', u'ou', u'de', u'cela'] +suite +[u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets', u',', u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'cot\xe9', u'sentimental', u'vraiment', u'pas', u'de', u'projets'] +suite +[u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon', u',', u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'vivre', u'sur', u'une', u'\xeele', u'd\xe9serte', u'avec', u'la', u'mer', u'en', u'face', u'et', u'surtout', u'pas', u'de', u'bateaux', u'\xe0', u'l', u'horizon'] +suite +[u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine', u'$'] +reste +True +texte_uce +[u'au', u'cas', u'o\xf9', u'quelques', u'jets', u'de', u'grenades', u'et', u'l', u'histoire', u'est', u'class\xe9e', u',', u'loin', u'du', u'trafic', u'polluant', u'des', u'm\xe9caniques', u'et', u'de', u'la', u'gente', u'humaine'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'l', u'intention', u'd', u'avoir', u'au', u'moins', u'des', u'enfants'] +suite +[u'mais', u'en', u'attendant', u',', u'je', u'veux', u'arriver', u'\xe0', u'une', u'profession', u'par', u'rapport', u'au', u'baccalaur\xe9at', u'technique', u'que', u'je', u'veux', u'passer', u',', u'en', u'premier', u',', u'une', u'bonne', u'situation', u',', u'et', u'apr\xe8s', u'fonder', u'une', u'famille', u',', u'\xe7a', u'il', u'me', u'faudra', u'bien', u'une', u'dizaine', u'd', u'ann\xe9es', u'.', u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident', u'.', u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'mais', u'en', u'attendant'] +suite +[u'je', u'veux', u'arriver', u'\xe0', u'une', u'profession', u'par', u'rapport', u'au', u'baccalaur\xe9at', u'technique', u'que', u'je', u'veux', u'passer', u',', u'en', u'premier', u',', u'une', u'bonne', u'situation', u',', u'et', u'apr\xe8s', u'fonder', u'une', u'famille', u',', u'\xe7a', u'il', u'me', u'faudra', u'bien', u'une', u'dizaine', u'd', u'ann\xe9es', u'.', u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident', u'.', u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'arriver', u'\xe0', u'une', u'profession', u'par', u'rapport', u'au', u'baccalaur\xe9at', u'technique', u'que', u'je', u'veux', u'passer'] +suite +[u'en', u'premier', u',', u'une', u'bonne', u'situation', u',', u'et', u'apr\xe8s', u'fonder', u'une', u'famille', u',', u'\xe7a', u'il', u'me', u'faudra', u'bien', u'une', u'dizaine', u'd', u'ann\xe9es', u'.', u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident', u'.', u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'en', u'premier', u',', u'une', u'bonne', u'situation', u',', u'et', u'apr\xe8s', u'fonder', u'une', u'famille', u',', u'\xe7a', u'il', u'me', u'faudra', u'bien', u'une', u'dizaine', u'd', u'ann\xe9es'] +suite +[u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident', u'.', u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'ce', u'qui', u'est', u'difficile', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'c', u'est', u'pas', u'\xe9vident'] +suite +[u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser', u',', u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'sinon', u'je', u'veux', u'avant', u'de', u'me', u'marier', u'vivre', u'avec', u'des', u'copines', u'et', u'm', u'amuser'] +suite +[u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9', u',', u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'\xe7a', u'je', u'le', u'ferai', u'\xe0', u'la', u'majorit\xe9'] +suite +[u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re', u'.', u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'travaille', u'dans', u'mon', u'm\xe9tier', u',', u'apr\xe8s', u'je', u'me', u'marie', u'les', u'gosses', u'et', u'apr\xe8s', u'je', u'suis', u'grand_m\xe8re'] +suite +[u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'travailler', u'dans', u'le', u'social', u',', u'\xeatre', u'assistante', u'sociale', u',', u'ou', u'aide', u'm\xe9nag\xe8re', u',', u'ou', u'un', u'boulot', u'avec', u'des', u'gosses', u'de', u'toute', u'mani\xe8re'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'familiale', u',', u'je', u'pense', u'pas', u'que', u'je', u'vais', u'me', u'marier'] +suite +[u'mais', u'je', u'veux', u'tout', u'de', u'm\xeame', u'avoir', u'des', u'enfants', u'et', u'puis', u'vivre', u'avec', u'un', u'homme', u',', u'mais', u'je', u'veux', u'garder', u'mon', u'ind\xe9pendance', u',', u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'pense', u'\xe0', u'tout', u'\xe7a', u',', u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier', u'.', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'mais', u'je', u'veux', u'tout', u'de', u'm\xeame', u'avoir', u'des', u'enfants', u'et', u'puis', u'vivre', u'avec', u'un', u'homme'] +suite +[u'mais', u'je', u'veux', u'garder', u'mon', u'ind\xe9pendance', u',', u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'pense', u'\xe0', u'tout', u'\xe7a', u',', u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier', u'.', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'mais', u'je', u'veux', u'garder', u'mon', u'ind\xe9pendance'] +suite +[u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'pense', u'\xe0', u'tout', u'\xe7a', u',', u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier', u'.', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'pense', u'\xe0', u'tout', u'\xe7a'] +suite +[u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier', u'.', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'mais', u'd_abord', u'il', u'faut', u'penser', u'avoir', u'un', u'm\xe9tier'] +suite +[u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode', u',', u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'dessinatrice', u'de', u'mode'] +suite +[u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode', u',', u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'travailler', u'dans', u'la', u'conception', u'des', u'grands', u'noms', u'de', u'la', u'mode'] +suite +[u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement', u',', u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'j', u'aime', u'bien', u'imaginer', u'plein', u'de', u'v\xeatement'] +suite +[u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection', u',', u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'l', u'habit', u'c', u'est', u'mon', u'truc', u',', u'mais', u'pas', u'la', u'confection'] +suite +[u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup', u'.', u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'car', u'l\xe0', u'on', u'ne', u'peut', u'pas', u'imaginer', u'tout', u'ce', u'qu', u'on', u'veut', u',', u'mais', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'beaucoup'] +suite +[u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.', u'$'] +reste +True +texte_uce +[u'dans', u'notre', u'soci\xe9t\xe9', u'il', u'faut', u'que', u'\xe7a', u's', u'am\xe9liore', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'changer', u'la', u'p\xe9dagogie', u'des', u'professeurs', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'compte', u'surtout', u'avoir', u'mon', u'ind\xe9pendance'] +suite +[u'pour', u'\xe7a', u'il', u'y', u'a', u'pas', u'de', u'myst\xe8re', u',', u'il', u'faut', u'que', u'je', u'travaille', u'par', u'rapport', u'aux', u'\xe9tudes', u',', u'passer', u'mon', u'brevet', u',', u'ensuite', u'aller', u'jusqu_\xe0', u'la', u'terminale', u'et', u'pr\xe9parer', u'une', u'formation', u'technique', u',', u'je', u'pense', u'\xe0', u'l', u'informatique', u',', u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle', u'.', u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets', u'.', u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'pour', u'\xe7a', u'il', u'y', u'a', u'pas', u'de', u'myst\xe8re'] +suite +[u'il', u'faut', u'que', u'je', u'travaille', u'par', u'rapport', u'aux', u'\xe9tudes', u',', u'passer', u'mon', u'brevet', u',', u'ensuite', u'aller', u'jusqu_\xe0', u'la', u'terminale', u'et', u'pr\xe9parer', u'une', u'formation', u'technique', u',', u'je', u'pense', u'\xe0', u'l', u'informatique', u',', u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle', u'.', u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets', u'.', u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'il', u'faut', u'que', u'je', u'travaille', u'par', u'rapport', u'aux', u'\xe9tudes'] +suite +[u'passer', u'mon', u'brevet', u',', u'ensuite', u'aller', u'jusqu_\xe0', u'la', u'terminale', u'et', u'pr\xe9parer', u'une', u'formation', u'technique', u',', u'je', u'pense', u'\xe0', u'l', u'informatique', u',', u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle', u'.', u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets', u'.', u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'passer', u'mon', u'brevet', u',', u'ensuite', u'aller', u'jusqu_\xe0', u'la', u'terminale', u'et', u'pr\xe9parer', u'une', u'formation', u'technique'] +suite +[u'je', u'pense', u'\xe0', u'l', u'informatique', u',', u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle', u'.', u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets', u'.', u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'je', u'pense', u'\xe0', u'l', u'informatique', u',', u'pour', u'\xe9viter', u'd', u'\xeatre', u'au', u'ch\xf4mage', u',', u'l', u'essentiel', u'pour', u'moi', u'\xe9tant', u'd', u'acqu\xe9rir', u'mon', u'ind\xe9pendance', u'mat\xe9rielle'] +suite +[u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation', u',', u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets', u'.', u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'niveau', u'sentimental', u',', u'surtout', u'pas', u'de', u'famille', u'avant', u'd', u'avoir', u'ma', u'situation'] +suite +[u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets', u'.', u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'sinon', u'vivre', u'avec', u'un', u'homme', u',', u'il', u'peut', u'ne', u'pas', u'd\xe9ranger', u'mes', u'projets'] +suite +[u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes', u',', u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'pour', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'dans', u'les', u'\xe9tudes'] +suite +[u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde', u',', u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'le', u'probl\xe8me', u',', u'c', u'est', u'que', u'les', u'\xe9tudes', u'ne', u'nous', u'aident', u'pas', u'trop', u'\xe0', u'comprendre', u'le', u'monde'] +suite +[u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.', u'$'] +reste +True +texte_uce +[u'mais', u'il', u'y', u'a', u'peut_\xeatre', u'rien', u'\xe0', u'y', u'comprendre', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'moi', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants'] +suite +[u'je', u'compte', u'me', u'consacrer', u'enti\xe8rement', u'\xe0', u'ma', u'famille', u',', u'\xe0', u'mes', u'enfants', u'et', u'\xe0', u'mon', u'mari', u',', u'je', u'veux', u'pouvoir', u'l', u'aider', u'dans', u'son', u'travail', u',', u'travailler', u'avec', u'lui', u',', u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille', u',', u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'je', u'compte', u'me', u'consacrer', u'enti\xe8rement', u'\xe0', u'ma', u'famille'] +suite +[u'\xe0', u'mes', u'enfants', u'et', u'\xe0', u'mon', u'mari', u',', u'je', u'veux', u'pouvoir', u'l', u'aider', u'dans', u'son', u'travail', u',', u'travailler', u'avec', u'lui', u',', u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille', u',', u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'\xe0', u'mes', u'enfants', u'et', u'\xe0', u'mon', u'mari'] +suite +[u'je', u'veux', u'pouvoir', u'l', u'aider', u'dans', u'son', u'travail', u',', u'travailler', u'avec', u'lui', u',', u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille', u',', u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'pouvoir', u'l', u'aider', u'dans', u'son', u'travail', u',', u'travailler', u'avec', u'lui'] +suite +[u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille', u',', u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'et', u'l', u'aider', u'dans', u'son', u'travail', u'pour', u'qu', u'il', u'ait', u'plus', u'de', u'temps', u'pour', u'sa', u'famille'] +suite +[u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie', u',', u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'en', u'attendant', u'de', u'rencontrer', u'l', u'homme', u'de', u'ma', u'vie'] +suite +[u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants', u',', u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'je', u'pr\xe9parerai', u'un', u'm\xe9tier', u',', u'qui', u'me', u'permettra', u'de', u'travailler', u'avec', u'des', u'enfants'] +suite +[u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait', u',', u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'travailler', u'dans', u'une', u'cr\xe8che', u',', u'\xe7a', u'me', u'plairait'] +suite +[u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes', u',', u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'je', u'sais', u'pas', u'trop', u'ce', u'qu', u'il', u'faut', u'que', u'je', u'fasse', u'comme', u'\xe9tudes'] +suite +[u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi', u',', u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'de', u'toute', u'mani\xe8re', u',', u'j', u'aime', u'les', u'enfants', u'et', u'c', u'est', u'd\xe9j\xe0', u'un', u'bon', u'point', u'pour', u'moi'] +suite +[u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison', u',', u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'j', u'esp\xe8re', u'avoir', u'une', u'grande', u'maison'] +suite +[u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants', u',', u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'et', u'payer', u'tout', u'ce', u'que', u'je', u'veux', u'\xe0', u'mes', u'enfants'] +suite +[u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.', u'$'] +reste +True +texte_uce +[u'j', u'esp\xe8re', u'qu', u'on', u'pourra', u'voyager', u',', u'mais', u'l', u'essentiel', u'c', u'est', u'de', u'fonder', u'une', u'famille', u'solide', u',', u'surtout', u'si', u'on', u'veut', u'des', u'enfants', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u',', u'je', u'compte', u'devenir', u'officier', u'de', u'la', u'paix'] +suite +[u'j', u'aurais', u'voulu', u'devenir', u'sportif', u',', u'plus', u'particuli\xe8rement', u'dans', u'le', u'football', u',', u'mais', u'devenir', u'flic', u',', u'c', u'est', u'plus', u'passionnant', u'.', u'dans', u'cinq', u'ans', u',', u'je', u'compte', u'me', u'marier', u'avec', u'une', u'femme', u'brune', u'qui', u'aura', u'de', u'beaux', u'yeux', u',', u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et', u'belle', u'physiquement', u',', u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants', u',', u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'j', u'aurais', u'voulu', u'devenir', u'sportif', u',', u'plus', u'particuli\xe8rement', u'dans', u'le', u'football', u',', u'mais', u'devenir', u'flic', u',', u'c', u'est', u'plus', u'passionnant'] +suite +[u'dans', u'cinq', u'ans', u',', u'je', u'compte', u'me', u'marier', u'avec', u'une', u'femme', u'brune', u'qui', u'aura', u'de', u'beaux', u'yeux', u',', u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et', u'belle', u'physiquement', u',', u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants', u',', u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u',', u'je', u'compte', u'me', u'marier', u'avec', u'une', u'femme', u'brune', u'qui', u'aura', u'de', u'beaux', u'yeux'] +suite +[u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et', u'belle', u'physiquement', u',', u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants', u',', u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'il', u'faudra', u'qu', u'elle', u'soit', u'intelligente', u'et', u'belle', u'physiquement'] +suite +[u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants', u',', u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'et', u'mignonne', u'de', u't\xeate', u',', u'avec', u'ma', u'femme', u'je', u'pense', u'avoir', u'des', u'enfants'] +suite +[u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille', u'.', u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'deux', u'enfants', u'et', u'mener', u'une', u'vie', u'agr\xe9able', u',', u'offrir', u'tout', u'ce', u'que', u'veut', u'ma', u'femme', u',', u'et', u'aussi', u'\xe0', u'toute', u'la', u'famille'] +suite +[u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix', u'$'] +reste +True +texte_uce +[u'je', u'tiens', u'en', u'\xe9tant', u'flic', u'garder', u'la', u'soci\xe9t\xe9', u'dans', u'la', u'paix'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'travail', u',', u'le', u'faire', u'pendant', u'deux', u'ans'] +suite +[u'puis', u'avoir', u'un', u'accident', u'du', u'travail', u'pour', u'toucher', u'de', u'l', u'argent', u'tranquillement', u'.', u'je', u'veux', u'me', u'marier', u'cinq', u'fois', u',', u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures', u',', u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir', u',', u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail', u',', u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'puis', u'avoir', u'un', u'accident', u'du', u'travail', u'pour', u'toucher', u'de', u'l', u'argent', u'tranquillement'] +suite +[u'je', u'veux', u'me', u'marier', u'cinq', u'fois', u',', u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures', u',', u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir', u',', u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail', u',', u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'cinq', u'fois'] +suite +[u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures', u',', u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir', u',', u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail', u',', u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'avoir', u'une', u'maison', u'secondaire', u'une', u'masse', u'de', u'voitures'] +suite +[u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir', u',', u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail', u',', u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'rentrer', u'dans', u'la', u'politique', u'pour', u'dormir'] +suite +[u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes', u',', u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail', u',', u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'avoir', u'un', u'\xe9norme', u'lit', u'pour', u'dormir', u'avec', u'plein', u'de', u'femmes'] +suite +[u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail', u',', u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'et', u'des', u'femmes', u'de', u'chambre', u'pour', u'faire', u'tout', u'le', u'travail'] +suite +[u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne', u'$'] +reste +True +texte_uce +[u'tuer', u'les', u'personnes', u'qui', u'm', u'agacent', u'et', u'mourir', u'vieux', u'sans', u'donner', u'd', u'argent', u'\xe0', u'personne'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avec', u'une', u'jolie', u'femme', u'qui', u'soit', u'aimable'] +suite +[u'faire', u'du', u'sport', u'de', u'temps', u'en', u'temps', u',', u'je', u'veux', u'faire', u'professeur', u'de', u'math\xe9matiques', u',', u'quelque', u'chose', u'qui', u'se', u'rapproche', u'de', u'cela', u',', u'avoir', u'de', u'bonnes', u'relations', u'avec', u'mes', u'parents', u',', u'rester', u'avec', u'eux', u'le', u'plus', u'de', u'temps', u'possible', u'.', u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer', u'$'] +reste +True +texte_uce +[u'faire', u'du', u'sport', u'de', u'temps', u'en', u'temps'] +suite +[u'je', u'veux', u'faire', u'professeur', u'de', u'math\xe9matiques', u',', u'quelque', u'chose', u'qui', u'se', u'rapproche', u'de', u'cela', u',', u'avoir', u'de', u'bonnes', u'relations', u'avec', u'mes', u'parents', u',', u'rester', u'avec', u'eux', u'le', u'plus', u'de', u'temps', u'possible', u'.', u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'faire', u'professeur', u'de', u'math\xe9matiques', u',', u'quelque', u'chose', u'qui', u'se', u'rapproche', u'de', u'cela'] +suite +[u'avoir', u'de', u'bonnes', u'relations', u'avec', u'mes', u'parents', u',', u'rester', u'avec', u'eux', u'le', u'plus', u'de', u'temps', u'possible', u'.', u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer', u'$'] +reste +True +texte_uce +[u'avoir', u'de', u'bonnes', u'relations', u'avec', u'mes', u'parents', u',', u'rester', u'avec', u'eux', u'le', u'plus', u'de', u'temps', u'possible'] +suite +[u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer', u'$'] +reste +True +texte_uce +[u'il', u'faut', u'que', u'les', u'jeunes', u'puissent', u'plus', u's', u'exprimer'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'faire', u'des', u'voyages', u',', u'voir', u'beaucoup', u'de', u'monde'] +suite +[u'faire', u'des', u'choses', u'uniques', u'dans', u'tous', u'les', u'domaines', u',', u'ne', u'pas', u'faire', u'comme', u'tout', u'le', u'monde', u',', u'laisser', u'quelque', u'chose', u'derri\xe8re', u'moi', u',', u'j', u'aimerais', u'faire', u'un', u'm\xe9tier', u'qui', u'serve', u'\xe0', u'quelque', u'chose', u',', u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant', u',', u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent', u',', u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'faire', u'des', u'choses', u'uniques', u'dans', u'tous', u'les', u'domaines'] +suite +[u'ne', u'pas', u'faire', u'comme', u'tout', u'le', u'monde', u',', u'laisser', u'quelque', u'chose', u'derri\xe8re', u'moi', u',', u'j', u'aimerais', u'faire', u'un', u'm\xe9tier', u'qui', u'serve', u'\xe0', u'quelque', u'chose', u',', u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant', u',', u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent', u',', u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'faire', u'comme', u'tout', u'le', u'monde', u',', u'laisser', u'quelque', u'chose', u'derri\xe8re', u'moi'] +suite +[u'j', u'aimerais', u'faire', u'un', u'm\xe9tier', u'qui', u'serve', u'\xe0', u'quelque', u'chose', u',', u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant', u',', u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent', u',', u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'j', u'aimerais', u'faire', u'un', u'm\xe9tier', u'qui', u'serve', u'\xe0', u'quelque', u'chose'] +suite +[u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant', u',', u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent', u',', u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'certains', u'de', u'mes', u'projets', u'sont', u'r\xe9alisables', u'maintenant'] +suite +[u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin', u',', u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent', u',', u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'rester', u'toute', u'ma', u'vie', u'dans', u'une', u'cage', u'\xe0', u'lapin'] +suite +[u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent', u',', u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'un', u'mouton', u'qui', u'se', u'fasse', u'exploiter', u'uniquement', u'pour', u'les', u'autres', u'\xeatre', u'libre', u'm\xeame', u'si', u'je', u'ne', u'gagne', u'pas', u'beaucoup', u'd', u'argent'] +suite +[u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'comme', u'les', u'autres', u',', u'ne', u'jamais', u'vieillir', u'dans', u'ma', u't\xeate', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'tout', u'd_abord', u'avoir', u'une', u'bonne', u'situation', u'professionnel', u'et', u'stable'] +suite +[u'je', u'voudrais', u'aussi', u'vivre', u'avec', u'ma', u'm\xe8re', u',', u'car', u'mes', u'parents', u'sont', u'divorc\xe9s', u',', u'et', u'je', u'vis', u'avec', u'mon', u'p\xe8re', u',', u'j', u'aimerais', u'faire', u'un', u'travail', u'avec', u'des', u'jeunes', u'enfants', u',', u'dans', u'ma', u'vie', u'sentimentale', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'je', u'voudrais', u'aussi', u'vivre', u'avec', u'ma', u'm\xe8re', u',', u'car', u'mes', u'parents', u'sont', u'divorc\xe9s'] +suite +[u'et', u'je', u'vis', u'avec', u'mon', u'p\xe8re', u',', u'j', u'aimerais', u'faire', u'un', u'travail', u'avec', u'des', u'jeunes', u'enfants', u',', u'dans', u'ma', u'vie', u'sentimentale', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'et', u'je', u'vis', u'avec', u'mon', u'p\xe8re'] +suite +[u'j', u'aimerais', u'faire', u'un', u'travail', u'avec', u'des', u'jeunes', u'enfants', u',', u'dans', u'ma', u'vie', u'sentimentale', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'j', u'aimerais', u'faire', u'un', u'travail', u'avec', u'des', u'jeunes', u'enfants'] +suite +[u'dans', u'ma', u'vie', u'sentimentale', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'dans', u'ma', u'vie', u'sentimentale'] +suite +[u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage', u',', u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'du', u'moins', u'pas', u'jeune', u'je', u'pr\xe9f\xe8re', u'vivre', u'en', u'concubinage'] +suite +[u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable', u',', u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'aussi', u'\xeatre', u'v\xe9t\xe9rinaire', u'mais', u'les', u'\xe9tudes', u'sont', u'trop', u'difficiles', u'et', u'je', u'ne', u'm', u'en', u's', u'en', u'pas', u'capable'] +suite +[u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge', u'$'] +reste +True +texte_uce +[u'les', u'adolescents', u'peuvent', u'avoir', u'des', u'projets', u'\xe0', u'n', u'importe', u'quel', u'\xe2ge'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'rester', u'c\xe9libataire', u'et', u'vivre', u'en', u'concubinage'] +suite +[u'je', u'ne', u'veux', u'pas', u'd', u'enfants', u'car', u'pour', u'moi', u'c', u'est', u'une', u'contrainte', u',', u'je', u'veux', u'au', u'niveau', u'professionnel', u'devenir', u'kin\xe9sith\xe9rapeute', u',', u'car', u'c', u'est', u'un', u'milieu', u'o\xf9', u'on', u'a', u'le', u'contact', u'avec', u'le', u'milieu', u'sportif', u',', u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir', u',', u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'd', u'enfants', u'car', u'pour', u'moi', u'c', u'est', u'une', u'contrainte'] +suite +[u'je', u'veux', u'au', u'niveau', u'professionnel', u'devenir', u'kin\xe9sith\xe9rapeute', u',', u'car', u'c', u'est', u'un', u'milieu', u'o\xf9', u'on', u'a', u'le', u'contact', u'avec', u'le', u'milieu', u'sportif', u',', u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir', u',', u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'au', u'niveau', u'professionnel', u'devenir', u'kin\xe9sith\xe9rapeute'] +suite +[u'car', u'c', u'est', u'un', u'milieu', u'o\xf9', u'on', u'a', u'le', u'contact', u'avec', u'le', u'milieu', u'sportif', u',', u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir', u',', u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'car', u'c', u'est', u'un', u'milieu', u'o\xf9', u'on', u'a', u'le', u'contact', u'avec', u'le', u'milieu', u'sportif'] +suite +[u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir', u',', u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'rendre', u'utile', u',', u'c', u'est', u'un', u'm\xe9tier', u'difficile', u'\xe0', u'acqu\xe9rir'] +suite +[u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame', u',', u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'il', u'faut', u'\xeatre', u'solide', u',', u'car', u'il', u'faut', u'\xeatre', u'capable', u'de', u's', u'organiser', u'soi', u'm\xeame'] +suite +[u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football', u',', u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'sinon', u'si', u'\xe7a', u'va', u'pas', u'je', u'peux', u'devenir', u'journaliste', u'sportive', u'surtout', u'pour', u'le', u'football'] +suite +[u'je', u'veux', u'informer', u',', u'\xeatre', u'utile', u',', u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'informer', u',', u'\xeatre', u'utile'] +suite +[u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur', u',', u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'\xeatre', u'fonctionnaire', u'derri\xe8re', u'un', u'bureau', u'\xe0', u'remplir', u'des', u'papiers', u'et', u'\xe0', u'\xeatre', u'commande', u'par', u'un', u'sup\xe9rieur'] +suite +[u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'd', u'une', u'vie', u'monotone', u',', u'm\xe9tro', u'boulot', u'dodo'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'est', u'pas', u'de', u'projet', u'de', u'vie'] +suite +[u'je', u'verrai', u'bien', u'ce', u'que', u'me', u'r\xe9serve', u'le', u'cours', u'de', u'la', u'vie', u',', u'avant', u'de', u'penser', u'\xe0', u'tout', u'cela', u',', u'il', u'faut', u'que', u'je', u'profite', u'de', u'la', u'vie', u'$'] +reste +True +texte_uce +[u'je', u'verrai', u'bien', u'ce', u'que', u'me', u'r\xe9serve', u'le', u'cours', u'de', u'la', u'vie'] +suite +[u'avant', u'de', u'penser', u'\xe0', u'tout', u'cela', u',', u'il', u'faut', u'que', u'je', u'profite', u'de', u'la', u'vie', u'$'] +reste +True +texte_uce +[u'avant', u'de', u'penser', u'\xe0', u'tout', u'cela', u',', u'il', u'faut', u'que', u'je', u'profite', u'de', u'la', u'vie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'passer', u'mon', u'bac', u'et', u'r\xe9ussir', u'dans', u'le', u'domaine', u'artistique'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'vais', u'essayer', u'd', u'avoir', u'mon', u'brevet'] +suite +[u'apr\xe8s', u'je', u'passe', u'le', u'concours', u'de', u'la', u'gendarmerie', u',', u'et', u'le', u'concours', u'\xe0', u'l', u'arm\xe9e', u',', u'je', u'veux', u'r\xe9ussir', u'dans', u'le', u'domaine', u'sportif', u'.', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'passe', u'le', u'concours', u'de', u'la', u'gendarmerie', u',', u'et', u'le', u'concours', u'\xe0', u'l', u'arm\xe9e', u',', u'je', u'veux', u'r\xe9ussir', u'dans', u'le', u'domaine', u'sportif', u'.'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'devenir', u'v\xe9t\xe9rinaire', u',', u'j', u'y', u'pense', u'depuis', u'six', u'ans'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'sur', u'le', u'plan', u'familial', u',', u'je', u'veux', u'rester', u'c\xe9libataire', u'le', u'plus', u'longtemps', u'possible'] +suite +[u'\xe9ventuellement', u'avoir', u'des', u'enfants', u'mais', u'dans', u'vingt', u'ans', u',', u'je', u'veux', u'avoir', u'un', u'boulot', u'int\xe9ressant', u',', u'pratiquer', u'un', u'sport', u'r\xe9guli\xe8rement', u',', u'je', u'n', u'ai', u'jamais', u'eu', u'l', u'intention', u'd', u'avoir', u'des', u'enfants', u',', u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent', u'$'] +reste +True +texte_uce +[u'\xe9ventuellement', u'avoir', u'des', u'enfants', u'mais', u'dans', u'vingt', u'ans'] +suite +[u'je', u'veux', u'avoir', u'un', u'boulot', u'int\xe9ressant', u',', u'pratiquer', u'un', u'sport', u'r\xe9guli\xe8rement', u',', u'je', u'n', u'ai', u'jamais', u'eu', u'l', u'intention', u'd', u'avoir', u'des', u'enfants', u',', u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'un', u'boulot', u'int\xe9ressant', u',', u'pratiquer', u'un', u'sport', u'r\xe9guli\xe8rement'] +suite +[u'je', u'n', u'ai', u'jamais', u'eu', u'l', u'intention', u'd', u'avoir', u'des', u'enfants', u',', u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent', u'$'] +reste +True +texte_uce +[u'je', u'n', u'ai', u'jamais', u'eu', u'l', u'intention', u'd', u'avoir', u'des', u'enfants'] +suite +[u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent', u'$'] +reste +True +texte_uce +[u'et', u'\xe7a', u'fait', u'deux', u'ans', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'de', u'ne', u'pas', u'me', u'marier', u',', u'je', u'veux', u'avoir', u'de', u'l', u'argent'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'quand', u'j', u'aurai', u'trouver', u'l', u'homme', u'id\xe9al'] +suite +[u'je', u'veux', u'me', u'marier', u'avoir', u'des', u'enfants', u'et', u'une', u'belle', u'maison', u',', u'je', u'voudrais', u'travailler', u'dans', u'le', u'professionnel', u'de', u'la', u'publicit\xe9', u',', u'le', u'dessin', u',', u'mais', u'je', u'n', u'ai', u'pas', u'de', u'bons', u'r\xe9sultats', u',', u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison', u',', u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9', u',', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avoir', u'des', u'enfants', u'et', u'une', u'belle', u'maison'] +suite +[u'je', u'voudrais', u'travailler', u'dans', u'le', u'professionnel', u'de', u'la', u'publicit\xe9', u',', u'le', u'dessin', u',', u'mais', u'je', u'n', u'ai', u'pas', u'de', u'bons', u'r\xe9sultats', u',', u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison', u',', u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9', u',', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'je', u'voudrais', u'travailler', u'dans', u'le', u'professionnel', u'de', u'la', u'publicit\xe9'] +suite +[u'le', u'dessin', u',', u'mais', u'je', u'n', u'ai', u'pas', u'de', u'bons', u'r\xe9sultats', u',', u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison', u',', u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9', u',', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'le', u'dessin', u',', u'mais', u'je', u'n', u'ai', u'pas', u'de', u'bons', u'r\xe9sultats'] +suite +[u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison', u',', u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9', u',', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'depuis', u'que', u'je', u'suis', u'petite', u'je', u'r\xeave', u'd', u'avoir', u'une', u'voiture', u'et', u'une', u'belle', u'maison'] +suite +[u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela', u',', u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9', u',', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'mais', u'je', u'ne', u'savais', u'pas', u'qu', u'il', u'fallait', u'travailler', u'pour', u'cela'] +suite +[u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9', u',', u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'maintenant', u'j', u'esp\xe8re', u'r\xe9aliser', u'mon', u'r\xeave', u'en', u'travaillant', u'et', u'en', u'mettant', u'de', u'l', u'argent', u'de', u'cot\xe9'] +suite +[u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans', u',', u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'avoir', u'des', u'enfants', u'dans', u'dix', u'ans', u'commencer', u'ma', u'carri\xe8re', u'dans', u'cinq', u'ans'] +suite +[u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re', u';', u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'avoir', u'un', u'appartement', u'avec', u'des', u'copines', u'et', u'apr\xe8s', u'acheter', u'une', u'maison', u',', u'je', u'veux', u'aussi', u'\xeatre', u'grand_m\xe8re'] +suite +[u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance', u'$'] +reste +True +texte_uce +[u'pour', u'que', u'les', u'jeunes', u'r\xe9alisent', u'leurs', u'projets', u',', u'il', u'faut', u'que', u'les', u'parents', u'leur', u'fasse', u'confiance'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'mon', u'baccalaur\xe9at', u'avoir', u'un', u'bon', u'm\xe9tier', u',', u'continuer', u'le', u'patinage', u',', u'vivre', u'heureuse', u',', u'\xeatre', u'heureuse', u',', u'tout', u'\xe7a', u'dans', u'une', u'dizaine', u'd', u'ann\xe9es'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'passer', u'un', u'bon', u'brevet', u',', u'pas', u'de', u'diff\xe9rence', u'entre', u'le', u'beau', u'et', u'le', u'laid'] +suite +[u'pas', u'de', u'diff\xe9rence', u'entre', u'les', u'filles', u'et', u'les', u'gar\xe7ons', u'et', u'que', u'les', u'gens', u'ne', u'jugent', u'pas', u',', u'je', u'ne', u'sais', u'pas', u'je', u'voudrais', u'qu', u'il', u'n', u'y', u'ait', u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent', u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes', u',', u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer', u'$'] +reste +True +texte_uce +[u'pas', u'de', u'diff\xe9rence', u'entre', u'les', u'filles', u'et', u'les', u'gar\xe7ons', u'et', u'que', u'les', u'gens', u'ne', u'jugent', u'pas'] +suite +[u'je', u'ne', u'sais', u'pas', u'je', u'voudrais', u'qu', u'il', u'n', u'y', u'ait', u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent', u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes', u',', u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'sais', u'pas', u'je', u'voudrais', u'qu', u'il', u'n', u'y'] +suite +[u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent', u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes', u',', u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer', u'$'] +reste +True +texte_uce +[u'pas', u'de', u'guerre', u'et', u'que', u'des', u'enfants', u'meurent', u'\xe0', u'cause', u'de', u'la', u'connerie', u'des', u'adultes'] +suite +[u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer', u'$'] +reste +True +texte_uce +[u'ils', u'd\xe9truisent', u'l', u'avenir', u'des', u'enfants', u'innocents', u'qui', u'se', u'font', u'tuer'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'dix', u'ans', u'que', u'je', u'pense', u'continuer', u'mes', u'\xe9tudes', u'pour', u'pouvoir', u'avoir', u'une', u'bonne', u'place', u'dans', u'mon', u'pays'] +suite +[u'un', u'meilleur', u'salaire', u',', u'ce', u'projet', u',', u'me', u'prendra', u'bien', u'dix', u'ans', u'car', u'je', u'veux', u'faire', u'un', u'cycle', u'long', u'il', u'me', u'faut', u'du', u'courage', u',', u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence', u',', u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles', u'$'] +reste +True +texte_uce +[u'un', u'meilleur', u'salaire', u',', u'ce', u'projet'] +suite +[u'me', u'prendra', u'bien', u'dix', u'ans', u'car', u'je', u'veux', u'faire', u'un', u'cycle', u'long', u'il', u'me', u'faut', u'du', u'courage', u',', u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence', u',', u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles', u'$'] +reste +True +texte_uce +[u'me', u'prendra', u'bien', u'dix', u'ans', u'car', u'je', u'veux', u'faire', u'un', u'cycle', u'long', u'il', u'me', u'faut', u'du', u'courage'] +suite +[u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence', u',', u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles', u'$'] +reste +True +texte_uce +[u'de', u'la', u'pers\xe9v\xe9rance', u'et', u'de', u'l', u'intelligence'] +suite +[u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles', u'$'] +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'docteur', u'pour', u'obtenir', u'des', u'meilleures', u'conditions', u'de', u'vie', u',', u'les', u'\xe9tudes', u'sont', u'longues', u'et', u'difficiles'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'm\xe9tier', u'bien', u',', u'arriver', u'\xe0', u'bien', u'nager'] +suite +[u'mes', u'projets', u'sont', u'r\xe9alisables', u'car', u'modestes', u',', u'je', u'veux', u'aussi', u'une', u'grande', u'voili\xe8re', u',', u'ce', u'qu', u'il', u'faut', u'c', u'est', u'que', u'les', u'gens', u'soient', u'plus', u'attentifs', u'aux', u'autres', u'et', u'qu', u'ils', u'les', u'aident', u'pour', u'r\xe9aliser', u'leurs', u'projets', u'$'] +reste +True +texte_uce +[u'mes', u'projets', u'sont', u'r\xe9alisables', u'car', u'modestes', u',', u'je', u'veux', u'aussi', u'une', u'grande', u'voili\xe8re'] +suite +[u'ce', u'qu', u'il', u'faut', u'c', u'est', u'que', u'les', u'gens', u'soient', u'plus', u'attentifs', u'aux', u'autres', u'et', u'qu', u'ils', u'les', u'aident', u'pour', u'r\xe9aliser', u'leurs', u'projets', u'$'] +reste +True +texte_uce +[u'ce', u'qu', u'il', u'faut', u'c', u'est', u'que', u'les', u'gens', u'soient', u'plus', u'attentifs', u'aux', u'autres', u'et', u'qu', u'ils', u'les', u'aident', u'pour', u'r\xe9aliser', u'leurs', u'projets'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'jusqu_au', u'baccalaur\xe9at', u'et', u'faire', u'un', u'boulot', u'qui', u'me', u'pla\xeet', u'je', u'veux', u'avoir', u'une', u'belle', u'voiture', u'de', u'sport'] +suite +[u'une', u'femme', u'et', u'un', u'enfant', u'minimum', u'$'] +reste +True +texte_uce +[u'une', u'femme', u'et', u'un', u'enfant', u'minimum'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'pense', u'rentrer', u'\xe0', u'l', u'\xe9cole', u'd', u'h\xf4telerie', u'et', u'essayer', u'd', u'avoir', u'un', u'bon', u'dipl\xf4me'] +suite +[u'avoir', u'un', u'salaire', u'tr\xe8s', u'fort', u'et', u'travailler', u'dans', u'un', u'restaurant', u'comme', u'cuisinier', u'et', u'apprenti', u',', u'j', u'esp\xe8re', u'que', u'je', u'vais', u'faire', u'la', u'f\xeate', u'avant', u'de', u'me', u'marier', u',', u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui', u'fais', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret', u'$'] +reste +True +texte_uce +[u'avoir', u'un', u'salaire', u'tr\xe8s', u'fort', u'et', u'travailler', u'dans', u'un', u'restaurant', u'comme', u'cuisinier', u'et', u'apprenti'] +suite +[u'j', u'esp\xe8re', u'que', u'je', u'vais', u'faire', u'la', u'f\xeate', u'avant', u'de', u'me', u'marier', u',', u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui', u'fais', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret', u'$'] +reste +True +texte_uce +[u'j', u'esp\xe8re', u'que', u'je', u'vais', u'faire', u'la', u'f\xeate', u'avant', u'de', u'me', u'marier'] +suite +[u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui', u'fais', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'profite', u'de', u'ma', u'femme', u'et', u'je', u'lui', u'fais', u'des', u'enfants'] +suite +[u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'deviens', u'milliardaire', u',', u'je', u'prends', u'la', u'retraite', u'anticip\xe9e', u',', u'plein', u'de', u'filles', u'et', u'mourir', u'sans', u'regret'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'faire', u'de', u'longues', u'\xe9tudes', u',', u'et', u'avoir', u'un', u'bon', u'm\xe9tier'] +suite +[u'aussi', u'passer', u'mon', u'permis', u'un', u'appartement', u'\xeatre', u'ind\xe9pendante', u'et', u'avoir', u'un', u'chat', u',', u'il', u'ne', u'faut', u'pas', u'que', u'je', u'fasse', u'tout', u'en', u'm\xeame', u'temps', u'je', u'ne', u'veux', u'pas', u'me', u'sentir', u'bousculer', u',', u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un', u'mari', u'et', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage', u'.', u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien', u',', u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'aussi', u'passer', u'mon', u'permis', u'un', u'appartement', u'\xeatre', u'ind\xe9pendante', u'et', u'avoir', u'un', u'chat'] +suite +[u'il', u'ne', u'faut', u'pas', u'que', u'je', u'fasse', u'tout', u'en', u'm\xeame', u'temps', u'je', u'ne', u'veux', u'pas', u'me', u'sentir', u'bousculer', u',', u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un', u'mari', u'et', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage', u'.', u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien', u',', u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'il', u'ne', u'faut', u'pas', u'que', u'je', u'fasse', u'tout', u'en', u'm\xeame', u'temps', u'je', u'ne', u'veux', u'pas', u'me', u'sentir', u'bousculer'] +suite +[u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un', u'mari', u'et', u'des', u'enfants', u',', u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage', u'.', u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien', u',', u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'pour', u'la', u'famille', u'l', u'id\xe9al', u'c', u'est', u'd', u'avoir', u'un', u'mari', u'et', u'des', u'enfants'] +suite +[u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage', u'.', u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien', u',', u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'mets', u'de', u'l', u'argent', u'de', u'c\xf4t\xe9', u'pour', u'pouvoir', u'partir', u'en', u'voyage'] +suite +[u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien', u',', u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'j', u'ai', u'fais', u'un', u'voyage', u'derni\xe8rement', u'et', u'j', u'aime', u'bien'] +suite +[u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager', u',', u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'c', u'est', u'pour', u'cela', u'que', u'je', u'veux', u'voyager'] +suite +[u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle', u',', u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'bon', u'je', u'veux', u'faire', u'des', u'longues', u'\xe9tudes', u'dans', u'le', u'grand', u'cycle'] +suite +[u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher', u'$'] +reste +True +texte_uce +[u'apr\xe8s', u'je', u'me', u'marie', u'mais', u'je', u'profite', u'de', u'la', u'vie', u'avant', u'de', u'm', u'attacher'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'ai', u'\xe9t\xe9', u'\xe0', u'l', u'h\xf4pital', u'et', u'l\xe0', u'j', u'ai', u'compris', u'que', u'les', u'm\xe9tiers', u'dans', u'le', u'sanitaire', u'c', u'\xe9tait', u'important'] +suite +[u'essentiel', u'pour', u'la', u'soci\xe9t\xe9', u',', u'car', u'ils', u'savent', u'les', u'vies', u'et', u'\xe9vitent', u'les', u'malheurs', u',', u'c', u'est', u'pour', u'cela', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'infirmi\xe8re', u',', u'donc', u'poursuivre', u'mes', u'\xe9tudes', u'et', u'me', u'marier', u'un', u'jour', u'et', u'avoir', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'essentiel', u'pour', u'la', u'soci\xe9t\xe9', u',', u'car', u'ils', u'savent', u'les', u'vies', u'et', u'\xe9vitent', u'les', u'malheurs'] +suite +[u'c', u'est', u'pour', u'cela', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'infirmi\xe8re', u',', u'donc', u'poursuivre', u'mes', u'\xe9tudes', u'et', u'me', u'marier', u'un', u'jour', u'et', u'avoir', u'des', u'enfants', u'$'] +reste +True +texte_uce +[u'c', u'est', u'pour', u'cela', u'que', u'j', u'ai', u'd\xe9cid\xe9', u'd', u'\xeatre', u'infirmi\xe8re', u',', u'donc', u'poursuivre', u'mes', u'\xe9tudes', u'et', u'me', u'marier', u'un', u'jour', u'et', u'avoir', u'des', u'enfants'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'plus', u'tard', u'je', u'veux', u'devenir', u'styliste', u'car', u'la', u'mode', u'\xe7a', u'm', u'attire', u'bien'] +suite +[u'je', u'veux', u'devenir', u'un', u'grand', u'styliste', u',', u'comme', u'tout', u'le', u'monde', u'je', u'veux', u'devenir', u'riche', u'et', u'vivre', u'sans', u'probl\xe8me', u',', u'je', u'suis', u'certaine', u'de', u'ne', u'pas', u'me', u'marier', u',', u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9', u',', u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'devenir', u'un', u'grand', u'styliste'] +suite +[u'comme', u'tout', u'le', u'monde', u'je', u'veux', u'devenir', u'riche', u'et', u'vivre', u'sans', u'probl\xe8me', u',', u'je', u'suis', u'certaine', u'de', u'ne', u'pas', u'me', u'marier', u',', u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9', u',', u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'comme', u'tout', u'le', u'monde', u'je', u'veux', u'devenir', u'riche', u'et', u'vivre', u'sans', u'probl\xe8me'] +suite +[u'je', u'suis', u'certaine', u'de', u'ne', u'pas', u'me', u'marier', u',', u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9', u',', u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'je', u'suis', u'certaine', u'de', u'ne', u'pas', u'me', u'marier'] +suite +[u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9', u',', u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'mais', u'j', u'ai', u'tout', u'de', u'm\xeame', u'une', u'id\xe9e', u'de', u'l', u'homme', u'id\xe9al', u'grand', u'brun', u'yeux', u'bleus', u'muscl\xe9'] +suite +[u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants', u',', u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'beau', u'quoi', u',', u'je', u'ne', u'veux', u'que', u'deux', u'enfants'] +suite +[u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison', u',', u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'une', u'grande', u'maison', u',', u'pas', u'ici', u'et', u'm\xeame', u'un', u'autre', u'maison'] +suite +[u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'faire', u'le', u'tour', u'du', u'monde', u',', u'je', u'veux', u'une', u'grande', u'voiture', u',', u'je', u'veux', u'rencontrer', u'des', u'stars', u'du', u'cin\xe9ma'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'faire', u'des', u'\xe9tudes', u'dans', u'la', u'comptabilit\xe9'] +suite +[u'et', u'dans', u'dix', u'ans', u'travailler', u',', u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'tout', u'de', u'suite', u'je', u'veux', u'avoir', u'un', u'appartement', u'pour', u'moi', u'seule', u'ou', u'avec', u'une', u'amie', u',', u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents', u',', u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie', u'$'] +reste +True +texte_uce +[u'et', u'dans', u'dix', u'ans', u'travailler'] +suite +[u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'tout', u'de', u'suite', u'je', u'veux', u'avoir', u'un', u'appartement', u'pour', u'moi', u'seule', u'ou', u'avec', u'une', u'amie', u',', u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents', u',', u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie', u'$'] +reste +True +texte_uce +[u'je', u'ne', u'veux', u'pas', u'me', u'marier', u'tout', u'de', u'suite', u'je', u'veux', u'avoir', u'un', u'appartement', u'pour', u'moi', u'seule', u'ou', u'avec', u'une', u'amie'] +suite +[u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents', u',', u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie', u'$'] +reste +True +texte_uce +[u'et', u'essayer', u'de', u'vivre', u'seule', u'sans', u'mes', u'parents'] +suite +[u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'go\xfbter', u'la', u'libert\xe9', u'sans', u'les', u'parents', u',', u'ensuite', u'continuer', u'le', u'travail', u'm\xeame', u'si', u'je', u'me', u'marie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'j', u'aimerais', u'devenir', u'informaticienne'] +suite +[u'je', u'l', u'ai', u'd\xe9cid\xe9', u'cette', u'ann\xe9e', u'car', u'dans', u'ma', u'classe', u'on', u'choisit', u'une', u'orientation', u'et', u'on', u'envisage', u'diff\xe9rents', u'm\xe9tiers', u'ils', u'vont', u'\xeatre', u'r\xe9alisables', u'dans', u'dix', u'ans', u'car', u'c', u'est', u'l\xe0', u'que', u'je', u'vais', u'avoir', u'fini', u'mes', u'\xe9tudes', u',', u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques', u',', u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'je', u'l', u'ai', u'd\xe9cid\xe9', u'cette', u'ann\xe9e', u'car', u'dans', u'ma', u'classe'] +suite +[u'choisit', u'une', u'orientation', u'et', u'on', u'envisage', u'diff\xe9rents', u'm\xe9tiers', u'ils', u'vont', u'\xeatre', u'r\xe9alisables', u'dans', u'dix', u'ans', u'car', u'c', u'est', u'l\xe0', u'que', u'je', u'vais', u'avoir', u'fini', u'mes', u'\xe9tudes', u',', u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques', u',', u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'choisit', u'une', u'orientation', u'et', u'on', u'envisage', u'diff\xe9rents', u'm\xe9tiers', u'ils', u'vont'] +suite +[u'r\xe9alisables', u'dans', u'dix', u'ans', u'car', u'c', u'est', u'l\xe0', u'que', u'je', u'vais', u'avoir', u'fini', u'mes', u'\xe9tudes', u',', u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques', u',', u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'r\xe9alisables', u'dans', u'dix', u'ans', u'car', u'c', u'est', u'l\xe0', u'que', u'je', u'vais', u'avoir', u'fini', u'mes', u'\xe9tudes'] +suite +[u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques', u',', u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'je', u'voudrai', u'aller', u'aux', u'jeux', u'olympiques'] +suite +[u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut', u'avoir', u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'je', u'voudrais', u'un', u'gar\xe7on', u'mais', u'pas', u'de', u'mariage', u'il', u'faut'] +suite +[u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs', u'projets', u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'plus', u'confiance', u'aux', u'jeunes', u'pour', u'leur', u'permettre', u'de', u'r\xe9aliser', u'leurs'] +suite +[u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire', u'$'] +reste +True +texte_uce +[u'ne', u'pas', u'les', u'diriger', u'leur', u'imposer', u'ce', u'qui', u'n', u'est', u'pas', u'n\xe9cessaire', u'et', u'qu', u'ils', u'ne', u'veulent', u'pas', u'faire'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'un', u'an', u'je', u'pars', u'de', u'chez', u'moi'] +suite +[u'je', u'passe', u'mon', u'permis', u'de', u'voiture', u'et', u'je', u'trouve', u'un', u'travail', u'je', u'loue', u'une', u'maison', u'et', u'je', u'passe', u'une', u'belle', u'vie', u'et', u'apr\xe8s', u'je', u'me', u'marie', u'$'] +reste +True +texte_uce +[u'je', u'passe', u'mon', u'permis', u'de', u'voiture', u'et', u'je', u'trouve', u'un'] +suite +[u'je', u'loue', u'une', u'maison', u'et', u'je', u'passe', u'une', u'belle', u'vie', u'et', u'apr\xe8s', u'je', u'me', u'marie', u'$'] +reste +True +texte_uce +[u'je', u'loue', u'une', u'maison', u'et', u'je', u'passe', u'une', u'belle', u'vie', u'et', u'apr\xe8s', u'je', u'me', u'marie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'avoir', u'un', u'bon', u'm\xe9tier', u'dans', u'le', u'domaine', u'sportif'] +suite +[u'avoir', u'beaucoup', u'd', u'argent', u'et', u'avoir', u'une', u'bonne', u'vie', u'de', u'famille', u',', u'plus', u'de', u'politique', u',', u'plus', u'de', u'clochards', u',', u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de', u'ma\xe7on', u'qui', u'ne', u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau', u'$'] +reste +True +texte_uce +[u'avoir', u'beaucoup', u'd', u'argent', u'et', u'avoir', u'une', u'bonne', u'vie', u'de', u'famille'] +suite +[u'plus', u'de', u'politique', u',', u'plus', u'de', u'clochards', u',', u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de', u'ma\xe7on', u'qui', u'ne', u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau', u'$'] +reste +True +texte_uce +[u'plus', u'de', u'politique', u',', u'plus', u'de', u'clochards'] +suite +[u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de', u'ma\xe7on', u'qui', u'ne', u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau', u'$'] +reste +True +texte_uce +[u'plus', u'de', u'famine', u'plus', u'de', u'racisme', u'pas', u'de', u'ma\xe7on', u'qui'] +suite +[u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans', u'le', u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau', u'$'] +reste +True +texte_uce +[u'gagnent', u'pas', u'leur', u'vie', u'\xe0', u'cause', u'de', u'l', u'orientation', u'dans'] +suite +[u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau', u'$'] +reste +True +texte_uce +[u'coll\xe8ge', u'on', u'g\xe2che', u'sa', u'vie', u'ce', u'que', u'je', u'veux', u'c', u'est', u'de', u'bien', u'me', u'sentir', u'dans', u'ma', u'peau'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'\xe7a', u'fait', u'un', u'an', u'que', u'je', u'commence', u'\xe0', u'avoir', u'des', u'projets', u'je', u'veux', u'un', u'boulot', u'qui', u'me', u'fasse', u'gagner', u'de', u'l', u'argent'] +suite +[u'la', u'm\xe9decine', u',', u'je', u'vais', u'me', u'lancer', u'dans', u'le', u'sport', u'je', u'vais', u'm', u'inscrire', u'dans', u'un', u'grand', u'club', u',', u'faire', u'de', u'longues', u'\xe9tudes', u',', u'pour', u'ma', u'vie', u'sentimental', u'rencontrer', u'des', u'filles', u'faire', u'des', u'connaissances', u'agr\xe9ables', u',', u'je', u'veux', u'le', u'permis', u',', u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux', u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux', u'$'] +reste +True +texte_uce +[u'la', u'm\xe9decine', u',', u'je', u'vais', u'me', u'lancer', u'dans', u'le', u'sport', u'je', u'vais', u'm', u'inscrire', u'dans', u'un', u'grand', u'club'] +suite +[u'faire', u'de', u'longues', u'\xe9tudes', u',', u'pour', u'ma', u'vie', u'sentimental', u'rencontrer', u'des', u'filles', u'faire', u'des', u'connaissances', u'agr\xe9ables', u',', u'je', u'veux', u'le', u'permis', u',', u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux', u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux', u'$'] +reste +True +texte_uce +[u'faire', u'de', u'longues', u'\xe9tudes', u',', u'pour', u'ma', u'vie', u'sentimental', u'rencontrer', u'des', u'filles', u'faire', u'des', u'connaissances', u'agr\xe9ables'] +suite +[u'je', u'veux', u'le', u'permis', u',', u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux', u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'le', u'permis', u',', u'pour', u'moi', u'mes', u'parents', u'c', u'est', u'sacr\xe9', u'je', u'veux', u'rester', u'le', u'plus', u'longtemps', u'avec', u'eux'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'ne', u'sais', u'rien', u'sur', u'mes', u'projets', u'je', u'ne', u'sais', u'pas', u'je', u'ne', u'sais', u'pas'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'n', u'ai', u'pas', u'de', u'projet', u'en', u'ce', u'moment', u'je'] +suite +[u'pense', u'qu', u'aux', u'filles', u'je', u'ne', u'pense', u'qu', u'\xe0', u'cela', u'je', u'ne', u'pense', u'qu', u'aux', u'filles', u',', u'les', u'filles', u'$'] +reste +True +texte_uce +[u'pense', u'qu', u'aux', u'filles', u'je', u'ne', u'pense', u'qu', u'\xe0', u'cela', u'je', u'ne', u'pense', u'qu', u'aux', u'filles', u',', u'les', u'filles'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'je', u'pars', u'de', u'chez', u'moi'] +suite +[u'et', u'je', u'passe', u'mon', u'permis', u'de', u'conduire', u'apr\xe8s', u'je', u'me', u'marie', u'et', u'je', u'pratique', u'\xe0', u'fond', u'la', u'religion', u'je', u'veux', u'profiter', u'de', u'la', u'vie', u'mais', u'apr\xe8s', u'c', u'est', u'l', u'enfer', u'$'] +reste +True +texte_uce +[u'et', u'je', u'passe', u'mon', u'permis', u'de', u'conduire', u'apr\xe8s', u'je', u'me'] +suite +[u'et', u'je', u'pratique', u'\xe0', u'fond', u'la', u'religion', u'je', u'veux', u'profiter', u'de', u'la', u'vie', u'mais', u'apr\xe8s', u'c', u'est', u'l', u'enfer', u'$'] +reste +True +texte_uce +[u'et', u'je', u'pratique', u'\xe0', u'fond', u'la', u'religion', u'je', u'veux', u'profiter', u'de', u'la', u'vie', u'mais', u'apr\xe8s', u'c', u'est', u'l', u'enfer'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'femme', u'et', u'un', u'appartement'] +suite +[u'pour', u'la', u'profession', u'je', u'voudrais', u'm', u'orienter', u'vers', u'une', u'formation', u'technique', u'pour', u'r\xe9aliser', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'apr\xe8s', u'quand', u'je', u'serai', u'vieux', u'je', u'veux', u'faire', u'le', u'p\xe8lerinage', u',', u'si', u'tout', u'va', u'bien', u'$'] +reste +True +texte_uce +[u'pour', u'la', u'profession', u'je', u'voudrais', u'm', u'orienter', u'vers', u'une', u'formation'] +suite +[u'pour', u'r\xe9aliser', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'apr\xe8s', u'quand', u'je', u'serai', u'vieux', u'je', u'veux', u'faire', u'le', u'p\xe8lerinage', u',', u'si', u'tout', u'va', u'bien', u'$'] +reste +True +texte_uce +[u'pour', u'r\xe9aliser', u'tout', u'cela', u'il', u'faut', u'que', u'je', u'travaille', u'apr\xe8s', u'quand', u'je', u'serai', u'vieux', u'je', u'veux', u'faire', u'le', u'p\xe8lerinage', u',', u'si', u'tout', u'va', u'bien'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'compte', u'faire', u'une', u'formation', u'technique', u'et', u'apr\xe8s', u'cette', u'formation', u'fonder', u'une', u'famille', u'et', u'avoir', u'une', u'voiture'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'dans', u'deux', u'ans', u'\xe0', u'la', u'majorit\xe9', u',', u'je', u'veux', u'avoir', u'un', u'appartement'] +suite +[u'je', u'ferai', u'des', u'petits', u'boulots', u'je', u'veux', u'mon', u'ind\xe9pendance', u',', u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'en', u'faisant', u'les', u'petits', u'boulots', u'une', u'formation', u'technique', u',', u'avec', u'une', u'bonne', u'formation', u'fonder', u'une', u'famille', u'et', u'essayer', u'd', u'\xeatre', u'heureux', u'$'] +reste +True +texte_uce +[u'je', u'ferai', u'des', u'petits', u'boulots', u'je', u'veux', u'mon', u'ind\xe9pendance'] +suite +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'en', u'faisant', u'les', u'petits', u'boulots', u'une', u'formation', u'technique', u',', u'avec', u'une', u'bonne', u'formation', u'fonder', u'une', u'famille', u'et', u'essayer', u'd', u'\xeatre', u'heureux', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'en', u'faisant', u'les', u'petits', u'boulots', u'une', u'formation', u'technique'] +suite +[u'avec', u'une', u'bonne', u'formation', u'fonder', u'une', u'famille', u'et', u'essayer', u'd', u'\xeatre', u'heureux', u'$'] +reste +True +texte_uce +[u'avec', u'une', u'bonne', u'formation', u'fonder', u'une', u'famille', u'et', u'essayer', u'd', u'\xeatre', u'heureux'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'voyager', u',', u'dans', u'tout', u'le', u'monde', u'avoir', u'plein', u'de', u'voitures', u'et', u'de', u'femmes', u'je', u'veux', u'\xeatre', u'riche', u'et', u'avoir', u'plein', u'de', u'femmes'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'professeur', u'de', u'physique', u'et', u'pour', u'cela', u'il', u'faut', u'que', u'je', u'continue', u'mes', u'\xe9tudes'] +suite +[u'ensuite', u'j', u'esp\xe8re', u'me', u'marier', u',', u'avoir', u'une', u'voiture', u'et', u'une', u'maison', u'$'] +reste +True +texte_uce +[u'ensuite', u'j', u'esp\xe8re', u'me', u'marier', u',', u'avoir', u'une', u'voiture', u'et', u'une', u'maison'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'un', u'bon', u'boulot', u'qui', u'me', u'rapporte', u'de', u'l', u'argent'] +suite +[u'et', u'je', u'veux', u'pouvoir', u'faire', u'des', u'voyages', u',', u'je', u'veux', u'continuer', u'dans', u'la', u'danse', u'et', u'devenir', u'une', u'professionnel', u',', u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'car', u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu', u'$'] +reste +True +texte_uce +[u'et', u'je', u'veux', u'pouvoir', u'faire', u'des', u'voyages'] +suite +[u'je', u'veux', u'continuer', u'dans', u'la', u'danse', u'et', u'devenir', u'une', u'professionnel', u',', u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'car', u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'dans', u'la', u'danse', u'et', u'devenir', u'une', u'professionnel'] +suite +[u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'car', u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'\xe0', u'garder', u'des', u'liens', u'avec', u'ma', u'famille'] +suite +[u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu', u'$'] +reste +True +texte_uce +[u'elle', u'est', u'sacr\xe9e', u'je', u'veux', u'aussi', u'un', u'super', u'mari', u'pour', u'que', u'\xe7a', u'se', u'r\xe9alise', u'il', u'faut', u'de', u'la', u'chance', u',', u'il', u'faut', u'compter', u'sur', u'dieu'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'toujours', u'garder', u'des', u'liens', u'avec', u'ma', u'famille', u'au', u'niveau', u'de', u'mon', u'm\xe9tier', u'je', u'veux', u'faire', u'un', u'travail', u'social'] +suite +[u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille', u'et', u'avoir', u'de', u'belles', u'maisons', u'j', u'esp\xe8re', u'voyager', u'dans', u'tout', u'le', u'monde', u',', u'je', u'pense', u'pouvoir', u'r\xe9aliser', u'tout', u'cela', u'par', u'rapport', u'\xe0', u'mon', u'mariage', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille', u'et', u'avoir', u'de', u'belles', u'maisons', u'j', u'esp\xe8re', u'voyager', u'dans', u'tout', u'le', u'monde'] +suite +[u'je', u'pense', u'pouvoir', u'r\xe9aliser', u'tout', u'cela', u'par', u'rapport', u'\xe0', u'mon', u'mariage', u'$'] +reste +True +texte_uce +[u'je', u'pense', u'pouvoir', u'r\xe9aliser', u'tout', u'cela', u'par', u'rapport', u'\xe0', u'mon', u'mariage'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'avoir', u'une', u'bonne', u'qualification', u'pour', u'le', u'm\xe9tier', u'et', u'\xe7a', u'sera', u'possible', u'si', u'je', u'continue', u'mes', u'\xe9tudes', u'apr\xe8s', u'cela', u'penser', u'\xe0', u'la', u'vie', u'sentimentale'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'pour', u'faire', u'de', u'l', u'anglais', u'ou', u'la', u'm\xe9decine'] +suite +[u'il', u'faut', u'multiplier', u'les', u'centres', u'de', u'rencontre', u'pour', u'les', u'jeunes', u'je', u'veux', u'vivre', u'dans', u'un', u'grand', u'et', u'beau', u'pays', u'dans', u'un', u'pays', u'de', u'la', u'libert\xe9', u'je', u'veux', u'rencontrer', u'des', u'gens', u'connus', u'et', u'me', u'marier', u'avec', u'une', u'vedette', u'$'] +reste +True +texte_uce +[u'il', u'faut', u'multiplier', u'les', u'centres', u'de', u'rencontre', u'pour', u'les', u'jeunes'] +suite +[u'veux', u'vivre', u'dans', u'un', u'grand', u'et', u'beau', u'pays', u'dans', u'un', u'pays', u'de', u'la', u'libert\xe9', u'je', u'veux', u'rencontrer', u'des', u'gens', u'connus', u'et', u'me', u'marier', u'avec', u'une', u'vedette', u'$'] +reste +True +texte_uce +[u'veux', u'vivre', u'dans', u'un', u'grand', u'et', u'beau', u'pays', u'dans', u'un'] +suite +[u'de', u'la', u'libert\xe9', u'je', u'veux', u'rencontrer', u'des', u'gens', u'connus', u'et', u'me', u'marier', u'avec', u'une', u'vedette', u'$'] +reste +True +texte_uce +[u'de', u'la', u'libert\xe9', u'je', u'veux', u'rencontrer', u'des', u'gens', u'connus', u'et', u'me', u'marier', u'avec', u'une', u'vedette'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'veux', u'continuer', u'mes', u'\xe9tudes', u'et', u'faire', u'un', u'travail', u'int\xe9ressant', u'et', u'qui', u'rapporte', u'de', u'l', u'argent'] +suite +[u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille', u',', u'je', u'veux', u'vivre', u'dans', u'un', u'beau', u'pays', u'je', u'veux', u'beaucoup', u'voyager', u',', u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense', u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper', u',', u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'et', u'fonder', u'une', u'famille'] +suite +[u'je', u'veux', u'vivre', u'dans', u'un', u'beau', u'pays', u'je', u'veux', u'beaucoup', u'voyager', u',', u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense', u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper', u',', u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'vivre', u'dans', u'un', u'beau', u'pays', u'je', u'veux', u'beaucoup', u'voyager'] +suite +[u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense', u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper', u',', u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie', u'$'] +reste +True +texte_uce +[u'une', u'fois', u'bien', u'profiter', u'de', u'la', u'vie', u'je', u'pense', u'faire', u'des', u'enfants', u'et', u'm', u'en', u'occuper'] +suite +[u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie', u'$'] +reste +True +texte_uce +[u'si', u'je', u'pouvais', u'avoir', u'plus', u'de', u'libert\xe9', u'pour', u'plus', u'profiter', u'de', u'la', u'vie'] +suite +[] +reste +False +texte_uce +[] +suite + +reste +True +texte_uce +[u'je', u'voudrais', u'\xeatre', u'une', u'danseuse', u'et', u'en', u'faire', u'mon', u'm\xe9tier'] +suite +[u'mais', u'pour', u'cela', u'il', u'faut', u'de', u'l', u'argent', u'sinon', u'je', u'vais', u'faire', u'un', u'travail', u'de', u'technique', u'en', u'biologie', u',', u'je', u'veux', u'me', u'marier', u'avec', u'un', u'super', u'mari', u'mais', u'je', u'n', u'ai', u'pas', u'trop', u'd', u'espoir', u'\xe0', u'ce', u'niveau', u'l\xe0', u'$'] +reste +True +texte_uce +[u'mais', u'pour', u'cela', u'il', u'faut', u'de', u'l', u'argent', u'sinon', u'je', u'vais', u'faire', u'un', u'travail', u'de', u'technique', u'en', u'biologie'] +suite +[u'je', u'veux', u'me', u'marier', u'avec', u'un', u'super', u'mari', u'mais', u'je', u'n', u'ai', u'pas', u'trop', u'd', u'espoir', u'\xe0', u'ce', u'niveau', u'l\xe0', u'$'] +reste +True +texte_uce +[u'je', u'veux', u'me', u'marier', u'avec', u'un', u'super', u'mari', u'mais', u'je', u'n', u'ai', u'pas', u'trop', u'd', u'espoir', u'\xe0', u \ No newline at end of file diff --git a/autres/textafcuci.py b/autres/textafcuci.py new file mode 100644 index 0000000..c76e01a --- /dev/null +++ b/autres/textafcuci.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#License: GNU/GPL + +#------------------------------------ +# import des modules python +#------------------------------------ +import os +from time import time, sleep + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +from chemins import ConstructPathOut, ConstructAfcUciPath +from layout import GraphPanel +#from PrintRScript import RAfcUci +from corpus import Corpus +from listlex import * +from functions import ReadList, progressbar, exec_rcode, check_Rresult +from configparser import RawConfigParser + + +class AfcUci(): + + def __init__(self, parent, cmd = False): + #################################################################### + self.conf = None + self.parent = parent + self.type = 'afcuci' + self.cmd = cmd + self.corpus = Corpus(parent) + self.corpus.parametre['encodage'] = parent.corpus_encodage + self.corpus.parametre['filename'] = parent.filename + self.corpus.parametre['lang'] = parent.corpus_lang + self.corpus.content = self.parent.content + self.ConfigPath = parent.ConfigPath + self.DictPath = parent.DictPath + self.AlcesteConf = RawConfigParser() + self.AlcesteConf.read(self.ConfigPath['alceste']) + self.KeyConf = RawConfigParser() + self.KeyConf.read(self.ConfigPath['key']) + pathout = ConstructPathOut(self.corpus.parametre['filename'], 'afcuci') + self.corpus.dictpathout = ConstructAfcUciPath(pathout) + self.corpus.supplementaires = [option for option in self.KeyConf.options('KEYS') if self.KeyConf.get('KEYS', option) == "2"] + self.corpus.typeactive = [option for option in self.KeyConf.options('KEYS') if self.KeyConf.get('KEYS', option) == "1"] + self.read_alceste_parametre() + ################################ + if not self.cmd : + self.dlg = progressbar(self, 6) + else : + self.dlg = None + ucis_txt, ucis_paras_txt = self.corpus.start_analyse(self.parent, dlg = self.dlg, cmd = self.cmd) + self.corpus.make_ucis_paras_uces(ucis_paras_txt, make_uce = False) + uces, orderuces = self.corpus.make_forms_and_uces() + self.corpus.make_lems(self.parent.lexique) + self.corpus.min_eff_formes() + self.corpus.make_var_actives() + self.corpus.make_var_supp() + print(self.corpus.supp) + self.corpus.make_pondtable_with_uci(self.corpus.actives, self.corpus.dictpathout['TableCont']) + self.corpus.make_pondtable_with_uci(self.corpus.supp, self.corpus.dictpathout['TableSup']) + self.corpus.parametre['para'] = False + self.corpus.make_etoiles([]) + self.corpus.make_tableet_with_uci(self.corpus.dictpathout['TableEt']) + RAfcUci(self.corpus.dictpathout, nd=3, RscriptsPath=self.parent.RscriptsPath, PARCEX='0.5') + pid = exec_rcode(self.parent.RPath,self.corpus.dictpathout['Rafcuci'], wait = False) + while pid.poll() == None : + if not self.cmd : + self.dlg.Pulse('CHD...') + sleep(0.2) + else : + pass + check_Rresult(self.parent, pid) + if not self.cmd : + self.dlg.Update(6, 'Affichage') + self.DoLayout(parent, self.corpus.dictpathout) + self.dlg.Destroy() + + def read_alceste_parametre(self) : + self.conf = RawConfigParser() + self.conf.read(self.parent.ConfigPath['alceste']) + for option in self.conf.options('ALCESTE') : + if self.conf.get('ALCESTE', option).isdigit() : + self.corpus.parametre[option] = int(self.conf.get('ALCESTE', option)) + else : + self.corpus.parametre[option] = self.conf.get('ALCESTE', option) + list_bool = ['lem', 'expressions'] + for val in list_bool : + if self.corpus.parametre[val] == 'True' : + self.corpus.parametre[val] = True + else : + self.corpus.parametre[val] = False + + def DoLayout(self, parent, DictAfcUciOut): + self.TabAfcUci = wx.aui.AuiNotebook(parent.nb, -1, wx.DefaultPosition) + #self.TabAfcTot = wx.html.HtmlWindow(self.TabAfcUci, -1) + #txtafctot = MakeAfcUciPages(DictAfcUciOut, parent.encode) + list_graph = [[os.path.basename(DictAfcUciOut['AfcColAct']),''], + [os.path.basename(DictAfcUciOut['AfcColSup']),''], + [os.path.basename(DictAfcUciOut['AfcColEt']),''], + [os.path.basename(DictAfcUciOut['AfcRow']),'']] + self.TabAfcTot = GraphPanel(self.TabAfcUci, DictAfcUciOut, list_graph, txt = '') + #self.TabAfcSplit = wx.html.HtmlWindow(self.TabAfcUci, -1) + #txtafcsplit = MakeAfcSplitPage(1, 2, DictAfcUciOut, self.pathout, parent.encode) + #if "gtk2" in wx.PlatformInfo: + # self.TabAfcSplit.SetStandardFonts() + #self.TabAfcSplit.SetPage(txtafcsplit) + dictrow, first = ReadList(self.corpus.dictpathout['afc_row']) + panel_list = ListForSpec(parent, self, dictrow, first[1:]) + self.TabAfcUci.AddPage(self.TabAfcTot, 'Graph Afc totale') + #self.TabAfcUci.AddPage(self.TabAfcSplit, 'Graph AFC Split') + self.TabAfcUci.AddPage(panel_list, 'Colonnes') + parent.nb.AddPage(self.TabAfcUci, 'AFC Sur UCI') + parent.nb.SetSelection(parent.nb.GetPageCount() - 1) + parent.ShowTab(True) diff --git a/autres/textdist.py b/autres/textdist.py new file mode 100644 index 0000000..be88efd --- /dev/null +++ b/autres/textdist.py @@ -0,0 +1,223 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#License: GNU/GPL + +#------------------------------------ +# import des modules python +#------------------------------------ +import os +import sys +from time import time, sleep + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +from chemins import ConstructPathOut, ConstructAfcUciPath, ChdTxtPathOut +from corpus import Corpus +from OptionAlceste import OptionPam +from analysetxt import AnalyseText +from configparser import * +from functions import print_liste, exec_rcode, CreateIraFile, progressbar, check_Rresult, BugDialog +from layout import PrintRapport +from PrintRScript import ReinertTxtProf, RPamTxt +from openanalyse import OpenAnalyse + + +class AnalysePam(AnalyseText) : + +# def __init__(self, parent, corpus, cmd = False): + + def doanalyse(self) : + self.parametres['type'] = 'pamtxt' + self.pathout.basefiles(ChdTxtPathOut) + self.actives, lim = self.corpus.make_actives_nb(self.parametres['max_actives'], 1) + self.parametres['eff_min_forme'] = lim + self.parametres['nbactives'] = len(self.actives) + if self.parametres['classif_mode'] == 0 : + self.corpus.make_and_write_sparse_matrix_from_uces(self.actives, self.pathout['TableUc1'], self.pathout['listeuce1']) + elif self.parametres['classif_mode'] == 1 : + self.corpus.make_and_write_sparse_matrix_from_uci(self.actives, self.pathout['TableUc1'], self.pathout['listeuce1']) + RPamTxt(self.corpus, self.parent.RscriptsPath) + #t1 = time() + #self.parent = parent + #self.corpus = corpus + #self.cmd = cmd + if not self.cmd : + self.dlg = progressbar(self, 9) + #else : + # self.dlg = None + #ucis_txt, ucis_paras_txt = self.corpus.start_analyse(self.parent, dlg = self.dlg, cmd = self.cmd) + #self.corpus.make_len_uce(self.corpus.get_tot_occ_from_ucis_txt(ucis_txt)) + #del ucis_txt + #if not self.cmd : + # self.dlg.Update(5, '%i ucis - Construction des uces' % len(self.corpus.ucis)) + #if self.corpus.parametre['type'] == 0 : + # self.corpus.make_ucis_paras_uces(ucis_paras_txt, make_uce = True) + #else : + # self.corpus.make_ucis_paras_uces(ucis_paras_txt, make_uce = False) + #del ucis_paras_txt + #if not self.cmd : + # self.dlg.Update(6, u'Dictionnaires') + #uces, orderuces = self.corpus.make_forms_and_uces() + #self.corpus.ucenb = len(uces) + #self.corpus.make_lems(self.parent.lexique) + #self.corpus.min_eff_formes() + #self.corpus.make_var_actives() + #self.corpus.make_var_supp() + #if not self.cmd : + # self.dlg.Update(7, u'Creation des tableaux') + if self.corpus.parametre['type'] == 0: + tabuc1 = self.corpus.make_table_with_uce(orderuces) + uc1 = None + uces1 = [[uce, i] for i,uce in enumerate(orderuces)] + self.corpus.write_tab([['uce','uc']] + [[i, i] for i in range(0,len(uces))], self.corpus.dictpathout['listeuce1']) + else : + tabuc1 = self.corpus.make_table_with_uci() + uc1 = None + uces1 = [[uce, i] for i, uce in enumerate(orderuces)] + self.corpus.write_tab([['uce','uc']] + [[i, i] for i in range(0,len(orderuces))], self.corpus.dictpathout['listeuce1']) + self.corpus.write_tab(tabuc1,self.corpus.dictpathout['TableUc1']) + self.corpus.lenuc1 = len(tabuc1) + del tabuc1, uc1 + RPamTxt(self, self.parent.RscriptsPath) + self.DoR(self.pathout['Rchdtxt'], dlg = self.dlg, message = 'R...') + #pid = exec_rcode(self.parent.RPath,self.pathout['Rchdtxt'], wait = False) + #while pid.poll() == None : + # if not self.cmd : + # self.dlg.Pulse(u'CHD...') + # sleep(0.2) + # else : + # pass + #check_Rresult(self.parent, pid) + self.corpus.make_ucecl_from_R(self.pathout['uce']) + #ucecl0 = [cl for uce,cl in ucecl if cl != 0] + #clnb = len(list(set(ucecl0))) + #classes = [cl for uce, cl in ucecl] + #uces1 = [val for val, i in uces1] + #self.corpus.make_lc(uces1, classes, clnb) + #self.corpus.build_profile(clnb, classes, self.corpus.actives, self.corpus.dictpathout['Contout']) + self.corpus.make_and_write_profile(self.actives, self.corpus.lc, self.pathout['Contout']) + self.sup, lim = self.corpus.make_actives_nb(self.parametres['max_actives'], 2) + self.corpus.make_and_write_profile(self.sup, self.corpus.lc, self.pathout['ContSupOut']) + self.corpus.make_and_write_profile_et(self.corpus.lc, self.pathout['ContEtOut']) + self.clnb = len(self.corpus.lc) + self.parametres['clnb'] = self.clnb + #passives = [lem for lem in self.corpus.lems if lem not in self.corpus.actives] + #self.corpus.build_profile(clnb, classes, self.corpus.supp, self.corpus.dictpathout['ContSupOut']) + #self.corpus.make_etoiles(self.corpus.para_coords) + #self.corpus.build_profile_et(clnb, classes, uces1, self.corpus.dictpathout['ContEtOut']) + AlcesteTxtProf(self.pathout, self.parent.RscriptsPath, clnb, '0.9') + self.doR(self.pathout['RTxtProfGraph'], dlg = self.dlg, message = 'profils et A.F.C. ...') + #pid = exec_rcode(self.parent.RPath, self.corpus.dictpathout['RTxtProfGraph'], wait = False) + #while pid.poll() == None : + # if not self.cmd : + # self.dlg.Pulse(u'AFC...') + # sleep(0.2) + # else : + # pass + #check_Rresult(self.parent, pid) + #temps = time() - t1 + #self.corpus.minutes, self.corpus.seconds = divmod(temps, 60) + #self.corpus.hours, self.corpus.minutes = divmod(self.corpus.minutes, 60) + PrintRapport(self, self.corpus, self.parametres) + #CreateIraFile(self.corpus.dictpathout, clnb, os.path.basename(self.corpus.parametre['filename'])) + self.corpus.save_corpus(self.corpus.dictpathout['db']) + afc_graph_list = [[os.path.basename(self.corpus.dictpathout['AFC2DL_OUT']), 'Variables actives - coordonnées - facteurs 1 / 2'], + [os.path.basename(self.corpus.dictpathout['AFC2DSL_OUT']), 'variables supplémentaires - coordonnées - facteurs 1 / 2'], + [os.path.basename(self.corpus.dictpathout['AFC2DEL_OUT']), 'Variables illustratives - Coordonnées - facteur 1 / 2'], + [os.path.basename(self.corpus.dictpathout['AFC2DCL_OUT']), 'Classes - Coordonnées - facteur 1 / 2']] + chd_graph_list = [[os.path.basename(self.corpus.dictpathout['arbre1']), 'résultats de la classification']] + print_liste(self.pathout['liste_graph_afc'],afc_graph_list) + print_liste(self.pathout['liste_graph_chd'],chd_graph_list) + #if not self.cmd : + # self.dlg.Update(9, u'fin') + # self.dlg.Destroy() + #print 'fini' + + +class PamTxt: + + def __init__(self, parent, cmd = False): + print('pam txt') + self.type = 'pamsimple' + self.parent = parent + self.ConfigPath = parent.ConfigPath + self.DictPath = parent.DictPath + self.pamconf = ConfigParser() + self.pamconf.read(self.ConfigPath['pam']) + self.KeyConf = ConfigParser() + self.KeyConf.read(self.ConfigPath['key']) + self.corpus = Corpus(parent) + try : + self.corpus.content = self.parent.content + self.corpus.parametre['encodage'] = parent.corpus_encodage + self.corpus.parametre['filename'] = parent.filename + self.corpus.parametre['lang'] = parent.corpus_lang + if not cmd : + self.dial = OptionPam(self, parent) + self.dial.CenterOnParent() + self.val = self.dial.ShowModal() + self.print_param() + else : + self.val = wx.ID_OK + if self.val == wx.ID_OK : + file = open(self.ConfigPath['key'], 'w') + self.KeyConf.write(file) + file.close() + self.read_param() + #self.corpus.parametre.update(param) + self.corpus.supplementaires = [option for option in self.KeyConf.options('KEYS') if self.KeyConf.get('KEYS', option) == "2"] + self.corpus.typeactive = [option for option in self.KeyConf.options('KEYS') if self.KeyConf.get('KEYS', option) == "1"] + self.corpus.dictpathout = ChdTxtPathOut(ConstructPathOut(self.corpus.parametre['filename'], 'PamSimple')) + AnalysePam(parent, self.corpus ,cmd = cmd) + except AttributeError : + wx.MessageBox('Vous devez charger un corpus\nFichier -> Ouvrir un texte', 'Pas de corpus', wx.OK|wx.ICON_INFORMATION) + self.val = False + + def print_param(self) : + self.pamconf = RawConfigParser() + self.pamconf.read(self.parent.ConfigPath['pam']) + vallem = self.dial.radio_1.GetSelection() + if vallem == 0 : vallem = True + else : vallem = False + expressions = self.dial.radio_exp.GetSelection() + if expressions == 0 : expressions = True + else: expressions = False + if self.dial.cltype[self.dial.radio_box_3.GetSelection()] == 'k-means (pam)' : cluster_type = 'pam' + else : cluster_type = 'fanny' + self.pamconf.set('pam', 'lem', vallem) + self.pamconf.set('pam', 'expressions', expressions) + self.pamconf.set('pam', 'type', self.dial.radio_box_classif.GetSelection()) + self.pamconf.set('pam', 'method', self.dial.distance[self.dial.choice_1.GetSelection()]) + self.pamconf.set('pam', 'cluster_type', cluster_type) + self.pamconf.set('pam', 'nbforme_uce', str(self.dial.spin_ctrl_3.GetValue())) + self.pamconf.set('pam', 'nbcl', str(self.dial.spin_ctrl_4.GetValue())) + self.pamconf.set('pam', 'expressions', expressions) + self.pamconf.set('pam', 'max_actives', str(self.dial.spin_max_actives.GetValue())) + with open(self.ConfigPath['pam'], 'w') as fileout : + self.pamconf.write(fileout) + + def read_param(self) : + conf = RawConfigParser() + conf.read(self.parent.ConfigPath['pam']) + for option in conf.options('pam') : + if conf.get('pam', option).isdigit() : + self.corpus.parametre[option] = int(conf.get('pam', option)) + else : + self.corpus.parametre[option] = conf.get('pam', option) + list_bool = ['lem', 'expressions'] + for val in list_bool : + if self.corpus.parametre[val] == 'True' : + self.corpus.parametre[val] = True + else : + self.corpus.parametre[val] = False + if self.corpus.parametre['type'] == 0 : + self.corpus.parametre['classif_mode'] = 1 + else : + self.corpus.parametre['classif_mode'] = 2 diff --git a/autres/ttparser.py b/autres/ttparser.py new file mode 100644 index 0000000..d300d3a --- /dev/null +++ b/autres/ttparser.py @@ -0,0 +1,251 @@ +#!/bin/env python +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud + +#a simple treetagger parser +import codecs +import time +import re +from functions import ReadDicoAsDico +from itertools import izip, chain + +t1 = time.time() +#infile = '/home/pierre/prog/treetagger/cmd/allenglish.txt' + +infile = '/home/pierre/fac/cablegate/cablestagger.txt' +word_list = '/home/pierre/fac/cablegate/liste_de_mots.csv' +actives_list = '/home/pierre/fac/cablegate/actives.csv' +supps_list = '/home/pierre/fac/cablegate/supplementaires.csv' + + +def prepare_for_treetagger(corpus, parent) : + fileout = '/home/pierre/workspace/iramuteq/corpus/corpus_pour_tt.txt' + corpus.quick_clean1() + lang = corpus.parametre['lang'] + dico_path = parent.DictPath.get(lang + '_exp', 'french_exp') + expressions = ReadDicoAsDico(dico_path) + corpus.find_expression(expressions) + #corpus.content = re.sub(u'[-]+', ' ', corpus.content) + corpus.content = re.sub(u'[ ]+', ' ', corpus.content) + #FIXME : remplacer . par ' . ' + #corpus.quick_clean2() + with open(fileout, 'w') as f : + f.write(corpus.content) + +def partition(alist, indices): + pairs = izip(chain([0], indices), chain(indices, [None])) + return (alist[i:j] for i, j in pairs) + +def partition_uci(uci) : + if uci == [] : + pass + else : + indices = [i for i, forme in enumerate(uci) if forme[0].startswith(u'*')] + pairs = izip(chain([0], indices), chain(indices, [None])) + return (uci[i,j] for i, j in pairs) + +def dodict(inlist, indict) : + for i, forme in enumerate(inlist) : + if tuple(forme) in tot : + tot[tuple(forme)].append(i) + else : + tot[tuple(forme)] = [i] + +def treat_forme(forme, tformes) : + ponct =[u',', u'', u'``', u"''", u':', u'#', u')', '(', u'!', u'?', u';', u'-', u'.', u'...'] + if forme[0] in ponct : + return forme[0] + tforme = (forme[0], forme[1].split(':')[0]) + return tformes[tforme] + +def make_formes_and_lems(inlist) : + formes = {} + tformes = {} + formes_lems = {} + lems = {} + for forme in inlist : + word = forme[0] + gram = forme[1].split(':')[0] + lem = forme[2] + tforme = (word,gram) + if tforme in tformes : + if formes_lems[tformes[tforme]] == u'' and lem != u'' : + formes_lems[tformes[tforme]] = lem + else : + if word in formes : + nword = u'@'.join([word,'']) + while nword in formes and formes[nword] != gram : + nword = u'@'.join([nword,'']) + formes[nword] = [0, {}, gram, len(formes)] + tformes[tforme] = nword + formes_lems[nword] = lem + else : + formes[word] = [0, {}, gram, len(formes)] + tformes[tforme] = word + formes_lems[word] = lem + for forme in formes : + if formes_lems[forme] == u'' : + formes_lems[forme] = forme + if formes_lems[forme] in lems : + lems[formes_lems[forme]].append(forme) + else : + lems[formes_lems[forme]] = [forme] + del formes_lems + return formes, lems, tformes + +def make_ucis_txt_formes_from_tt(corpus, tformes) : + ucis_txt = [[treat_forme(forme, tformes) for forme in uci] for uci in corpus.ucis_txt] + del tformes + return [' '.join(uci) for uci in ucis_txt] + +def get_ucis_from_tt(corpus) : + content_split = [tuple(line.split('\t')) for line in corpus.content.splitlines()] + #print [i for i, line in enumerate(content_split) if line[0] == u'****'] + ponct =[u',', u'', u'``', u"''", u':', u'#', u')', '(', u'!', u'?', u';', u'-', u'.', u'...'] + lformes = [forme for forme in list(set(content_split)) if not forme[0].startswith(u'*') and forme[0] not in ponct] + formes, lems, tformes = make_formes_and_lems(lformes) + ucis = partition(content_split, [i for i, line in enumerate(content_split) if line[0] == u'****']) + del content_split + ucis = [uci for uci in ucis] + ucis.pop(0) + indices_max_et = [max([i for i, forme in enumerate(uci) if forme[0].startswith(u'*')]) for uci in ucis] + corpus.ucis = [uci[:indices_max_et[i] + 1] for i, uci in enumerate(ucis)] + corpus.ucis = [[[et[0] for et in uci],''] for uci in corpus.ucis] + corpus.ucis_txt = [uci[indices_max_et[i] + 1:] for i, uci in enumerate(ucis)] + del ucis + corpus.formes = formes + corpus.lems = lems + return make_ucis_txt_formes_from_tt(corpus, tformes) + +#with codecs.open(infile, 'r', 'latin1') as f : +# #content = [line.split('\t') for line in f] +# content = f.read() +#print time.time() - t1 +#print(u'#1') +#c1 = content.splitlines() +#print(u'#1b') +#c1s = [val.split('\t') for val in c1] +#print('#2') +#sc1 = list(set(c1)) +#print('#3') +#sc1 = [val.split('\t') for val in sc1] +#print len(sc1) +#print('#4') +#formes = [val for val in sc1 if not val[0].isdigit()] +#print len(formes) +#print('#5') +#sformes = [val[0] for val in formes] +#print len(sformes) +#print('#6') +# +#t4 = time.time() +#def make_dicts(inlist) : +# tot = {} +# totgram = {} +# for i, forme in enumerate(inlist) : +# if tuple(forme) in tot : +# tot[tuple(forme)].append(i) +# else : +# tot[tuple(forme)] = [i] +# if forme[1] in totgram : +# totgram[forme[1]] += 1 +# else : +# totgram[forme[1]] = 1 +# return tot, totgram +#tot, totgram = make_dicts(c1s) +#print 'dico', time.time() - t4 +# +#def load_keys() : +# key_file = '/home/pierre/fac/cablegate/keys_english.txt' +# with open(key_file, 'r') as f : +# keys = f.read() +# keys = keys.splitlines() +# keys = [line.split('\t') for line in keys] +# return keys +# +#keys = load_keys() +#print keys +#kact = [key[0] for key in keys if key[2] == '1'] +#ksup = [key[0] for key in keys if key[2] == '2'] +# +#actives = [[len(tot[forme]), forme[0], forme[1], forme[2]] for forme in tot if forme[1] in kact and len(tot[forme]) > 3] +#actives.sort() +#supps = [[len(tot[forme]), forme[0], forme[1], forme[2]] for forme in tot if forme[1] in ksup and len(tot[forme]) > 3] +#supps.sort() +# +#words = [[len(tot[word]), word[0], word[1], word[2]] for word in tot] +#words.sort() +##hapax = [word for word in words if word[3] == 1] +##print len(hapax) +#def print_list(thelist, fileout) : +# with open(fileout, 'w') as f : +# f.write('\n'.join(['\t'.join(['\t'.join(list(line[1:])), `line[0]`]) for line in thelist]).encode('latin1')) +#print_list(words, word_list) +#print_list(actives, actives_list) +#print_list(supps, supps_list) +#print time.time() - t4 +#t5 = time.time() +#print('#7') +#def make_uci(c1s) : +# return [val.tolist() for val in numpy.split(numpy.array(c1s),[i for i, line in enumerate(c1s) if line[0] == u'****'])] +# +##def make_ucil(c1s) : +#from itertools import izip, chain +#def partition(alist, indices): +# pairs = izip(chain([0], indices), chain(indices, [None])) +# return (alist[i:j] for i, j in pairs) +# +#def partition_uci(uci) : +# if uci == [] : +# pass +# else : +# indices = [i for i, forme in enumerate(uci) if forme[0].startswith(u'*')] +# pairs = izip(chain([0], indices), chain(indices, [None])) +# return (uci[i,j] for i, j in pairs) +# +##ucis = make_uci(c1s) +#t2 = time.time() +#ucis = partition(c1s, [i for i, line in enumerate(c1s) if line[0] == u'****']) +#print time.time() - t2 +#print('#8') +#print ucis +##for uci in ucis : +## if uci != []: +## print max([i for i, forme in enumerate(uci) if forme[0].startswith(u'*')]) +# +#ucis = [uci for uci in ucis] +#ucis.pop(0) +#indices_max_et = [max([i for i, forme in enumerate(uci) if forme[0].startswith(u'*')]) for uci in ucis] +##ucis2 = [partition_uci(uci) for uci in ucis] +##print len(ucis2) +#print len(indices_max_et) +#print'#9' +##print ucis2[0:2] +#etoiles = [uci[:indices_max_et[i] + 1] for i, uci in enumerate(ucis)] +#ucis = [uci[indices_max_et[i] + 1:] for i, uci in enumerate(ucis)] +#print len(etoiles) +#print etoiles[0] +#print('#10') +#t3 = time.time() +##ucis = [[val for val in uci if val[1] != 'PUN'] for uci in ucis] +#ind_sent = [[i for i, forme in enumerate(uci) if forme[1] == 'SENT'] for uci in ucis] +#print time.time() - t3 +#print ind_sent[0] +#print len(ucis), len(ind_sent) +##inuformes = [i for i,forme in enumerate(sformes) if sformes.count(forme) > 1] +##inuformes = [formes[i] for i, forme in enumerate(sformes) if forme in sformes[i+1:]] +##nonunique = [forme for forme in formes if formes.count(forme) > 1] +#print('#10') +#split_sents = [[partition(uci, ind_sent[i])] for i, uci in enumerate(ucis)] +#PUNCT = [u',', u'', u'``', u"''", u':', u'#', u')', '(', u'!', u'?', u';', u'-', u'.'] +#split_sents = [[val for sent in uci for val in sent] for uci in split_sents] +#split_sents = [[val for sent in uci for val in sent if val[0] not in PUNCT and not val[0].isdigit()] for uci in split_sents] +##for i in range(0,1) : +## for sent in split_sents[i] : +## for val in sent : +## print val +##nuformes = [formes[i] for i in inuformes] +##print('#8') +# +##print double +#print totgram diff --git a/autres/uces.db b/autres/uces.db new file mode 100644 index 0000000000000000000000000000000000000000..685b4dcac30dcd544f9820202ba317f133c5488c GIT binary patch literal 2048 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU|ADJC>RZa(GZ|!2-q^RiHnLd#+M`}<)oG-rxt@SlXH-(V~DFlh@+E_s{%+w nK_fFo!P76q)!j8n2O<*U8WExi%A3GUKMF=eU^E0qU 1000 : - self.sparser.treat_formes() - self.last = len(self.sparser.formes) - self.diff = 0 - if name == 'title' : - self.tottitle += 1 - if len(self.totreat) > 100000 : - self.diff = len(self.sparser.formes) - self.last - self.sparser.doparsewiki(' '.join(self.totreat)) - self.totreat = [] - print 'titres :', self.tottitle - if name == 'text' : - self.txt = True - else : - self.txt = False - #if name == "title": - # for item in attrs.items(): - # print item - def characters(self, content) : - if self.txt : - self.totreat.append(content) - -class Parser : - def __init__(self, txtdir, encodage, treetagger, fileout) : - self.txtdir = txtdir - self.encodage = encodage - self.tt = treetagger - self.formes = {} - self.fileout = fileout - #self.doparse() - #self.treat_formes(fileout) - - def clean(self, txt) : - txt = txt.lower() - keep_caract = u"a-zA-Z0-9àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇß’ñ.:,;!?\n*'_-" - list_keep = u"[^" + keep_caract + "]+" - txt = re.sub(list_keep, ' ', txt) - txt = txt.replace(u'’',u"'") - txt = txt.replace(u'\'',u' ').replace(u'-', u' ') - txt = txt.replace(u'?',u' ? ').replace(u'.',u' . ').replace(u'!', u' ! ').replace(u',',u' , ').replace(u';', u' ; ').replace(u':',u' : ') - txt = ' '.join(txt.split()) - return txt - - def update_dict(self, tmpfile) : - with codecs.open(tmpfile, 'r', 'utf8') as f : - content = f.read() - content = [line.split('\t') for line in content.splitlines()] - for forme in content : - if (forme[2] == u'') or (forme[1] in [u'PON', u'', u'SYM', u'SENT']) or (forme[1]==u'NUM' and forme[2]==u'@card@') : - pass - elif (forme[0], forme[1]) in self.formes : - self.formes[(forme[0], forme[1])][0] += 1 - else : - self.formes[(forme[0], forme[1])] = [1, forme[2]] - print len(self.formes) - - def treat_formes(self) : - print 'treat_formes' - nformes= {} - for forme in self.formes : - if forme[0] in nformes : - if self.formes[forme][0] > nformes[forme[0]][0] : - nformes[forme[0]] = [self.formes[forme][0], forme[1], self.formes[forme][1]] - else : - nformes[forme[0]] = [self.formes[forme][0], forme[1], self.formes[forme][1]] - with open(self.fileout, 'w') as f : - toprint = [[forme, nformes[forme][1], nformes[forme][2], `nformes[forme][0]`] for forme in nformes] - toprint = sorted(toprint) - toprint = '\n'.join(['\t'.join(line) for line in toprint]) - f.write(toprint.encode('utf8')) - print len(nformes) - - def doparsewiki(self, content) : - content = self.clean(content) - with open('/tmp/tmptxt', 'w') as f : - f.write(content.encode('utf8')) - p1 = Popen(['cat', '/tmp/tmptxt'], stdout = PIPE) - with open('/tmp/tttmp', 'w') as f : - p2 = Popen([treetagger], stdin = p1.stdout, stdout = f) - out = p2.communicate() - self.update_dict('/tmp/tttmp') - - def doparse(self): - files = os.listdir(self.txtdir) - for fpath in files : - fpath = os.path.join(self.txtdir, fpath) - print fpath - with codecs.open(fpath, 'r', self.encodage) as f : - content = f.read() - content = self.clean(content) - with open('/tmp/tmptxt', 'w') as f : - f.write(content.encode('utf8')) - p1 = Popen(['cat', '/tmp/tmptxt'], stdout = PIPE) - with open('/tmp/tttmp', 'w') as f : - p2 = Popen([treetagger], stdin = p1.stdout, stdout = f) - out = p2.communicate() - self.update_dict('/tmp/tttmp') - - -class PostTreat : - def __init__(self, infile, outfile, stopw = None) : - self.dictg = {} - with codecs.open(infile, 'r', 'utf8') as f : - content = f.read() - content = [line.split('\t') for line in content.splitlines()] - content = [self.treatline(line) for line in content if line[3] != '1'] - self.formes = {} - self.lems = {} - if stopw is not None : - with codecs.open(stopw, 'r', 'utf8') as f : - stw = f.read() - self.stw = stw.splitlines() - content = self.dostopword(content) - self.printcontent(content, outfile) - self.dictg = {} - for forme in self.formes : - self.dictg[self.formes[forme][2]] = self.dictg.get(self.formes[forme][2],0) + 1 - print self.dictg - print content[0:10] - print len(content) - - def treatline(self, line) : - gram = line[1].split(u':')[0].lower() - self.dictg[gram] = self.dictg.get(gram, 0) + 1 - return [line[0], line[2], gram, int(line[3])] - - def dostopword(self, content) : - for line in content : - self.formes[line[0]] = line - self.lems[line[1]] = line - for word in self.stw : - if word in self.formes : - print word, self.formes[word] - if self.formes[word][2] in ['adj','adv','ver','nom'] : - self.formes[word][2] = self.formes[word][2] + '_sup' - print self.formes[word] - else : - self.formes[word] = [word, word, 'sw', 0] - return sorted([[forme, self.formes[forme][1], self.formes[forme][2]] for forme in self.formes]) - - def printcontent(self, content, outfile) : - with open(outfile, 'w') as f : - f.write('\n'.join(['\t'.join(line) for line in content]).encode('utf8')) - - - - -#sparser = Parser('', encodage, treetagger, fileout) -#parser = xml.sax.make_parser() -#parser.setContentHandler(WikiPediaHandler(sparser)) -#parser.parse(open(xmlfile,"r")) -##Parser(txtdir, encodage, treetagger, fileout) -PostTreat(fileout, lexique, stopword) - - - diff --git a/cable.py b/cable.py deleted file mode 100644 index ef23ba7..0000000 --- a/cable.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -#Author: Pierre Ratinaud -#Copyright (c) 2010, Pierre Ratinaud -#Lisense: GNU/GPL - - -import codecs -filein = '/home/pierre/fac/cablegate/allcables-all.txt' -enc = 'utf-8' - -infile = codecs.open(filein, 'r', enc) -content = [] - -class BigCorpus : - def __init__(self, parent) : - self.parent = parent - self.parametre = {'syscoding': sys.getdefaultencoding()} - self.content = None - self.ucis = None - self.formes = {} - self.lems = {} - self.ucenb = None - self.etoiles = None - self.etintxt = {} - self.ucis_paras_uces = None - self.lc = None - self.lc0 = None - self.actives = None - self.supp = None - #self.supplementaires = [] - self.lenuc1 = None - self.lenuc2 = None - self.lexique = None - - def open_corpus(self) : - return codecs.open(self.parametre['filename'], "r", self.parametre['encodage']) - - def buildcorpus(self) : - i = 0 - ucifile = os.path.join(os.path.basedir(self.parametre['filename']), 'ucis.txt') - uci = open(ucifile, 'w') - ucinb = 0 - for line in self.open_corpus() : - if line.startswith(u'****') and i==0 : - uci.write(line) - i += 1 - elif line.startswith(u'****') and i=!0 : - uci.write(line) - parse_uci() - - write_uci() - uci[ucinb] = i - ucinb += 1 - i += 1 - else : - addlinetouci(uci, prepare(line)) - line = line.lower().replace(u'\'','\' ').replace(u'’','\' ').replace('...',u' £ ').replace('?',' ? ').replace('.',' . ').replace('!', ' ! ').replace(',',' , ').replace(';', ' ; ').replace(':', ' : ').strip() - line = line.replace('\n', ' ').replace('\r', ' ') - line = line.split() - content[-1].append(line) - i += 1 -print len(content) diff --git a/checkinstall.py b/checkinstall.py index e7dca8a..d355e7a 100644 --- a/checkinstall.py +++ b/checkinstall.py @@ -1,22 +1,34 @@ -#!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2008 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL +#------------------------------------ +# import des modules python +#------------------------------------ import os import sys import shutil -from chemins import ConstructConfigPath, ConstructDicoPath -from functions import exec_rcode, exec_RCMD -import wx -import tempfile -from ConfigParser import * from time import sleep import logging +import tempfile + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +from chemins import ConstructConfigPath, ConstructDicoPath +from functions import exec_rcode, exec_RCMD +from configparser import * log = logging.getLogger('iramuteq.checkinstall') + def IsNew(self): version_glob = self.ConfigGlob.get('DEFAULT', 'version_nb').split('.') try : @@ -70,8 +82,8 @@ def UpgradeConf(self) : log.info('upgrade conf') dictuser = self.ConfigPath dictappli = ConstructConfigPath(self.AppliPath, user = False) - for item,filein in dictuser.iteritems(): - if not item == u'global' and not item == u'history': + for item,filein in dictuser.items(): + if not item == 'global' and not item == 'history': shutil.copyfile(dictappli[item], filein) dicoUser = self.DictPath dicoAppli = ConstructDicoPath(self.AppliPath) @@ -88,13 +100,13 @@ def CreateIraDirectory(UserConfigPath,AppliPath): def CopyConf(self) : DictUser = self.ConfigPath DictAppli = ConstructConfigPath(self.AppliPath,user=False) - for item, filein in DictUser.iteritems(): - if not item == u'global' and not item == u'path' and not item == u'preferences' and not item == u'history' : + for item, filein in DictUser.items(): + if not item == 'global' and not item == 'path' and not item == 'preferences' and not item == 'history' : shutil.copyfile(DictAppli[item],filein) - if item == u'path': + if item == 'path': if not os.path.exists(filein): shutil.copyfile(DictAppli[item],filein) - if item == u'preferences' : + if item == 'preferences' : if not os.path.exists(filein) : shutil.copyfile(DictAppli[item],filein) dicoUser = self.DictPath @@ -170,7 +182,7 @@ def CheckRPackages(self): dlg.Destroy() if nolib != [] : txt = '\n'.join(nolib) - msg = u"""Les bibliothèques de R suivantes sont manquantes : + msg = """Les bibliothèques de R suivantes sont manquantes : %s Sans ces bibliothèques, IRamuteq ne fonctionnera pas. @@ -183,7 +195,7 @@ Sans ces bibliothèques, IRamuteq ne fonctionnera pas. - ou laisser IRamuteq les installer automatiquement en cliquant sur VALIDER . Les bibliothèques seront téléchargées depuis le site miroir de R %s. """ % (txt, self.pref.get('iramuteq','rmirror')) - dial = wx.MessageDialog(self, msg, u"Installation incomplète", wx.OK | wx.CANCEL | wx.ICON_WARNING) + dial = wx.MessageDialog(self, msg, "Installation incomplète", wx.OK | wx.CANCEL | wx.ICON_WARNING) dial.CenterOnParent() val = dial.ShowModal() if val == wx.ID_OK : @@ -194,12 +206,12 @@ Sans ces bibliothèques, IRamuteq ne fonctionnera pas. style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT ) dlg.Center() - dlg.Update(1, u"installation...") + dlg.Update(1, "installation...") compt = 0 for bib in nolib : compt += 1 - dlg.Update(compt, u"installation librairie %s" % bib) + dlg.Update(compt, "installation librairie %s" % bib) txt = """ userdir <- unlist(strsplit(Sys.getenv("R_LIBS_USER"), .Platform$path.sep))[1] if (!file.exists(userdir)) { @@ -219,7 +231,7 @@ Sans ces bibliothèques, IRamuteq ne fonctionnera pas. f.write(txt) test = exec_rcode(self.RPath, tmpscript, wait = False) while test.poll() == None : - dlg.Pulse(u"installation librairie %s" % bib) + dlg.Pulse("installation librairie %s" % bib) sleep(0.2) dlg.Update(len(nolib) + 1, 'fin') dlg.Destroy() diff --git a/checkversion.py b/checkversion.py index d1211ee..70e1e00 100644 --- a/checkversion.py +++ b/checkversion.py @@ -1,13 +1,28 @@ -#!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2008-2009, Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL -import urllib2 +#------------------------------------ +# import des modules python +#------------------------------------ +import urllib.request, urllib.error, urllib.parse #migration de module PY3 import socket + +#------------------------------------ +# import des modules wx +#------------------------------------ import wx - + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ + + +# utilisé seulement depuis iramuteq.py + + def NewVersion(parent): version = parent.version.split(' ') if len(version) == 3: @@ -18,9 +33,9 @@ def NewVersion(parent): versionsub = False erreur = False new = False - req = urllib2.Request("http://www.iramuteq.org/current_version") + req = urllib.request.Request("http://www.iramuteq.org/current_version") try: - LastVersion = urllib2.urlopen(req,'',3) + LastVersion = urllib.request.urlopen(req,'',3) lastversion = LastVersion.readlines() lastversion = lastversion[0].replace('\n', '').split('-') if len(lastversion) == 2 : @@ -35,15 +50,13 @@ def NewVersion(parent): elif (float(lastversion[0]) > versionnb) and not versionsub : new = True except : - erreur = u"la page n'est pas accessible" + erreur = "la page n'est pas accessible" if not erreur and new : - msg = u""" + msg = """ Une nouvelle version d'IRaMuTeQ (%s) est disponible. Vous pouvez la télécharger à partir du site web iramuteq : http://www.iramuteq.org""" % '-'.join(lastversion) - dlg = wx.MessageDialog(parent, msg, u"Nouvelle version disponible", wx.OK | wx.ICON_WARNING) + dlg = wx.MessageDialog(parent, msg, "Nouvelle version disponible", wx.OK | wx.ICON_WARNING) dlg.CenterOnParent() if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]: evt.Veto() - -#print NewVersion('0.1-alpha18') diff --git a/chemins.py b/chemins.py index b880935..9c5dee7 100644 --- a/chemins.py +++ b/chemins.py @@ -1,14 +1,18 @@ -#!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2008 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL +#------------------------------------ +# import des modules python +#------------------------------------ import os import sys import tempfile import logging + log = logging.getLogger('iramuteq.chemins') @@ -39,10 +43,10 @@ class PathOut : def mkdirout(self) : dirout = os.path.join(self.dirout, self.filename + '_' + self.analyse + '_') nb = 1 - tdirout = dirout + `nb` + tdirout = dirout + repr(nb) while os.path.exists(tdirout) : nb += 1 - tdirout = dirout + `nb` + tdirout = dirout + repr(nb) self.name = os.path.splitext(tdirout)[1] return tdirout @@ -77,10 +81,9 @@ class PathOut : def getF(self, key) : return self.__getitem__(key).replace('\\', '/') - def ffr(filename): return filename.replace('\\', '\\\\') - + def FFF(filename): return filename.replace('\\', '/') @@ -238,7 +241,7 @@ ChdTxtPathOut = {'TableUc1': 'TableUc1.csv', 'rapport': 'RAPPORT.txt', 'pre_rapport' : 'info.txt', 'uce': 'uce.csv', - 'Rchdtxt': ffr(tempfile.mkstemp(prefix='iramuteq')[1]), + 'Rchdtxt': tempfile.mkstemp(prefix='iramuteq')[1].replace('\\', '\\\\'), 'arbre1': 'arbre_1.png', 'arbre2': 'arbre_2.png', 'dendro1': 'dendro1.png', @@ -262,13 +265,13 @@ ChdTxtPathOut = {'TableUc1': 'TableUc1.csv', 'AFC2DCoulSup': 'AFC2DCoulSup.png', 'AFC2DCoulEt': 'AFC2DCoulEt.png', 'AFC2DCoulCl': 'AFC2DCoulCl.png', - 'Rafc3d': ffr(tempfile.mkstemp(prefix='iramuteq')[1]), - 'R3DCoul': ffr(tempfile.mkstemp(prefix='iramuteq')[1]), + 'Rafc3d': tempfile.mkstemp(prefix='iramuteq')[1].replace('\\', '\\\\'), + 'R3DCoul': tempfile.mkstemp(prefix='iramuteq')[1].replace('\\', '\\\\'), 'RESULT_CHD': 'resultats-chd.html', 'RESULT_AFC': 'resultats-afc.html', 'Et01': 'Et01.csv', - 'Rchdquest':ffr(tempfile.mkstemp(prefix='iramuteq')[1]), - 'RTxtProfGraph':ffr(tempfile.mkstemp(prefix='iramuteq')[1]), + 'Rchdquest':tempfile.mkstemp(prefix='iramuteq')[1].replace('\\', '\\\\'), + 'RTxtProfGraph':tempfile.mkstemp(prefix='iramuteq')[1].replace('\\', '\\\\'), 'typelist': 'typelist.csv', 'concord':'concordancier.csv', 'bduceforme':'bduceforme.csv', @@ -316,6 +319,7 @@ def StatTxtPathOut(pathout): } return d +# ??? #def construct_simipath(pathout): # d = {'mat01' : 'mat01.csv', # 'matsimi' : 'matsimi.csv', diff --git a/colors.py b/colors.py index 0244005..efd93f2 100644 --- a/colors.py +++ b/colors.py @@ -1,3 +1,9 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 +#License: GNU/GPL + #colors colors = [['#FF0000'], \ ['#FF0000','#00FFFF'], \ diff --git a/configparser.py b/configparser.py index 8e6280d..d924d29 100644 --- a/configparser.py +++ b/configparser.py @@ -1,7 +1,7 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 -u"""Configuration file parser. +"""Configuration file parser. A configuration file consists of sections, lead by a "[section]" header, and followed by "name: value" entries, with continuations and such in @@ -122,30 +122,37 @@ ConfigParser -- responsible for parsing a list of between keys and values are surrounded by spaces. """ -from __future__ import with_statement +#------------------------------------ +# import des modules python +#------------------------------------ from collections import MutableMapping -from io import open -try: - from collections import OrderedDict as _default_dict -except ImportError: - from ordereddict import OrderedDict as _default_dict -import functools import io import itertools import re import sys import warnings +#------------------------------------ +# import des fichiers du projet +#------------------------------------ from configparser_helpers import _ChainMap -__all__ = [u"NoSectionError", u"DuplicateOptionError", u"DuplicateSectionError", - u"NoOptionError", u"InterpolationError", u"InterpolationDepthError", - u"InterpolationSyntaxError", u"ParsingError", - u"MissingSectionHeaderError", - u"ConfigParser", u"SafeConfigParser", u"RawConfigParser", - u"DEFAULTSECT", u"MAX_INTERPOLATION_DEPTH"] -DEFAULTSECT = u"DEFAULT" +try: + from collections import OrderedDict as _default_dict +except ImportError: + from ordereddict import OrderedDict as _default_dict +import functools + + +__all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError", + "NoOptionError", "InterpolationError", "InterpolationDepthError", + "InterpolationSyntaxError", "ParsingError", + "MissingSectionHeaderError", + "ConfigParser", "SafeConfigParser", "RawConfigParser", + "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"] + +DEFAULTSECT = "DEFAULT" MAX_INTERPOLATION_DEPTH = 10 @@ -153,16 +160,16 @@ MAX_INTERPOLATION_DEPTH = 10 # exception classes class Error(Exception): - u"""Base class for ConfigParser exceptions.""" + """Base class for ConfigParser exceptions.""" def _get_message(self): - u"""Getter for 'message'; needed only to override deprecation in + """Getter for 'message'; needed only to override deprecation in BaseException. """ return self.__message def _set_message(self, value): - u"""Setter for 'message'; needed only to override deprecation in + """Setter for 'message'; needed only to override deprecation in BaseException. """ self.__message = value @@ -172,7 +179,7 @@ class Error(Exception): # a new property that takes lookup precedence. message = property(_get_message, _set_message) - def __init__(self, msg=u''): + def __init__(self, msg=''): self.message = msg Exception.__init__(self, msg) @@ -183,16 +190,16 @@ class Error(Exception): class NoSectionError(Error): - u"""Raised when no section matches a requested option.""" + """Raised when no section matches a requested option.""" def __init__(self, section): - Error.__init__(self, u'No section: %r' % (section,)) + Error.__init__(self, 'No section: %r' % (section,)) self.section = section self.args = (section, ) class DuplicateSectionError(Error): - u"""Raised when a section is repeated in an input source. + """Raised when a section is repeated in an input source. Possible repetitions that raise this exception are: multiple creation using the API or in strict parsers when a section is found more than once @@ -200,17 +207,17 @@ class DuplicateSectionError(Error): """ def __init__(self, section, source=None, lineno=None): - msg = [repr(section), u" already exists"] + msg = [repr(section), " already exists"] if source is not None: - message = [u"While reading from ", source] + message = ["While reading from ", source] if lineno is not None: - message.append(u" [line {0:2d}]".format(lineno)) - message.append(u": section ") + message.append(" [line {0:2d}]".format(lineno)) + message.append(": section ") message.extend(msg) msg = message else: - msg.insert(0, u"Section ") - Error.__init__(self, u"".join(msg)) + msg.insert(0, "Section ") + Error.__init__(self, "".join(msg)) self.section = section self.source = source self.lineno = lineno @@ -218,25 +225,25 @@ class DuplicateSectionError(Error): class DuplicateOptionError(Error): - u"""Raised by strict parsers when an option is repeated in an input source. + """Raised by strict parsers when an option is repeated in an input source. Current implementation raises this exception only when an option is found more than once in a single file, string or dictionary. """ def __init__(self, section, option, source=None, lineno=None): - msg = [repr(option), u" in section ", repr(section), - u" already exists"] + msg = [repr(option), " in section ", repr(section), + " already exists"] if source is not None: - message = [u"While reading from ", source] + message = ["While reading from ", source] if lineno is not None: - message.append(u" [line {0:2d}]".format(lineno)) - message.append(u": option ") + message.append(" [line {0:2d}]".format(lineno)) + message.append(": option ") message.extend(msg) msg = message else: - msg.insert(0, u"Option ") - Error.__init__(self, u"".join(msg)) + msg.insert(0, "Option ") + Error.__init__(self, "".join(msg)) self.section = section self.option = option self.source = source @@ -245,10 +252,10 @@ class DuplicateOptionError(Error): class NoOptionError(Error): - u"""A requested option was not found.""" + """A requested option was not found.""" def __init__(self, option, section): - Error.__init__(self, u"No option %r in section: %r" % + Error.__init__(self, "No option %r in section: %r" % (option, section)) self.option = option self.section = section @@ -256,7 +263,7 @@ class NoOptionError(Error): class InterpolationError(Error): - u"""Base class for interpolation-related exceptions.""" + """Base class for interpolation-related exceptions.""" def __init__(self, option, section, msg): Error.__init__(self, msg) @@ -266,14 +273,14 @@ class InterpolationError(Error): class InterpolationMissingOptionError(InterpolationError): - u"""A string substitution required a setting which was not available.""" + """A string substitution required a setting which was not available.""" def __init__(self, option, section, rawval, reference): - msg = (u"Bad value substitution:\n" - u"\tsection: [%s]\n" - u"\toption : %s\n" - u"\tkey : %s\n" - u"\trawval : %s\n" + msg = ("Bad value substitution:\n" + "\tsection: [%s]\n" + "\toption : %s\n" + "\tkey : %s\n" + "\trawval : %s\n" % (section, option, reference, rawval)) InterpolationError.__init__(self, option, section, msg) self.reference = reference @@ -281,7 +288,7 @@ class InterpolationMissingOptionError(InterpolationError): class InterpolationSyntaxError(InterpolationError): - u"""Raised when the source text contains invalid syntax. + """Raised when the source text contains invalid syntax. Current implementation raises this exception when the source text into which substitutions are made does not conform to the required syntax. @@ -289,68 +296,68 @@ class InterpolationSyntaxError(InterpolationError): class InterpolationDepthError(InterpolationError): - u"""Raised when substitutions are nested too deeply.""" + """Raised when substitutions are nested too deeply.""" def __init__(self, option, section, rawval): - msg = (u"Value interpolation too deeply recursive:\n" - u"\tsection: [%s]\n" - u"\toption : %s\n" - u"\trawval : %s\n" + msg = ("Value interpolation too deeply recursive:\n" + "\tsection: [%s]\n" + "\toption : %s\n" + "\trawval : %s\n" % (section, option, rawval)) InterpolationError.__init__(self, option, section, msg) self.args = (option, section, rawval) class ParsingError(Error): - u"""Raised when a configuration file does not follow legal syntax.""" + """Raised when a configuration file does not follow legal syntax.""" def __init__(self, source=None, filename=None): # Exactly one of `source'/`filename' arguments has to be given. # `filename' kept for compatibility. if filename and source: - raise ValueError(u"Cannot specify both `filename' and `source'. " - u"Use `source'.") + raise ValueError("Cannot specify both `filename' and `source'. " + "Use `source'.") elif not filename and not source: - raise ValueError(u"Required argument `source' not given.") + raise ValueError("Required argument `source' not given.") elif filename: source = filename - Error.__init__(self, u'Source contains parsing errors: %s' % source) + Error.__init__(self, 'Source contains parsing errors: %s' % source) self.source = source self.errors = [] self.args = (source, ) @property def filename(self): - u"""Deprecated, use `source'.""" + """Deprecated, use `source'.""" warnings.warn( - u"The 'filename' attribute will be removed in future versions. " - u"Use 'source' instead.", + "The 'filename' attribute will be removed in future versions. " + "Use 'source' instead.", DeprecationWarning, stacklevel=2 ) return self.source @filename.setter def filename(self, value): - u"""Deprecated, user `source'.""" + """Deprecated, user `source'.""" warnings.warn( - u"The 'filename' attribute will be removed in future versions. " - u"Use 'source' instead.", + "The 'filename' attribute will be removed in future versions. " + "Use 'source' instead.", DeprecationWarning, stacklevel=2 ) self.source = value def append(self, lineno, line): self.errors.append((lineno, line)) - self.message += u'\n\t[line %2d]: %s' % (lineno, line) + self.message += '\n\t[line %2d]: %s' % (lineno, line) class MissingSectionHeaderError(ParsingError): - u"""Raised when a key-value pair is found before any section header.""" + """Raised when a key-value pair is found before any section header.""" def __init__(self, filename, lineno, line): Error.__init__( self, - u'File contains no section headers.\nfile: %s, line: %d\n%r' % + 'File contains no section headers.\nfile: %s, line: %d\n%r' % (filename, lineno, line)) self.source = filename self.lineno = lineno @@ -365,7 +372,7 @@ _UNSET = object() class Interpolation(object): - u"""Dummy interpolation that passes the value through with no changes.""" + """Dummy interpolation that passes the value through with no changes.""" def before_get(self, parser, section, option, value, defaults): return value @@ -381,7 +388,7 @@ class Interpolation(object): class BasicInterpolation(Interpolation): - u"""Interpolation as implemented in the classic ConfigParser. + """Interpolation as implemented in the classic ConfigParser. The option values can contain format strings which refer to other values in the same section, or values in the special default section. @@ -395,19 +402,19 @@ class BasicInterpolation(Interpolation): a configuration file, she can escape it by writing %%. Other other % usage is considered a user error and raises `InterpolationSyntaxError'.""" - _KEYCRE = re.compile(ur"%\(([^)]+)\)s") + _KEYCRE = re.compile(r"%\(([^)]+)\)s") def before_get(self, parser, section, option, value, defaults): L = [] self._interpolate_some(parser, option, L, value, section, defaults, 1) - return u''.join(L) + return ''.join(L) def before_set(self, parser, section, option, value): - tmp_value = value.replace(u'%%', u'') # escaped percent signs - tmp_value = self._KEYCRE.sub(u'', tmp_value) # valid syntax - if u'%' in tmp_value: - raise ValueError(u"invalid interpolation syntax in %r at " - u"position %d" % (value, tmp_value.find(u'%'))) + tmp_value = value.replace('%%', '') # escaped percent signs + tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax + if '%' in tmp_value: + raise ValueError("invalid interpolation syntax in %r at " + "position %d" % (value, tmp_value.find('%'))) return value def _interpolate_some(self, parser, option, accum, rest, section, map, @@ -415,7 +422,7 @@ class BasicInterpolation(Interpolation): if depth > MAX_INTERPOLATION_DEPTH: raise InterpolationDepthError(option, section, rest) while rest: - p = rest.find(u"%") + p = rest.find("%") if p < 0: accum.append(rest) return @@ -424,14 +431,14 @@ class BasicInterpolation(Interpolation): rest = rest[p:] # p is no longer used c = rest[1:2] - if c == u"%": - accum.append(u"%") + if c == "%": + accum.append("%") rest = rest[2:] - elif c == u"(": + elif c == "(": m = self._KEYCRE.match(rest) if m is None: raise InterpolationSyntaxError(option, section, - u"bad interpolation variable reference %r" % rest) + "bad interpolation variable reference %r" % rest) var = parser.optionxform(m.group(1)) rest = rest[m.end():] try: @@ -439,7 +446,7 @@ class BasicInterpolation(Interpolation): except KeyError: raise InterpolationMissingOptionError( option, section, rest, var) - if u"%" in v: + if "%" in v: self._interpolate_some(parser, option, accum, v, section, map, depth + 1) else: @@ -447,27 +454,27 @@ class BasicInterpolation(Interpolation): else: raise InterpolationSyntaxError( option, section, - u"'%%' must be followed by '%%' or '(', " - u"found: %r" % (rest,)) + "'%%' must be followed by '%%' or '(', " + "found: %r" % (rest,)) class ExtendedInterpolation(Interpolation): - u"""Advanced variant of interpolation, supports the syntax used by + """Advanced variant of interpolation, supports the syntax used by `zc.buildout'. Enables interpolation between sections.""" - _KEYCRE = re.compile(ur"\$\{([^}]+)\}") + _KEYCRE = re.compile(r"\$\{([^}]+)\}") def before_get(self, parser, section, option, value, defaults): L = [] self._interpolate_some(parser, option, L, value, section, defaults, 1) - return u''.join(L) + return ''.join(L) def before_set(self, parser, section, option, value): - tmp_value = value.replace(u'$$', u'') # escaped dollar signs - tmp_value = self._KEYCRE.sub(u'', tmp_value) # valid syntax - if u'$' in tmp_value: - raise ValueError(u"invalid interpolation syntax in %r at " - u"position %d" % (value, tmp_value.find(u'%'))) + tmp_value = value.replace('$$', '') # escaped dollar signs + tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax + if '$' in tmp_value: + raise ValueError("invalid interpolation syntax in %r at " + "position %d" % (value, tmp_value.find('%'))) return value def _interpolate_some(self, parser, option, accum, rest, section, map, @@ -475,7 +482,7 @@ class ExtendedInterpolation(Interpolation): if depth > MAX_INTERPOLATION_DEPTH: raise InterpolationDepthError(option, section, rest) while rest: - p = rest.find(u"$") + p = rest.find("$") if p < 0: accum.append(rest) return @@ -484,15 +491,15 @@ class ExtendedInterpolation(Interpolation): rest = rest[p:] # p is no longer used c = rest[1:2] - if c == u"$": - accum.append(u"$") + if c == "$": + accum.append("$") rest = rest[2:] - elif c == u"{": + elif c == "{": m = self._KEYCRE.match(rest) if m is None: raise InterpolationSyntaxError(option, section, - u"bad interpolation variable reference %r" % rest) - path = m.group(1).split(u':') + "bad interpolation variable reference %r" % rest) + path = m.group(1).split(':') rest = rest[m.end():] sect = section opt = option @@ -507,11 +514,11 @@ class ExtendedInterpolation(Interpolation): else: raise InterpolationSyntaxError( option, section, - u"More than one ':' found: %r" % (rest,)) + "More than one ':' found: %r" % (rest,)) except (KeyError, NoSectionError, NoOptionError): raise InterpolationMissingOptionError( - option, section, rest, u":".join(path)) - if u"$" in v: + option, section, rest, ":".join(path)) + if "$" in v: self._interpolate_some(parser, opt, accum, v, sect, dict(parser.items(sect, raw=True)), depth + 1) @@ -520,33 +527,33 @@ class ExtendedInterpolation(Interpolation): else: raise InterpolationSyntaxError( option, section, - u"'$' must be followed by '$' or '{', " - u"found: %r" % (rest,)) + "'$' must be followed by '$' or '{', " + "found: %r" % (rest,)) class LegacyInterpolation(Interpolation): - u"""Deprecated interpolation used in old versions of ConfigParser. + """Deprecated interpolation used in old versions of ConfigParser. Use BasicInterpolation or ExtendedInterpolation instead.""" - _KEYCRE = re.compile(ur"%\(([^)]*)\)s|.") + _KEYCRE = re.compile(r"%\(([^)]*)\)s|.") def before_get(self, parser, section, option, value, vars): rawval = value depth = MAX_INTERPOLATION_DEPTH while depth: # Loop through this until it's done depth -= 1 - if value and u"%(" in value: + if value and "%(" in value: replace = functools.partial(self._interpolation_replace, parser=parser) value = self._KEYCRE.sub(replace, value) try: value = value % vars - except KeyError, e: + except KeyError as e: raise InterpolationMissingOptionError( option, section, rawval, e.args[0]) else: break - if value and u"%(" in value: + if value and "%(" in value: raise InterpolationDepthError(option, section, rawval) return value @@ -559,19 +566,19 @@ class LegacyInterpolation(Interpolation): if s is None: return match.group() else: - return u"%%(%s)s" % parser.optionxform(s) + return "%%(%s)s" % parser.optionxform(s) class RawConfigParser(MutableMapping): - u"""ConfigParser that does not do interpolation.""" + """ConfigParser that does not do interpolation.""" # Regular expressions for parsing section headers and options - _SECT_TMPL = ur""" + _SECT_TMPL = r""" \[ # [ (?P

    [^]]+) # very permissive! \] # ] """ - _OPT_TMPL = ur""" + _OPT_TMPL = r""" (?P