diff --git a/gclc-swt/LICENSE.txt b/gclc-swt/LICENSE.txt new file mode 100644 index 0000000..1753629 --- /dev/null +++ b/gclc-swt/LICENSE.txt @@ -0,0 +1,517 @@ + CeCILL FREE SOFTWARE LICENSE AGREEMENT + +Version 2.1 dated 2013-06-21 + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to users, + * secondly, the election of a governing law, French law, with which it + is conformant, both as regards the law of torts and intellectual + property law, and the protection that it offers to both authors and + holders of the economic rights over software. + +The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) +license are: + +Commissariat à l'énergie atomique et aux énergies alternatives - CEA, a +public scientific, technical and industrial research establishment, +having its principal place of business at 25 rue Leblanc, immeuble Le +Ponant D, 75015 Paris, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange, 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +Inria, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and redistribute the software governed by this +license within the framework of an open source distribution model. + +The exercising of this right is conditional upon certain obligations for +users so as to preserve this status for all subsequent redistributions. + +In consideration of access to the source code and the 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 only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +suitability of the software 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 of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + +Frequently asked questions can be found on the official website of the +CeCILL licenses family (http://www.cecill.info/index.en.html) for any +necessary clarification. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Contribution: means any or all modifications, corrections, translations, +adaptations and/or new functions integrated into the Software by any or +all Contributors, as well as any or all Internal Modules. + +Module: means a set of sources files including their documentation that +enables supplementary functions or services in addition to those offered +by the Software. + +External Module: means any or all Modules, not derived from the +Software, so that this Module and the Software run in separate address +spaces, with one calling the other when they are run. + +Internal Module: means any or all Module, connected to the Software so +that they both execute in the same address space. + +GNU GPL: means the GNU General Public License version 2 or any +subsequent version, as published by the Free Software Foundation Inc. + +GNU Affero GPL: means the GNU Affero General Public License version 3 or +any subsequent version, as published by the Free Software Foundation Inc. + +EUPL: means the European Union Public License version 1.1 or any +subsequent version, as published by the European Commission. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 <#scope> hereinafter for the whole +term of the protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical medium; + * (ii) the first time the Licensee exercises any of the rights granted + hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +<#accepting> hereinabove, and the Licensee hereby acknowledges that it +has read and understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1 <#accepting>. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or all + medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission or + storage operation as regards the Software, that it is entitled to + carry out hereunder. + + + 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting software. + +The Licensee is authorized to make any or all Contributions to the +Software provided that it includes an explicit notice that it is the +author of said Contribution and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's warranty + and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows effective access to the full Source +Code of the Software for a period of at least three years from the +distribution of the Software, it being understood that the additional +acquisition cost of the Source Code shall not exceed the cost of the +data transfer. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and +conditions for the distribution of the resulting Modified Software +become subject to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +source code or object code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's warranty + and liability as set forth in Articles 8 and 9, + +and, in the event that only the object code of the Modified Software is +redistributed, + + 3. a note stating the conditions of effective access to the full source + code of the Modified Software for a period of at least three years + from the distribution of the Modified Software, it being understood + that the additional acquisition cost of the source code shall not + exceed the cost of the data transfer. + + + 5.3.3 DISTRIBUTION OF EXTERNAL MODULES + +When the Licensee has developed an External Module, the terms and +conditions of this Agreement do not apply to said External Module, that +may be distributed under a separate license agreement. + + + 5.3.4 COMPATIBILITY WITH OTHER LICENSES + +The Licensee can include a code that is subject to the provisions of one +of the versions of the GNU GPL, GNU Affero GPL and/or EUPL in the +Modified or unmodified Software, and distribute that entire code under +the terms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL. + +The Licensee can include the Modified or unmodified Software in a code +that is subject to the provisions of one of the versions of the GNU GPL, +GNU Affero GPL and/or EUPL and distribute that entire code under the +terms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by this Agreement, for the duration set forth in Article 4.2 <#term>. + + + 6.2 OVER THE CONTRIBUTIONS + +The Licensee who develops a Contribution is the owner of the +intellectual property rights over this Contribution as defined by +applicable law. + + + 6.3 OVER THE EXTERNAL MODULES + +The Licensee who develops an External Module is the owner of the +intellectual property rights over this External Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution. + + + 6.4 JOINT PROVISIONS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies of + the Software modified or not. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights on the Software of the Holder and/or +Contributors, and to take, where applicable, vis-à-vis its staff, any +and all measures required to ensure respect of said intellectual +property rights of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the suitability of the product for its requirements, its good working +order, and for ensuring that it shall not cause damage to either persons +or properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5 <#scope>). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 <#good-faith> and, in particular, +without any warranty as to its commercial value, its secured, safe, +innovative or relevant nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +expertise for its defense. Such technical and legal expertise shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version, subject to the provisions of Article 5.3.4 +<#compatibility>. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/ConsoleDelayIO.java b/gclc-swt/src/main/java/net/bigeon/gclc/swt/ConsoleDelayIO.java similarity index 56% rename from gclc-swt/src/main/java/fr/bigeon/gclc/swt/ConsoleDelayIO.java rename to gclc-swt/src/main/java/net/bigeon/gclc/swt/ConsoleDelayIO.java index 161d1d1..64de8e3 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/ConsoleDelayIO.java +++ b/gclc-swt/src/main/java/net/bigeon/gclc/swt/ConsoleDelayIO.java @@ -1,57 +1,90 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.ConsoleDelayIO.java - * Created on: Nov 19, 2016 - */ -package fr.bigeon.gclc.swt; - -/** This class represents an object used to send commands to a console - * application. - *

- * The sending of command is done in two phases. Define the input through get - * and set, and then validate the input. - * - * @author Emmanuel Bigeon */ -public interface ConsoleDelayIO { - /** Get the input text. - * @return the non validated input */ - String getInput(); - - /** Set the input text. - * - * @param input the input to set */ - void setInput(String input); - - /** Actually send the input as the prompt next input. */ - void validateInput(); -} +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.ConsoleDelayIO.java + * Created on: Nov 19, 2016 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +/** This class represents an object used to send commands to a console + * application. + *

+ * The sending of command is done in two phases. Define the input through get + * and set, and then validate the input. + * + * @author Emmanuel Bigeon */ +public interface ConsoleDelayIO { + /** Get the input text. + * @return the non validated input */ + String getInput(); + + /** Set the input text. + * + * @param input the input to set */ + void setInput(String input); + + /** Actually send the input as the prompt next input. */ + void validateInput(); +} diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/HistoryTextKeyListener.java b/gclc-swt/src/main/java/net/bigeon/gclc/swt/HistoryTextKeyListener.java similarity index 69% rename from gclc-swt/src/main/java/fr/bigeon/gclc/swt/HistoryTextKeyListener.java rename to gclc-swt/src/main/java/net/bigeon/gclc/swt/HistoryTextKeyListener.java index 2b398d9..9d91bb2 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/HistoryTextKeyListener.java +++ b/gclc-swt/src/main/java/net/bigeon/gclc/swt/HistoryTextKeyListener.java @@ -1,112 +1,145 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.HistoryTextKeyListener.java - * Created on: Jun 9, 2016 - */ -package fr.bigeon.gclc.swt; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; - -import net.bigeon.collections.ArrayRibbon; -import net.bigeon.collections.Ribbon; - -/** A key listener to validate commands and manage the history of commands. - * - * @author Emmanuel Bigeon */ -public final class HistoryTextKeyListener extends KeyAdapter { - - /** The size of commands history. */ - private static final int DEFAULT_HISTORY_SIZE = 10; - /** The empty string constant. */ - private static final String EMPTY = ""; //$NON-NLS-1$ - /** The history ribbon. */ - private final Ribbon commands; - /** The current index in history search. */ - private int currentIndex = 0; - /** The console to notify of command validation. */ - private final ConsoleDelayIO console; - - /** Create the key listener that cycle the history. - * - * @param console the console delayed */ - public HistoryTextKeyListener(final ConsoleDelayIO console) { - super(); - this.console = console; - commands = new ArrayRibbon<>(DEFAULT_HISTORY_SIZE); - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.KeyAdapter#keyPressed(org.eclipse.swt.events. - * KeyEvent) */ - @Override - public void keyPressed(final KeyEvent e) { - pressedKeyCode(e.keyCode); - } - - /** Indicate a pressed key combination. - * - * @param keyCode the pressed key code */ - public void pressedKeyCode(final int keyCode) { - // Enter validates the command if prompting - if (keyCode == '\r') { - final String input = console.getInput(); - if (!input.isEmpty()) { - commands.add(input); - } - console.validateInput(); - currentIndex = -1; - } - - // Upper arrow retrieves previous commands - if (keyCode == SWT.ARROW_UP && - currentIndex < commands.size() - 1) { - currentIndex++; - final String cmd = commands.get(commands.size() - currentIndex - 1); - console.setInput(cmd); - } - - // Lower arrow retrieves next commands - if (keyCode == SWT.ARROW_DOWN) { - if (currentIndex == 0) { - currentIndex--; - console.setInput(EMPTY); - } else if (currentIndex > 0) { - final String cmd = commands - .get(commands.size() - (--currentIndex) - 1); - console.setInput(cmd); - } - } - } -} \ No newline at end of file +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.HistoryTextKeyListener.java + * Created on: Jun 9, 2016 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; + +import net.bigeon.collections.ArrayRibbon; +import net.bigeon.collections.Ribbon; + +/** A key listener to validate commands and manage the history of commands. + * + * @author Emmanuel Bigeon */ +public final class HistoryTextKeyListener extends KeyAdapter { + + /** The size of commands history. */ + private static final int DEFAULT_HISTORY_SIZE = 10; + /** The empty string constant. */ + private static final String EMPTY = ""; //$NON-NLS-1$ + /** The history ribbon. */ + private final Ribbon commands; + /** The current index in history search. */ + private int currentIndex = 0; + /** The console to notify of command validation. */ + private final ConsoleDelayIO console; + + /** Create the key listener that cycle the history. + * + * @param console the console delayed */ + public HistoryTextKeyListener(final ConsoleDelayIO console) { + super(); + this.console = console; + commands = new ArrayRibbon<>(DEFAULT_HISTORY_SIZE); + } + + /* (non-Javadoc) + * @see org.eclipse.swt.events.KeyAdapter#keyPressed(org.eclipse.swt.events. + * KeyEvent) */ + @Override + public void keyPressed(final KeyEvent e) { + pressedKeyCode(e.keyCode); + } + + /** Indicate a pressed key combination. + * + * @param keyCode the pressed key code */ + public void pressedKeyCode(final int keyCode) { + // Enter validates the command if prompting + if (keyCode == '\r') { + final String input = console.getInput(); + if (!input.isEmpty()) { + commands.add(input); + } + console.validateInput(); + currentIndex = -1; + } + + // Upper arrow retrieves previous commands + if (keyCode == SWT.ARROW_UP && + currentIndex < commands.size() - 1) { + currentIndex++; + final String cmd = commands.get(commands.size() - currentIndex - 1); + console.setInput(cmd); + } + + // Lower arrow retrieves next commands + if (keyCode == SWT.ARROW_DOWN) { + if (currentIndex == 0) { + currentIndex--; + console.setInput(EMPTY); + } else if (currentIndex > 0) { + final String cmd = commands + .get(commands.size() - (--currentIndex) - 1); + console.setInput(cmd); + } + } + } +} diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsole.java b/gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsole.java similarity index 86% rename from gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsole.java rename to gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsole.java index a16e987..3882ab9 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsole.java +++ b/gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsole.java @@ -1,436 +1,469 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.SWTConsole.java - * Created on: Apr 18, 2015 - */ -package fr.bigeon.gclc.swt; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; - -import net.bigeon.gclc.ConsoleApplication; -import net.bigeon.gclc.manager.ConsoleInput; -import net.bigeon.gclc.manager.ConsoleOutput; -import net.bigeon.gclc.tools.ConstantString; -import net.bigeon.gclc.tools.StringProvider; - -/** A SWT component to connect to gclc {@link ConsoleApplication}. - *

- * - * @author Emmanuel Bigeon */ -public final class SWTConsole extends Composite - implements ConsoleDelayIO, ConsoleInput, ConsoleOutput { - /** The number of columns of the layout. */ - private static final int LAYOUT_NB_COLUMNS = 2; - /** The cmd prefix in the output console. */ - private static final String CMD_PREFIX = "[CMD] "; //$NON-NLS-1$ - /** The class logger. */ - private static final Logger LOGGER = Logger - .getLogger(SWTConsole.class.getName()); - /** The empty string constant. */ - private static final String EMPTY = ""; //$NON-NLS-1$ - /** The console output text field. */ - private final Text consoleOutput; - /** The console input text field. */ - private final Text consoleInput; - /** The prompt label. */ - private final Label lblPromptlabel; - /** The prompt text. */ - private StringProvider prompt = new ConstantString("> "); //$NON-NLS-1$ - /** The command entered by the user. */ - private String command = null; - /** If the prompt should be active. */ - private boolean prompting = false; - /** The object for thread synchronization with the prompt. */ - private final Object promptLock = new Object(); - - /** Create the composite. - * - * @param parent the prent composite - * @param style the composite style */ - public SWTConsole(final Composite parent, final int style) { - super(parent, style); - - setLayout(new GridLayout(LAYOUT_NB_COLUMNS, false)); - - consoleOutput = new Text(this, - SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI); - consoleOutput.setLayoutData( - new GridData(SWT.FILL, SWT.FILL, true, true, LAYOUT_NB_COLUMNS, 1)); - consoleOutput.setRedraw(true); - - lblPromptlabel = new Label(this, SWT.NONE); - lblPromptlabel.setText(prompt.apply()); - - consoleInput = new Text(this, SWT.BORDER); - consoleInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - consoleInput.addKeyListener(new HistoryTextKeyListener(this)); - - } - - @Override - protected void checkSubclass() { - // Disable the check that prevents subclassing of SWT components - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleManager#close() */ - @Override - public void close() { - synchronized (promptLock) { - prompting = false; - promptLock.notifyAll(); - } - if (consoleInput.isDisposed()) { - return; - } - consoleInput.setEnabled(false); - consoleOutput.setEnabled(false); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ - @Override - public String getInput() { - return consoleInput.getText(); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.ConsoleManager#getPrompt() */ - @Override - public StringProvider getPrompt() { - return prompt; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleManager#interruptPrompt() */ - @Override - public void interruptPrompt() { - synchronized (promptLock) { - promptLock.notifyAll(); - } - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleManager#isClosed() */ - @Override - public boolean isClosed() { - return isDisposed(); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.ConsoleManager#print(java.lang.String) */ - @Override - public void print(final String text) throws IOException { - if (isDisposed()) { - throw new IOException(); - } - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - if (!consoleOutput.isDisposed()) { - consoleOutput.append(text); - } - } - }); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.ConsoleManager#println() */ - @Override - public void println() throws IOException { - if (isDisposed()) { - throw new IOException(); - } - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - if (!consoleOutput.isDisposed()) { - consoleOutput.append(System.lineSeparator()); - } - } - }); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.ConsoleManager#println(java.lang.String) */ - @Override - public void println(final String message) throws IOException { - if (isDisposed()) { - throw new IOException(); - } - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - if (!consoleOutput.isDisposed()) { - consoleOutput.append(message + System.lineSeparator()); - } - } - }); - - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.ConsoleManager#prompt() */ - @Override - public String prompt() throws IOException { - synchronized (promptLock) { - if (isDisposed()) { - throw new IOException(); - } - try { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - if (!consoleInput.isDisposed()) { - consoleInput.setEnabled(true); - lblPromptlabel.setText(prompt.apply()); - // relayout - SWTConsole.this.layout(); - consoleInput.setFocus(); - } - } - }); - prompting = true; - promptLock.notifyAll(); - while (prompting) { - promptLock.wait(); - } - } catch (final InterruptedException e) { - LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$ - command = null; - Thread.currentThread().interrupt(); - } - } - if (isDisposed()) { - throw new IOException("Input closed"); //$NON-NLS-1$ - } - return command; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleInput#prompt(long) */ - @Override - public String prompt(final long timeout) throws IOException { - synchronized (promptLock) { - if (isDisposed()) { - throw new IOException(); - } - try { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - if (!consoleInput.isDisposed()) { - consoleInput.setEnabled(true); - lblPromptlabel.setText(prompt.apply()); - // relayout - SWTConsole.this.layout(); - consoleInput.setFocus(); - } - } - }); - prompting = true; - command = null; - promptLock.notifyAll(); - final long start = System.currentTimeMillis(); - long cur = start; - while (prompting && start + timeout>cur) { - promptLock.wait((cur-start-timeout)/2); - cur = System.currentTimeMillis(); - } - } catch (final InterruptedException e) { - LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$ - command = null; - Thread.currentThread().interrupt(); - } - } - if (isDisposed()) { - throw new IOException("Input closed"); //$NON-NLS-1$ - } - return command; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.ConsoleManager#prompt(java.lang.String) */ - @Override - public String prompt(final String message) throws IOException { - synchronized (promptLock) { - if (isDisposed()) { - throw new IOException(); - } - try { - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - if (!consoleOutput.isDisposed()) { - lblPromptlabel.setText(message); - // relayout - SWTConsole.this.layout(); - consoleInput.setEnabled(true); - consoleInput.setFocus(); - } - } - }); - prompting = true; - promptLock.wait(); - if (isDisposed()) { - throw new IOException(); - } - } catch (final InterruptedException e) { - LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$ - command = null; - Thread.currentThread().interrupt(); - } finally { - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - if (!consoleOutput.isDisposed()) { - lblPromptlabel.setText(prompt.apply()); - // relayout - SWTConsole.this.layout(); - } - } - }); - } - } - return command; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleInput#prompt(java.lang.String, long) */ - @Override - public String prompt(final String message, final long timeout) throws IOException { - // TODO Auto-generated method stub - // return null; - throw new RuntimeException("Not implemented yet"); - } - - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Composite#setFocus() */ - @Override - public boolean setFocus() { - return consoleInput.setFocus(); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.swt.ConsoleDelayIO#setInput(java.lang.String) */ - @Override - public void setInput(final String input) { - consoleInput.setText(input); - consoleInput.setSelection(input.length()); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.ConsoleManager#setPrompt(java.lang.String) */ - @Override - public void setPrompt(final StringProvider prompt) { - this.prompt = prompt; - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - if (!consoleOutput.isDisposed()) { - lblPromptlabel.setText(prompt.apply()); - // relayout - SWTConsole.this.layout(); - } - } - }); - } - - @Override - public void setPrompt(String prompt) { - setPrompt(new ConstantString(prompt)); - } - - /** @param string the text */ - public void setText(final String string) { - consoleInput.setText(string); - } - - /** - * - */ - public void validateCommand() { - validateInput(); - } - - /** - * - */ - @Override - public void validateInput() { - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - consoleInput.setEnabled(false); - } - }); - synchronized (promptLock) { - while (!prompting) { - try { - promptLock.wait(); - } catch (final InterruptedException e) { - LOGGER.log(Level.SEVERE, "Interruption while waiting prompt", e); //$NON-NLS-1$ - } - } - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - command = consoleInput.getText(); - prompting = false; - consoleInput.setText(EMPTY); - consoleOutput.append(CMD_PREFIX + command + System.lineSeparator()); - } - }); - promptLock.notifyAll(); - } - } - -} +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.SWTConsole.java + * Created on: Apr 18, 2015 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +import net.bigeon.gclc.ConsoleApplication; +import net.bigeon.gclc.manager.ConsoleInput; +import net.bigeon.gclc.manager.ConsoleOutput; +import net.bigeon.gclc.tools.ConstantString; +import net.bigeon.gclc.tools.StringProvider; + +/** A SWT component to connect to gclc {@link ConsoleApplication}. + *

+ * + * @author Emmanuel Bigeon */ +public final class SWTConsole extends Composite + implements ConsoleDelayIO, ConsoleInput, ConsoleOutput { + /** The number of columns of the layout. */ + private static final int LAYOUT_NB_COLUMNS = 2; + /** The cmd prefix in the output console. */ + private static final String CMD_PREFIX = "[CMD] "; //$NON-NLS-1$ + /** The class logger. */ + private static final Logger LOGGER = Logger + .getLogger(SWTConsole.class.getName()); + /** The empty string constant. */ + private static final String EMPTY = ""; //$NON-NLS-1$ + /** The console output text field. */ + private final Text consoleOutput; + /** The console input text field. */ + private final Text consoleInput; + /** The prompt label. */ + private final Label lblPromptlabel; + /** The prompt text. */ + private StringProvider prompt = new ConstantString("> "); //$NON-NLS-1$ + /** The command entered by the user. */ + private String command = null; + /** If the prompt should be active. */ + private boolean prompting = false; + /** The object for thread synchronization with the prompt. */ + private final Object promptLock = new Object(); + + /** Create the composite. + * + * @param parent the prent composite + * @param style the composite style */ + public SWTConsole(final Composite parent, final int style) { + super(parent, style); + + setLayout(new GridLayout(LAYOUT_NB_COLUMNS, false)); + + consoleOutput = new Text(this, + SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI); + consoleOutput.setLayoutData( + new GridData(SWT.FILL, SWT.FILL, true, true, LAYOUT_NB_COLUMNS, 1)); + consoleOutput.setRedraw(true); + + lblPromptlabel = new Label(this, SWT.NONE); + lblPromptlabel.setText(prompt.apply()); + + consoleInput = new Text(this, SWT.BORDER); + consoleInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + consoleInput.addKeyListener(new HistoryTextKeyListener(this)); + + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#close() */ + @Override + public void close() { + synchronized (promptLock) { + prompting = false; + promptLock.notifyAll(); + } + if (consoleInput.isDisposed()) { + return; + } + consoleInput.setEnabled(false); + consoleOutput.setEnabled(false); + } + + /* (non-Javadoc) + * @see net.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ + @Override + public String getInput() { + return consoleInput.getText(); + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#getPrompt() */ + @Override + public StringProvider getPrompt() { + return prompt; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#interruptPrompt() */ + @Override + public void interruptPrompt() { + synchronized (promptLock) { + promptLock.notifyAll(); + } + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#isClosed() */ + @Override + public boolean isClosed() { + return isDisposed(); + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#print(java.lang.String) */ + @Override + public void print(final String text) throws IOException { + if (isDisposed()) { + throw new IOException(); + } + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + if (!consoleOutput.isDisposed()) { + consoleOutput.append(text); + } + } + }); + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#println() */ + @Override + public void println() throws IOException { + if (isDisposed()) { + throw new IOException(); + } + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + if (!consoleOutput.isDisposed()) { + consoleOutput.append(System.lineSeparator()); + } + } + }); + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#println(java.lang.String) */ + @Override + public void println(final String message) throws IOException { + if (isDisposed()) { + throw new IOException(); + } + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + if (!consoleOutput.isDisposed()) { + consoleOutput.append(message + System.lineSeparator()); + } + } + }); + + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#prompt() */ + @Override + public String prompt() throws IOException { + synchronized (promptLock) { + if (isDisposed()) { + throw new IOException(); + } + try { + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + if (!consoleInput.isDisposed()) { + consoleInput.setEnabled(true); + lblPromptlabel.setText(prompt.apply()); + // relayout + SWTConsole.this.layout(); + consoleInput.setFocus(); + } + } + }); + prompting = true; + promptLock.notifyAll(); + while (prompting) { + promptLock.wait(); + } + } catch (final InterruptedException e) { + LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$ + command = null; + Thread.currentThread().interrupt(); + } + } + if (isDisposed()) { + throw new IOException("Input closed"); //$NON-NLS-1$ + } + return command; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleInput#prompt(long) */ + @Override + public String prompt(final long timeout) throws IOException { + synchronized (promptLock) { + if (isDisposed()) { + throw new IOException(); + } + try { + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + if (!consoleInput.isDisposed()) { + consoleInput.setEnabled(true); + lblPromptlabel.setText(prompt.apply()); + // relayout + SWTConsole.this.layout(); + consoleInput.setFocus(); + } + } + }); + prompting = true; + command = null; + promptLock.notifyAll(); + final long start = System.currentTimeMillis(); + long cur = start; + while (prompting && start + timeout>cur) { + promptLock.wait((cur-start-timeout)/2); + cur = System.currentTimeMillis(); + } + } catch (final InterruptedException e) { + LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$ + command = null; + Thread.currentThread().interrupt(); + } + } + if (isDisposed()) { + throw new IOException("Input closed"); //$NON-NLS-1$ + } + return command; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#prompt(java.lang.String) */ + @Override + public String prompt(final String message) throws IOException { + synchronized (promptLock) { + if (isDisposed()) { + throw new IOException(); + } + try { + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + if (!consoleOutput.isDisposed()) { + lblPromptlabel.setText(message); + // relayout + SWTConsole.this.layout(); + consoleInput.setEnabled(true); + consoleInput.setFocus(); + } + } + }); + prompting = true; + promptLock.wait(); + if (isDisposed()) { + throw new IOException(); + } + } catch (final InterruptedException e) { + LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$ + command = null; + Thread.currentThread().interrupt(); + } finally { + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + if (!consoleOutput.isDisposed()) { + lblPromptlabel.setText(prompt.apply()); + // relayout + SWTConsole.this.layout(); + } + } + }); + } + } + return command; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleInput#prompt(java.lang.String, long) */ + @Override + public String prompt(final String message, final long timeout) throws IOException { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + + /* (non-Javadoc) + * @see org.eclipse.swt.widgets.Composite#setFocus() */ + @Override + public boolean setFocus() { + return consoleInput.setFocus(); + } + + /* (non-Javadoc) + * @see net.bigeon.gclc.swt.ConsoleDelayIO#setInput(java.lang.String) */ + @Override + public void setInput(final String input) { + consoleInput.setText(input); + consoleInput.setSelection(input.length()); + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#setPrompt(java.lang.String) */ + @Override + public void setPrompt(final StringProvider prompt) { + this.prompt = prompt; + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + if (!consoleOutput.isDisposed()) { + lblPromptlabel.setText(prompt.apply()); + // relayout + SWTConsole.this.layout(); + } + } + }); + } + + @Override + public void setPrompt(String prompt) { + setPrompt(new ConstantString(prompt)); + } + + /** @param string the text */ + public void setText(final String string) { + consoleInput.setText(string); + } + + /** + * + */ + public void validateCommand() { + validateInput(); + } + + /** + * + */ + @Override + public void validateInput() { + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + consoleInput.setEnabled(false); + } + }); + synchronized (promptLock) { + while (!prompting) { + try { + promptLock.wait(); + } catch (final InterruptedException e) { + LOGGER.log(Level.SEVERE, "Interruption while waiting prompt", e); //$NON-NLS-1$ + } + } + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + command = consoleInput.getText(); + prompting = false; + consoleInput.setText(EMPTY); + consoleOutput.append(CMD_PREFIX + command + System.lineSeparator()); + } + }); + promptLock.notifyAll(); + } + } + +} diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleShell.java b/gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsoleShell.java similarity index 61% rename from gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleShell.java rename to gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsoleShell.java index aa0678b..4c16bd4 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleShell.java +++ b/gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsoleShell.java @@ -1,85 +1,118 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.SWTConsoleShell.java - * Created on: Apr 18, 2015 - */ -package fr.bigeon.gclc.swt; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -/** A shell containing a {@link SWTConsole} - *

- * - * @author Emmanuel Bigeon */ -public final class SWTConsoleShell extends Shell { - - /** The console component */ - private SWTConsole console; - - /** Create the shell. - * - * @param display the display */ - public SWTConsoleShell(final Display display) { - super(display, SWT.SHELL_TRIM); - setLayout(new FillLayout(SWT.HORIZONTAL)); - - createContents(); - } - - @Override - protected void checkSubclass() { - // Disable the check that prevents subclassing of SWT components - } - - /** Create contents of the shell. */ - protected void createContents() { - console = new SWTConsole(this, SWT.NONE); - setText("Console Application"); //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Shell#dispose() */ - @Override - public void dispose() { - super.dispose(); - console.close(); - } - - /** @return the input and output. */ - public SWTConsole getManager() { - return console; - } -} +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.SWTConsoleShell.java + * Created on: Apr 18, 2015 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +/** A shell containing a {@link SWTConsole} + *

+ * + * @author Emmanuel Bigeon */ +public final class SWTConsoleShell extends Shell { + + /** The console component */ + private SWTConsole console; + + /** Create the shell. + * + * @param display the display */ + public SWTConsoleShell(final Display display) { + super(display, SWT.SHELL_TRIM); + setLayout(new FillLayout(SWT.HORIZONTAL)); + + createContents(); + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /** Create contents of the shell. */ + protected void createContents() { + console = new SWTConsole(this, SWT.NONE); + setText("Console Application"); //$NON-NLS-1$ + } + + /* (non-Javadoc) + * @see org.eclipse.swt.widgets.Shell#dispose() */ + @Override + public void dispose() { + super.dispose(); + console.close(); + } + + /** @return the input and output. */ + public SWTConsole getManager() { + return console; + } +} diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleView.java b/gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsoleView.java similarity index 75% rename from gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleView.java rename to gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsoleView.java index 7a37189..89b98e7 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleView.java +++ b/gclc-swt/src/main/java/net/bigeon/gclc/swt/SWTConsoleView.java @@ -1,190 +1,223 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.SWTConsole.java - * Created on: Apr 18, 2015 - */ -package fr.bigeon.gclc.swt; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Text; - -import net.bigeon.gclc.ConsoleApplication; -import net.bigeon.gclc.utils.AOutputForwardRunnable; -import net.bigeon.gclc.utils.PipedConsoleInput; -import net.bigeon.gclc.utils.PipedConsoleOutput; - -/** A SWT component to connect to gclc {@link ConsoleApplication} - *

- * - * @author Emmanuel Bigeon */ -public final class SWTConsoleView extends Composite implements ConsoleDelayIO { - /** The local implementation of the forwarding runnable - * - * @author Emmanuel Bigeon */ - private final class ToSWTConsoleForwardRunnable - extends AOutputForwardRunnable { - /** The running status */ - private boolean running = true; - - /** @param manager the manager */ - public ToSWTConsoleForwardRunnable(final PipedConsoleOutput manager) { - super(manager); - } - - @Override - protected void forwardLine(final String m) { - appendConsoleOutput(m); - } - - @Override - protected boolean isRunning() { - return running && !isDisposed(); - } - - /** @param running the running to set */ - public void setRunning(final boolean running) { - this.running = running; - } - } - - /** The class logger */ - private static final Logger LOGGER = Logger - .getLogger(SWTConsoleView.class.getName()); - /** The console output text field */ - private final Text consoleOutput; - /** The console input text field */ - private final Text consoleInput; - /** The input. */ - private PipedConsoleInput input; - /** The forwarding runnable */ - private ToSWTConsoleForwardRunnable forward; - - /** Create the composite. - * - * @param parent the prent composite - * @param style the composite style */ - public SWTConsoleView(final Composite parent, final int style) { - super(parent, style); - - setLayout(new GridLayout(1, false)); - - consoleOutput = new Text(this, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | - SWT.V_SCROLL | SWT.MULTI); - consoleOutput.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, - 1, 1)); - consoleOutput.setRedraw(true); - - consoleInput = new Text(this, SWT.BORDER); - consoleInput.setLayoutData( - new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - consoleInput.addKeyListener(new HistoryTextKeyListener(this)); - } - - /** @param next the next message */ - protected void appendConsoleOutput(final String next) { - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - consoleOutput.append(System.lineSeparator() + next); - } - }); - } - - @Override - protected void checkSubclass() { - // Disable the check that prevents subclassing of SWT components - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ - @Override - public String getInput() { - return consoleInput.getText(); - } - - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Composite#setFocus() */ - @Override - public boolean setFocus() { - return consoleInput.setFocus(); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.swt.ConsoleDelayIO#setInput(java.lang.String) */ - @Override - public void setInput(final String input) { - consoleInput.setText(input); - consoleInput.setSelection(input.length()); - } - - /** Set the input and output. - * - * @param manager the output to set - * @param input the input */ - public void setManager(final PipedConsoleOutput manager, - final PipedConsoleInput input) { - this.input = input; - if (forward != null) { - forward.setRunning(false); - } - forward = new ToSWTConsoleForwardRunnable(manager); - final Thread th = new Thread(forward, "gclcToSWT"); //$NON-NLS-1$ - th.start(); - } - - /** @param string the text */ - public void setText(final String string) { - consoleInput.setText(string); - } - - /** - * - */ - @Override - public void validateInput() { - try { - input.type(getInput()); - } catch (final IOException e) { - LOGGER.log(Level.SEVERE, "Unable to input value to console", e); //$NON-NLS-1$ - } - } -} +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.SWTConsole.java + * Created on: Apr 18, 2015 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Text; + +import net.bigeon.gclc.ConsoleApplication; +import net.bigeon.gclc.utils.AOutputForwardRunnable; +import net.bigeon.gclc.utils.PipedConsoleInput; +import net.bigeon.gclc.utils.PipedConsoleOutput; + +/** A SWT component to connect to gclc {@link ConsoleApplication} + *

+ * + * @author Emmanuel Bigeon */ +public final class SWTConsoleView extends Composite implements ConsoleDelayIO { + /** The local implementation of the forwarding runnable + * + * @author Emmanuel Bigeon */ + private final class ToSWTConsoleForwardRunnable + extends AOutputForwardRunnable { + /** The running status */ + private boolean running = true; + + /** @param manager the manager */ + public ToSWTConsoleForwardRunnable(final PipedConsoleOutput manager) { + super(manager); + } + + @Override + protected void forwardLine(final String m) { + appendConsoleOutput(m); + } + + @Override + protected boolean isRunning() { + return running && !isDisposed(); + } + + /** @param running the running to set */ + public void setRunning(final boolean running) { + this.running = running; + } + } + + /** The class logger */ + private static final Logger LOGGER = Logger + .getLogger(SWTConsoleView.class.getName()); + /** The console output text field */ + private final Text consoleOutput; + /** The console input text field */ + private final Text consoleInput; + /** The input. */ + private PipedConsoleInput input; + /** The forwarding runnable */ + private ToSWTConsoleForwardRunnable forward; + + /** Create the composite. + * + * @param parent the prent composite + * @param style the composite style */ + public SWTConsoleView(final Composite parent, final int style) { + super(parent, style); + + setLayout(new GridLayout(1, false)); + + consoleOutput = new Text(this, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | + SWT.V_SCROLL | SWT.MULTI); + consoleOutput.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, + 1, 1)); + consoleOutput.setRedraw(true); + + consoleInput = new Text(this, SWT.BORDER); + consoleInput.setLayoutData( + new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + consoleInput.addKeyListener(new HistoryTextKeyListener(this)); + } + + /** @param next the next message */ + protected void appendConsoleOutput(final String next) { + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + consoleOutput.append(System.lineSeparator() + next); + } + }); + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /* (non-Javadoc) + * @see net.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ + @Override + public String getInput() { + return consoleInput.getText(); + } + + /* (non-Javadoc) + * @see org.eclipse.swt.widgets.Composite#setFocus() */ + @Override + public boolean setFocus() { + return consoleInput.setFocus(); + } + + /* (non-Javadoc) + * @see net.bigeon.gclc.swt.ConsoleDelayIO#setInput(java.lang.String) */ + @Override + public void setInput(final String input) { + consoleInput.setText(input); + consoleInput.setSelection(input.length()); + } + + /** Set the input and output. + * + * @param manager the output to set + * @param input the input */ + public void setManager(final PipedConsoleOutput manager, + final PipedConsoleInput input) { + this.input = input; + if (forward != null) { + forward.setRunning(false); + } + forward = new ToSWTConsoleForwardRunnable(manager); + final Thread th = new Thread(forward, "gclcToSWT"); //$NON-NLS-1$ + th.start(); + } + + /** @param string the text */ + public void setText(final String string) { + consoleInput.setText(string); + } + + /** + * + */ + @Override + public void validateInput() { + try { + input.type(getInput()); + } catch (final IOException e) { + LOGGER.log(Level.SEVERE, "Unable to input value to console", e); //$NON-NLS-1$ + } + } +} diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/package-info.java b/gclc-swt/src/main/java/net/bigeon/gclc/swt/package-info.java similarity index 71% rename from gclc-swt/src/main/java/fr/bigeon/gclc/swt/package-info.java rename to gclc-swt/src/main/java/net/bigeon/gclc/swt/package-info.java index 62c13ac..a1fc042 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/package-info.java +++ b/gclc-swt/src/main/java/net/bigeon/gclc/swt/package-info.java @@ -1,39 +1,38 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.package-info.java - * Created on: Nov 18, 2017 - */ -/** SWT components for a frontend of GCLC applications. - * - * @author Emmanuel Bigeon */ -package fr.bigeon.gclc.swt; +/** SWT components for a frontend of GCLC applications. + * + * @author Emmanuel Bigeon */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ diff --git a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/HistoryTextKeyListenerTest.java b/gclc-swt/src/test/java/net/bigeon/gclc/swt/HistoryTextKeyListenerTest.java similarity index 65% rename from gclc-swt/src/test/java/fr/bigeon/gclc/swt/HistoryTextKeyListenerTest.java rename to gclc-swt/src/test/java/net/bigeon/gclc/swt/HistoryTextKeyListenerTest.java index 67c670c..d5c98c7 100644 --- a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/HistoryTextKeyListenerTest.java +++ b/gclc-swt/src/test/java/net/bigeon/gclc/swt/HistoryTextKeyListenerTest.java @@ -1,108 +1,144 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.HistoryTextKeyListenerTest.java - * Created on: Nov 19, 2016 - */ -package fr.bigeon.gclc.swt; - -import static org.junit.Assert.assertEquals; - -import org.eclipse.swt.SWT; -import org.junit.Test; - -/**

- * TODO - * - * @author Emmanuel Bigeon */ -public class HistoryTextKeyListenerTest { - - /** Test method for - * {@link fr.bigeon.gclc.swt.HistoryTextKeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)}. */ - @Test - public final void testKeyPressedKeyEvent() { - ConsoleDelayIO io = new ConsoleDelayIO() { - private String input = ""; - - @Override - public void validateInput() { - input = ""; - } - - @Override - public void setInput(String input) { - this.input = input; - } - - @Override - public String getInput() { - return input; - } - }; - HistoryTextKeyListener listener = new HistoryTextKeyListener(io); - - // no effects - assertEquals("", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_UP); - assertEquals("", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_DOWN); - assertEquals("", io.getInput()); - listener.pressedKeyCode('\r'); - assertEquals("", io.getInput()); - - io.setInput("cmd arg"); - listener.pressedKeyCode(SWT.ARROW_UP); - assertEquals("cmd arg", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_DOWN); - assertEquals("cmd arg", io.getInput()); - listener.pressedKeyCode('\r'); - assertEquals("", io.getInput()); - - io.setInput("cmd arg2"); - listener.pressedKeyCode(SWT.ARROW_UP); - assertEquals("cmd arg", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_DOWN); - assertEquals("", io.getInput()); - io.setInput("cmd arg2"); - listener.pressedKeyCode('\r'); - assertEquals("", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_UP); - assertEquals("cmd arg2", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_UP); - assertEquals("cmd arg", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_UP); - assertEquals("cmd arg", io.getInput()); - listener.pressedKeyCode(SWT.ARROW_DOWN); - assertEquals("cmd arg2", io.getInput()); - } - -} +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.HistoryTextKeyListenerTest.java + * Created on: Nov 19, 2016 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +import static org.junit.Assert.assertEquals; + +import org.eclipse.swt.SWT; +import org.junit.Test; + +import net.bigeon.gclc.swt.ConsoleDelayIO; +import net.bigeon.gclc.swt.HistoryTextKeyListener; + +/**

+ * TODO + * + * @author Emmanuel Bigeon */ +public class HistoryTextKeyListenerTest { + + /** Test method for + * {@link net.bigeon.gclc.swt.HistoryTextKeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)}. */ + @Test + public final void testKeyPressedKeyEvent() { + ConsoleDelayIO io = new ConsoleDelayIO() { + private String input = ""; + + @Override + public void validateInput() { + input = ""; + } + + @Override + public void setInput(String input) { + this.input = input; + } + + @Override + public String getInput() { + return input; + } + }; + HistoryTextKeyListener listener = new HistoryTextKeyListener(io); + + // no effects + assertEquals("", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_UP); + assertEquals("", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_DOWN); + assertEquals("", io.getInput()); + listener.pressedKeyCode('\r'); + assertEquals("", io.getInput()); + + io.setInput("cmd arg"); + listener.pressedKeyCode(SWT.ARROW_UP); + assertEquals("cmd arg", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_DOWN); + assertEquals("cmd arg", io.getInput()); + listener.pressedKeyCode('\r'); + assertEquals("", io.getInput()); + + io.setInput("cmd arg2"); + listener.pressedKeyCode(SWT.ARROW_UP); + assertEquals("cmd arg", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_DOWN); + assertEquals("", io.getInput()); + io.setInput("cmd arg2"); + listener.pressedKeyCode('\r'); + assertEquals("", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_UP); + assertEquals("cmd arg2", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_UP); + assertEquals("cmd arg", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_UP); + assertEquals("cmd arg", io.getInput()); + listener.pressedKeyCode(SWT.ARROW_DOWN); + assertEquals("cmd arg2", io.getInput()); + } + +} diff --git a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleShellTest.java b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleShellTest.java similarity index 86% rename from gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleShellTest.java rename to gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleShellTest.java index fb7bf46..77a8f03 100644 --- a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleShellTest.java +++ b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleShellTest.java @@ -1,333 +1,368 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.SWTConsoleShellTest.java - * Created on: Jun 8, 2016 - */ -package fr.bigeon.gclc.swt; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.IOException; - -import org.eclipse.swt.widgets.Display; -import org.junit.Test; - -import net.bigeon.gclc.ConsoleApplication; -import net.bigeon.gclc.command.Command; -import net.bigeon.gclc.command.base.ExitCommand; -import net.bigeon.gclc.exception.CommandRunException; -import net.bigeon.gclc.exception.InvalidCommandName; -import net.bigeon.gclc.manager.ConsoleInput; -import net.bigeon.gclc.manager.ConsoleOutput; - -/** - *

- * TODO - * - * @author Emmanuel Bigeon */ -@SuppressWarnings({"javadoc", "static-method", "nls", "deprecation"}) -public class SWTConsoleShellTest { - - protected static final long TWO_SECONDS = 2000; - private static final Display DISPLAY = Display.getDefault(); - - @Test - public void test() { - final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY); - final SWTConsole swtConsole = shell.getManager(); - try { - final ConsoleApplication appl = new ConsoleApplication(swtConsole, - swtConsole, "Hello", "See you"); - appl.add(new ExitCommand("exit", appl)); - appl.add(new Command("long") { - - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. - * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, - * java.lang.String[]) */ - @Override - public void execute(final ConsoleOutput out, - final ConsoleInput in, - final String... args) throws CommandRunException { - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Override - public String tip() { - return "a long running command"; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.Command#usageDetail() */ - @Override - protected String usageDetail() { - // TODO Auto-generated method stub - // return null; - throw new RuntimeException("Not implemented yet"); - } - }); -// shell.pack(); - shell.open(); - final Thread applThread = new Thread(new Runnable() { - - @Override - public void run() { - appl.start(); - } - }); - final Thread testThread = new Thread(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("test"); //$NON-NLS-1$ - swtConsole.validateCommand(); - } - }); - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - shell.dispose(); - } - }); - } - }); - applThread.start(); - testThread.start(); - while (!shell.isDisposed()) { - if (!DISPLAY.readAndDispatch()) { - DISPLAY.sleep(); - } - } -// DISPLAY.dispose(); - assertTrue(swtConsole.isClosed()); - Thread.sleep(TWO_SECONDS); - assertFalse(appl.isRunning()); - } catch (final InvalidCommandName e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Test - public void testConsoleClose() { - final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY); - final SWTConsole swtConsole = shell.getManager(); - swtConsole.close(); - swtConsole.setPrompt(":"); - try { - final ConsoleApplication appl = new ConsoleApplication(swtConsole, - swtConsole, "Hello", "See you"); - appl.add(new ExitCommand("exit", appl)); - appl.add(new Command("long") { - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. - * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, - * java.lang.String[]) */ - @Override - public void execute(final ConsoleOutput out, - final ConsoleInput in, - final String... args) throws CommandRunException { - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Override - public String tip() { - return "a long running command"; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.Command#usageDetail() */ - @Override - protected String usageDetail() { - // TODO Auto-generated method stub - // return null; - throw new RuntimeException("Not implemented yet"); - } - }); - appl.add(new Command("test") { - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. - * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, - * java.lang.String[]) */ - @Override - public void execute(final ConsoleOutput out, - final ConsoleInput in, - final String... args) throws CommandRunException { - try { - swtConsole.prompt("Test"); - } catch (final IOException e) { - throw new CommandRunException("No input", e); - } - } - - @Override - public String tip() { - return "a prompting running command"; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.Command#usageDetail() */ - @Override - protected String usageDetail() { - // TODO Auto-generated method stub - // return null; - throw new RuntimeException("Not implemented yet"); - } - }); -// shell.pack(); - shell.open(); - final Thread applThread = new Thread(new Runnable() { - - @Override - public void run() { - appl.start(); - } - }); - final Thread testThread = new Thread(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("test"); //$NON-NLS-1$ - swtConsole.validateCommand(); - } - }); - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("ok"); //$NON-NLS-1$ - } - }); - swtConsole.validateCommand(); - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("long"); //$NON-NLS-1$ - } - }); - swtConsole.validateCommand(); - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("test"); //$NON-NLS-1$ - } - }); - swtConsole.validateCommand(); - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("test"); //$NON-NLS-1$ - } - }); - swtConsole.validateCommand(); - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - shell.dispose(); - } - }); - - } - }); - applThread.start(); - testThread.start(); - while (!shell.isDisposed()) { - if (!DISPLAY.readAndDispatch()) { - DISPLAY.sleep(); - } - } - swtConsole.setPrompt(">"); - try { - swtConsole.prompt(); - fail("Prompting when closed should fail!"); - } catch (final IOException e) { - assertNotNull(e); - } -// DISPLAY.dispose(); - assertTrue(swtConsole.isClosed()); - Thread.sleep(TWO_SECONDS); - assertFalse(appl.isRunning()); - } catch (final InvalidCommandName e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } -} +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.SWTConsoleShellTest.java + * Created on: Jun 8, 2016 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; + +import org.eclipse.swt.widgets.Display; +import org.junit.Test; + +import net.bigeon.gclc.ConsoleApplication; +import net.bigeon.gclc.command.Command; +import net.bigeon.gclc.command.base.ExitCommand; +import net.bigeon.gclc.exception.CommandRunException; +import net.bigeon.gclc.exception.InvalidCommandName; +import net.bigeon.gclc.manager.ConsoleInput; +import net.bigeon.gclc.manager.ConsoleOutput; +import net.bigeon.gclc.swt.SWTConsole; +import net.bigeon.gclc.swt.SWTConsoleShell; + +/** + *

+ * TODO + * + * @author Emmanuel Bigeon */ +@SuppressWarnings({"javadoc", "static-method", "nls", "deprecation"}) +public class SWTConsoleShellTest { + + protected static final long TWO_SECONDS = 2000; + private static final Display DISPLAY = Display.getDefault(); + + @Test + public void test() { + final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY); + final SWTConsole swtConsole = shell.getManager(); + try { + final ConsoleApplication appl = new ConsoleApplication(swtConsole, + swtConsole, "Hello", "See you"); + appl.add(new ExitCommand("exit", appl)); + appl.add(new Command("long") { + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ + @Override + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Override + public String tip() { + return "a long running command"; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ + @Override + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + }); +// shell.pack(); + shell.open(); + final Thread applThread = new Thread(new Runnable() { + + @Override + public void run() { + appl.start(); + } + }); + final Thread testThread = new Thread(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("test"); //$NON-NLS-1$ + swtConsole.validateCommand(); + } + }); + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + shell.dispose(); + } + }); + } + }); + applThread.start(); + testThread.start(); + while (!shell.isDisposed()) { + if (!DISPLAY.readAndDispatch()) { + DISPLAY.sleep(); + } + } +// DISPLAY.dispose(); + assertTrue(swtConsole.isClosed()); + Thread.sleep(TWO_SECONDS); + assertFalse(appl.isRunning()); + } catch (final InvalidCommandName e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Test + public void testConsoleClose() { + final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY); + final SWTConsole swtConsole = shell.getManager(); + swtConsole.close(); + swtConsole.setPrompt(":"); + try { + final ConsoleApplication appl = new ConsoleApplication(swtConsole, + swtConsole, "Hello", "See you"); + appl.add(new ExitCommand("exit", appl)); + appl.add(new Command("long") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ + @Override + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Override + public String tip() { + return "a long running command"; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ + @Override + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + }); + appl.add(new Command("test") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ + @Override + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { + try { + swtConsole.prompt("Test"); + } catch (final IOException e) { + throw new CommandRunException("No input", e); + } + } + + @Override + public String tip() { + return "a prompting running command"; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ + @Override + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + }); +// shell.pack(); + shell.open(); + final Thread applThread = new Thread(new Runnable() { + + @Override + public void run() { + appl.start(); + } + }); + final Thread testThread = new Thread(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("test"); //$NON-NLS-1$ + swtConsole.validateCommand(); + } + }); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("ok"); //$NON-NLS-1$ + } + }); + swtConsole.validateCommand(); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("long"); //$NON-NLS-1$ + } + }); + swtConsole.validateCommand(); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("test"); //$NON-NLS-1$ + } + }); + swtConsole.validateCommand(); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("test"); //$NON-NLS-1$ + } + }); + swtConsole.validateCommand(); + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + shell.dispose(); + } + }); + + } + }); + applThread.start(); + testThread.start(); + while (!shell.isDisposed()) { + if (!DISPLAY.readAndDispatch()) { + DISPLAY.sleep(); + } + } + swtConsole.setPrompt(">"); + try { + swtConsole.prompt(); + fail("Prompting when closed should fail!"); + } catch (final IOException e) { + assertNotNull(e); + } +// DISPLAY.dispose(); + assertTrue(swtConsole.isClosed()); + Thread.sleep(TWO_SECONDS); + assertFalse(appl.isRunning()); + } catch (final InvalidCommandName e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleViewTest.java b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleViewTest.java similarity index 77% rename from gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleViewTest.java rename to gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleViewTest.java index da9ddbb..414822f 100644 --- a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleViewTest.java +++ b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleViewTest.java @@ -1,169 +1,203 @@ -/* - * GCLC swt, provide a swt window for console applications - * Copyright (C) 2015-2017 E. Bigeon - * mailto:emmanuel@bigeon.fr - * - * 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". - * - * 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. - */ -/** - * gclc-swt:fr.bigeon.gclc.swt.SWTConsoleShellTest.java - * Created on: Jun 8, 2016 - */ -package fr.bigeon.gclc.swt; - -import static org.junit.Assert.assertNull; - -import java.io.IOException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.junit.Test; - -import net.bigeon.gclc.ConsoleApplication; -import net.bigeon.gclc.command.Command; -import net.bigeon.gclc.command.base.ExitCommand; -import net.bigeon.gclc.exception.CommandRunException; -import net.bigeon.gclc.exception.InvalidCommandName; -import net.bigeon.gclc.manager.ConsoleInput; -import net.bigeon.gclc.manager.ConsoleOutput; -import net.bigeon.gclc.utils.PipedConsoleInput; -import net.bigeon.gclc.utils.PipedConsoleOutput; - -/**

- * TODO - * - * @author Emmanuel Bigeon */ -@SuppressWarnings({"javadoc", "static-method", "nls", "deprecation"}) -public class SWTConsoleViewTest { - - protected static final long TWO_SECONDS = 2000; - private static final Display DISPLAY = Display.getDefault(); - - @Test - public void test() { - final Shell shell = new Shell(DISPLAY); - final SWTConsoleView swtConsole = new SWTConsoleView(shell, SWT.NONE); - try (PipedConsoleOutput manager = new PipedConsoleOutput(); - PipedConsoleInput input = new PipedConsoleInput(System.out)) { - swtConsole.setManager(manager, input); - } catch (final IOException e2) { - assertNull(e2); - } - try (PipedConsoleOutput manager = new PipedConsoleOutput(); - PipedConsoleInput input = new PipedConsoleInput(System.out)) { - swtConsole.setManager(manager, input); - final ConsoleApplication appl = new ConsoleApplication(manager, - input, - "Hello", "See you"); - appl.add(new ExitCommand("exit", appl)); - appl.add(new Command("long") { - - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc.manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, java.lang.String[]) - */ - @Override - public void execute(final ConsoleOutput out, final ConsoleInput in, - final String... args) throws CommandRunException { - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Override - public String tip() { - return "a long running command"; - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.Command#usageDetail() */ - @Override - protected String usageDetail() { - // TODO Auto-generated method stub - // return null; - throw new RuntimeException("Not implemented yet"); - } - }); -// shell.pack(); - shell.open(); - final Thread applThread = new Thread(new Runnable() { - - @Override - public void run() { - appl.start(); - } - }); - final Thread testThread = new Thread(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("test"); //$NON-NLS-1$ - swtConsole.validateInput(); - } - }); - try { - Thread.sleep(TWO_SECONDS); - } catch (final InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - shell.dispose(); - } - }); - } - }); - applThread.start(); - testThread.start(); - while (!shell.isDisposed()) { - if (!DISPLAY.readAndDispatch()) { - DISPLAY.sleep(); - } - } - } catch (final InvalidCommandName e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (final IOException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - } -} +/* + * GCLC swt, provide a swt window for console applications + * Copyright (C) 2015-2017 E. Bigeon + * mailto:emmanuel@bigeon.fr + * + * 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". + * + * 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. + */ +/** + * gclc-swt:net.bigeon.gclc.swt.SWTConsoleShellTest.java + * Created on: Jun 8, 2016 + */ +package net.bigeon.gclc.swt; + +/*- + * #%L + * GCLC swt + * %% + * Copyright (C) 2015 - 2018 Bigeon + * %% + * 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". + * + * 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. + * #L% + */ +import static org.junit.Assert.assertNull; + +import java.io.IOException; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.junit.Test; + +import net.bigeon.gclc.ConsoleApplication; +import net.bigeon.gclc.command.Command; +import net.bigeon.gclc.command.base.ExitCommand; +import net.bigeon.gclc.exception.CommandRunException; +import net.bigeon.gclc.exception.InvalidCommandName; +import net.bigeon.gclc.manager.ConsoleInput; +import net.bigeon.gclc.manager.ConsoleOutput; +import net.bigeon.gclc.swt.SWTConsoleView; +import net.bigeon.gclc.utils.PipedConsoleInput; +import net.bigeon.gclc.utils.PipedConsoleOutput; + +/**

+ * TODO + * + * @author Emmanuel Bigeon */ +@SuppressWarnings({"javadoc", "static-method", "nls", "deprecation"}) +public class SWTConsoleViewTest { + + protected static final long TWO_SECONDS = 2000; + private static final Display DISPLAY = Display.getDefault(); + + @Test + public void test() { + final Shell shell = new Shell(DISPLAY); + final SWTConsoleView swtConsole = new SWTConsoleView(shell, SWT.NONE); + try (PipedConsoleOutput manager = new PipedConsoleOutput(); + PipedConsoleInput input = new PipedConsoleInput(System.out)) { + swtConsole.setManager(manager, input); + } catch (final IOException e2) { + assertNull(e2); + } + try (PipedConsoleOutput manager = new PipedConsoleOutput(); + PipedConsoleInput input = new PipedConsoleInput(System.out)) { + swtConsole.setManager(manager, input); + final ConsoleApplication appl = new ConsoleApplication(manager, + input, + "Hello", "See you"); + appl.add(new ExitCommand("exit", appl)); + appl.add(new Command("long") { + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc.manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, java.lang.String[]) + */ + @Override + public void execute(final ConsoleOutput out, final ConsoleInput in, + final String... args) throws CommandRunException { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Override + public String tip() { + return "a long running command"; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ + @Override + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + }); +// shell.pack(); + shell.open(); + final Thread applThread = new Thread(new Runnable() { + + @Override + public void run() { + appl.start(); + } + }); + final Thread testThread = new Thread(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("test"); //$NON-NLS-1$ + swtConsole.validateInput(); + } + }); + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + shell.dispose(); + } + }); + } + }); + applThread.start(); + testThread.start(); + while (!shell.isDisposed()) { + if (!DISPLAY.readAndDispatch()) { + DISPLAY.sleep(); + } + } + } catch (final InvalidCommandName e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (final IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } +}