--- /dev/null
+*.o
+*.sym
+*.coff
+*.exe
+*.ini
+*.bat
--- /dev/null
+/********************************************************************
+* Class: CList.cpp. This is part of WinUI.
+*
+* Purpose: A simple way to create doubly linked lists.
+*
+* Authors: Originally coded by Claude Catonio.
+*
+* License: Original code was public domain.
+* Present revised CList classes are covered by GNU General Public License.
+*
+* Revisions:
+* Manu B. 10/05/01 Terms was translated to English.
+* Manu B. 10/16/01 Add CList::Destroy(CNode *node) method.
+* Manu B. 11/12/01 Add InsertBefore/InsertAfter methods.
+* Manu B. 11/17/01 First() & Last() now returns an integer value.
+* Manu B. 11/19/01 CNode::Destroy() returns next node by default.
+* Manu B. 12/28/01 Simplify CList, add InsertSorted().
+* Manu B. 03/13/02 Suppress CNode methods, next and prev are public.
+* Manu B. 03/28/02 Add Compare().
+*
+********************************************************************/
+#include "CList.h"
+
+/********************************************************************
+* Class: CList.
+*
+* Purpose: List management.
+*
+* Revisions:
+*
+********************************************************************/
+CList::~CList(){
+ //MessageBox (0, "CList", "destructor", MB_OK);
+ while (first != NULL){
+ current = first;
+ first = first->next;
+ delete current;
+ }
+ current = last = first;
+ count = 0;
+}
+
+/********************************************************************
+* Browse the list.
+********************************************************************/
+CNode * CList::First(){
+ current = first;
+return current;
+}
+
+CNode * CList::Last(){
+ current = last;
+return current;
+}
+
+CNode * CList::Prev(){
+ // Empty list ?
+ if (first != NULL){
+ if(current->prev == NULL){
+ // No previous node.
+ return NULL;
+ }else{
+ // A previous one.
+ current = current->prev;
+ return current;
+ }
+ }
+return NULL;
+}
+
+CNode * CList::Next(){
+ // Empty list ?
+ if (first != NULL){
+ if(current->next == NULL){
+ // No next node.
+ return NULL;
+ }else{
+ // A next one.
+ current = current->next;
+ return current;
+ }
+ }
+return NULL;
+}
+
+/********************************************************************
+* Insert nodes.
+********************************************************************/
+void CList::InsertFirst(CNode *node){
+ if(first == NULL){
+ // Empty list.
+ first = last = node;
+ }else{
+ // Set node pointers.
+ node->prev = NULL;
+ node->next = first;
+ // Insert in the list.
+ first->prev = node;
+ first = node;
+ }
+ // Set current node, increment the node counter.
+ current = node;
+ count++;
+}
+
+void CList::InsertLast(CNode *node){
+ if(first == NULL){
+ // Empty list.
+ first = last = node;
+ }else{
+ // Set node pointers.
+ node->prev = last;
+ node->next = NULL;
+ // Insert in the list.
+ last->next = node;
+ last = node;
+ }
+ // Set current node, increment the node counter.
+ current = node;
+ count++;
+}
+
+void CList::InsertBefore(CNode *node){
+ if(first == NULL){
+ // Empty list.
+ first = last = node;
+ }else{
+ if (current == first)
+ first = node;
+ // Set node pointers.
+ node->prev = current->prev;
+ node->next = current;
+ // Insert in the list.
+ if (node->prev)
+ node->prev->next = node;
+ current->prev = node;
+ }
+ // Set current node, increment the node counter.
+ current = node;
+ count++;
+}
+
+void CList::InsertAfter(CNode *node){
+ if(first == NULL){
+ // Empty list.
+ first = last = node;
+ }else{
+ if (current == last)
+ last = node;
+ // Set node pointers.
+ node->prev = current;
+ node->next = current->next;
+ // Insert in the list.
+ if (node->next)
+ node->next->prev = node;
+ current->next = node;
+ }
+ // Set current node, increment the node counter.
+ current = node;
+ count++;
+}
+
+bool CList::InsertSorted(CNode * newNode){
+ // Get the current node.
+ CNode * currentNode = GetCurrent();
+ int cmpResult;
+
+ if(!currentNode){
+ // The list is empty, InsertFirst() and return.
+ InsertFirst(newNode);
+ return true;
+ }
+
+ // Compare new node and current node data to know if we must parse Up
+ // or Down from current node.
+ cmpResult = Compare(newNode, currentNode);
+
+ // Search Up -----------------------------------------------------------------
+ if (cmpResult == -1){
+ // Parse the list while there's a previous node.
+ while (Prev()){
+ currentNode = GetCurrent();
+ cmpResult = Compare(newNode, currentNode);
+
+ if (cmpResult == 1){
+ // Correct position found.
+ InsertAfter(newNode);
+ return true;
+ }else if (cmpResult == 0){
+ // Don't add a file twice.
+ return false;
+ }
+ }
+ // There's no previous node, so insert first.
+ InsertFirst(newNode);
+ return true;
+ }
+ // Search Down --------------------------------------------------------------
+ else if (cmpResult == 1){
+ // Parse the list while there's a next node.
+ while (Next()){
+ currentNode = GetCurrent();
+ cmpResult = Compare(newNode, currentNode);
+
+ if (cmpResult == -1){
+ // Correct position found.
+ InsertBefore(newNode);
+ return true;
+ }else if (cmpResult == 0){
+ // Don't add a file twice.
+ return false;
+ }
+ }
+ // There's no next node, so insert last.
+ InsertLast(newNode);
+ return true;
+ }
+ // Don't add a file twice (cmpResult == 0) -------------------------------------
+return false;
+}
+
+
+int CList::InsertSorted_New(CNode * newNode){
+ int cmpResult;
+
+ /* Get the current node */
+ CNode * currentNode = GetCurrent();
+ if(!currentNode)
+ return EMPTY_LIST;
+
+ /* Parse up or down ? */
+ cmpResult = Compare(newNode, currentNode);
+
+ /* -Up- */
+ if (cmpResult == -1){
+ // Parse the list while there's a previous node.
+ while (Prev()){
+ currentNode = GetCurrent();
+ cmpResult = Compare(newNode, currentNode);
+
+ if (cmpResult == 1){
+ // Correct position found.
+ return INSERT_AFTER;
+ }else if (cmpResult == 0){
+ // Don't add a file twice.
+ return FILE_FOUND;
+ }
+ }
+ // There's no previous node, so insert first.
+ return INSERT_FIRST;
+
+ /* -Down- */
+ }else if (cmpResult == 1){
+ // Parse the list while there's a next node.
+ while (Next()){
+ currentNode = GetCurrent();
+ cmpResult = Compare(newNode, currentNode);
+
+ if (cmpResult == -1){
+ // Correct position found.
+ return INSERT_BEFORE;
+ }else if (cmpResult == 0){
+ // Don't add a file twice.
+ return FILE_FOUND;
+ }
+ }
+ // There's no next node, so insert last.
+ return INSERT_LAST;
+ }
+ // Don't add a file twice (cmpResult == 0) -------------------------------------
+return FILE_FOUND;
+}
+
+
+/********************************************************************
+* Destroy nodes.
+********************************************************************/
+void CList::DestroyCurrent(){
+// CNode * node = current;
+ Destroy(current);
+}
+
+void CList::Destroy(CNode * node){
+ // Empty list ?
+ if (current != NULL){
+ // Detach node from the list.
+ if (node->next != NULL)
+ node->next->prev = node->prev;
+ if (node->prev != NULL)
+ node->prev->next = node->next;
+
+ // Set current node.
+ if(node->next != NULL)
+ current = node->next;
+ else
+ current = node->prev;
+
+ if (current == NULL){
+ // Now, the list is empty.
+ first = last = NULL;
+
+ }else if (first == node){
+ // Detached node was first.
+ first = current;
+
+ }else if (last == node){
+ // Detached node was last.
+ last = current;
+ }
+ delete node;
+ count--;
+ }
+}
+
+void CList::DestroyList(){
+ while (first != NULL){
+ current = first;
+ first = first->next;
+ delete current;
+ }
+ current = last = first;
+ count = 0;
+}
+
+int CList::Length(){
+return count;
+}
+
--- /dev/null
+/********************************************************************
+* Module: CList.h. This is part of WinUI.
+*
+* License: WinUI is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+********************************************************************/
+#ifndef CLIST_H
+#define CLIST_H
+
+#include <stdlib.h>
+
+/********************************************************************
+* Generic CNode.
+********************************************************************/
+class CNode
+{
+ public:
+ CNode() {next = prev = NULL; /*type = 0;*/};
+ virtual ~CNode() {};
+
+ CNode * prev;
+ CNode * next;
+ long type;
+
+ protected:
+
+ private:
+};
+
+/********************************************************************
+* Generic List.
+********************************************************************/
+#define FILE_FOUND 0
+#define EMPTY_LIST 1
+#define INSERT_FIRST 2
+#define INSERT_LAST 3
+#define INSERT_BEFORE 4
+#define INSERT_AFTER 5
+
+class CList
+{
+ public:
+ CList() {first = last = current = NULL; count = 0;};
+ virtual ~CList();
+
+ CNode * GetCurrent() {return current;};
+ CNode * First();
+ CNode * Last();
+ CNode * Prev();
+ CNode * Next();
+
+ void InsertFirst(CNode *node);
+ void InsertLast(CNode *node);
+ void InsertBefore(CNode *node);
+ void InsertAfter(CNode *node);
+ bool InsertSorted(CNode * newNode);
+ int InsertSorted_New(CNode * newNode);
+
+ void DestroyCurrent();
+ void Destroy(CNode * node);
+ void DestroyList();
+
+ int Length();
+
+ protected:
+ virtual int Compare(CNode *, CNode *) {return 0;};
+
+ CNode *first;
+ CNode *last;
+ CNode *current;
+ int count;
+
+ private:
+};
+
+#endif
+
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+# $Id: Makefile.ros,v 1.1 2003/01/07 17:59:20 robd Exp $
+#
+
+PATH_TO_TOP = ../../../reactos
+
+TARGET_TYPE = program
+
+TARGET_APPTYPE = console
+
+TARGET_NAME = vmingw
+
+TARGET_CFLAGS = -D_WIN32_IE=0x0400
+
+TARGET_SDKLIBS = user32.a comctl32.a ole32.a
+
+TARGET_OBJECTS = \
+ CList.o\
+ editor.o\
+ main.o\
+ process.o\
+ project.o\
+ rsrc.o\
+ winui.o
+
+include $(PATH_TO_TOP)/rules.mak
+
+include $(TOOLS_PATH)/helper.mk
+
+# EOF
--- /dev/null
+// Scintilla source code edit control
+/** @file SciLexer.h
+ ** Interface to the added lexer functions in the SciLexer version of the edit control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+// Most of this file is automatically generated from the Scintilla.iface interface definition
+// file which contains any comments about the definitions. HFacer.py does the generation.
+
+#ifndef SCILEXER_H
+#define SCILEXER_H
+
+// SciLexer features - not in standard Scintilla
+
+//++Autogenerated -- start of section automatically generated from Scintilla.iface
+#define SCLEX_CONTAINER 0
+#define SCLEX_NULL 1
+#define SCLEX_PYTHON 2
+#define SCLEX_CPP 3
+#define SCLEX_HTML 4
+#define SCLEX_XML 5
+#define SCLEX_PERL 6
+#define SCLEX_SQL 7
+#define SCLEX_VB 8
+#define SCLEX_PROPERTIES 9
+#define SCLEX_ERRORLIST 10
+#define SCLEX_MAKEFILE 11
+#define SCLEX_BATCH 12
+#define SCLEX_XCODE 13
+#define SCLEX_LATEX 14
+#define SCLEX_LUA 15
+#define SCLEX_DIFF 16
+#define SCLEX_CONF 17
+#define SCLEX_PASCAL 18
+#define SCLEX_AVE 19
+#define SCLEX_ADA 20
+#define SCLEX_LISP 21
+#define SCLEX_RUBY 22
+#define SCLEX_EIFFEL 23
+#define SCLEX_EIFFELKW 24
+#define SCLEX_TCL 25
+#define SCLEX_AUTOMATIC 1000
+#define SCE_P_DEFAULT 0
+#define SCE_P_COMMENTLINE 1
+#define SCE_P_NUMBER 2
+#define SCE_P_STRING 3
+#define SCE_P_CHARACTER 4
+#define SCE_P_WORD 5
+#define SCE_P_TRIPLE 6
+#define SCE_P_TRIPLEDOUBLE 7
+#define SCE_P_CLASSNAME 8
+#define SCE_P_DEFNAME 9
+#define SCE_P_OPERATOR 10
+#define SCE_P_IDENTIFIER 11
+#define SCE_P_COMMENTBLOCK 12
+#define SCE_P_STRINGEOL 13
+#define SCE_C_DEFAULT 0
+#define SCE_C_COMMENT 1
+#define SCE_C_COMMENTLINE 2
+#define SCE_C_COMMENTDOC 3
+#define SCE_C_NUMBER 4
+#define SCE_C_WORD 5
+#define SCE_C_STRING 6
+#define SCE_C_CHARACTER 7
+#define SCE_C_UUID 8
+#define SCE_C_PREPROCESSOR 9
+#define SCE_C_OPERATOR 10
+#define SCE_C_IDENTIFIER 11
+#define SCE_C_STRINGEOL 12
+#define SCE_C_VERBATIM 13
+#define SCE_C_REGEX 14
+#define SCE_C_COMMENTLINEDOC 15
+#define SCE_C_WORD2 16
+#define SCE_H_DEFAULT 0
+#define SCE_H_TAG 1
+#define SCE_H_TAGUNKNOWN 2
+#define SCE_H_ATTRIBUTE 3
+#define SCE_H_ATTRIBUTEUNKNOWN 4
+#define SCE_H_NUMBER 5
+#define SCE_H_DOUBLESTRING 6
+#define SCE_H_SINGLESTRING 7
+#define SCE_H_OTHER 8
+#define SCE_H_COMMENT 9
+#define SCE_H_ENTITY 10
+#define SCE_H_TAGEND 11
+#define SCE_H_XMLSTART 12
+#define SCE_H_XMLEND 13
+#define SCE_H_SCRIPT 14
+#define SCE_H_ASP 15
+#define SCE_H_ASPAT 16
+#define SCE_H_CDATA 17
+#define SCE_H_QUESTION 18
+#define SCE_H_VALUE 19
+#define SCE_H_XCCOMMENT 20
+#define SCE_H_SGML 21
+#define SCE_HJ_START 40
+#define SCE_HJ_DEFAULT 41
+#define SCE_HJ_COMMENT 42
+#define SCE_HJ_COMMENTLINE 43
+#define SCE_HJ_COMMENTDOC 44
+#define SCE_HJ_NUMBER 45
+#define SCE_HJ_WORD 46
+#define SCE_HJ_KEYWORD 47
+#define SCE_HJ_DOUBLESTRING 48
+#define SCE_HJ_SINGLESTRING 49
+#define SCE_HJ_SYMBOLS 50
+#define SCE_HJ_STRINGEOL 51
+#define SCE_HJ_REGEX 52
+#define SCE_HJA_START 55
+#define SCE_HJA_DEFAULT 56
+#define SCE_HJA_COMMENT 57
+#define SCE_HJA_COMMENTLINE 58
+#define SCE_HJA_COMMENTDOC 59
+#define SCE_HJA_NUMBER 60
+#define SCE_HJA_WORD 61
+#define SCE_HJA_KEYWORD 62
+#define SCE_HJA_DOUBLESTRING 63
+#define SCE_HJA_SINGLESTRING 64
+#define SCE_HJA_SYMBOLS 65
+#define SCE_HJA_STRINGEOL 66
+#define SCE_HJA_REGEX 67
+#define SCE_HB_START 70
+#define SCE_HB_DEFAULT 71
+#define SCE_HB_COMMENTLINE 72
+#define SCE_HB_NUMBER 73
+#define SCE_HB_WORD 74
+#define SCE_HB_STRING 75
+#define SCE_HB_IDENTIFIER 76
+#define SCE_HB_STRINGEOL 77
+#define SCE_HBA_START 80
+#define SCE_HBA_DEFAULT 81
+#define SCE_HBA_COMMENTLINE 82
+#define SCE_HBA_NUMBER 83
+#define SCE_HBA_WORD 84
+#define SCE_HBA_STRING 85
+#define SCE_HBA_IDENTIFIER 86
+#define SCE_HBA_STRINGEOL 87
+#define SCE_HP_START 90
+#define SCE_HP_DEFAULT 91
+#define SCE_HP_COMMENTLINE 92
+#define SCE_HP_NUMBER 93
+#define SCE_HP_STRING 94
+#define SCE_HP_CHARACTER 95
+#define SCE_HP_WORD 96
+#define SCE_HP_TRIPLE 97
+#define SCE_HP_TRIPLEDOUBLE 98
+#define SCE_HP_CLASSNAME 99
+#define SCE_HP_DEFNAME 100
+#define SCE_HP_OPERATOR 101
+#define SCE_HP_IDENTIFIER 102
+#define SCE_HPA_START 105
+#define SCE_HPA_DEFAULT 106
+#define SCE_HPA_COMMENTLINE 107
+#define SCE_HPA_NUMBER 108
+#define SCE_HPA_STRING 109
+#define SCE_HPA_CHARACTER 110
+#define SCE_HPA_WORD 111
+#define SCE_HPA_TRIPLE 112
+#define SCE_HPA_TRIPLEDOUBLE 113
+#define SCE_HPA_CLASSNAME 114
+#define SCE_HPA_DEFNAME 115
+#define SCE_HPA_OPERATOR 116
+#define SCE_HPA_IDENTIFIER 117
+#define SCE_HPHP_DEFAULT 118
+#define SCE_HPHP_HSTRING 119
+#define SCE_HPHP_SIMPLESTRING 120
+#define SCE_HPHP_WORD 121
+#define SCE_HPHP_NUMBER 122
+#define SCE_HPHP_VARIABLE 123
+#define SCE_HPHP_COMMENT 124
+#define SCE_HPHP_COMMENTLINE 125
+#define SCE_HPHP_HSTRING_VARIABLE 126
+#define SCE_HPHP_OPERATOR 127
+#define SCE_PL_DEFAULT 0
+#define SCE_PL_ERROR 1
+#define SCE_PL_COMMENTLINE 2
+#define SCE_PL_POD 3
+#define SCE_PL_NUMBER 4
+#define SCE_PL_WORD 5
+#define SCE_PL_STRING 6
+#define SCE_PL_CHARACTER 7
+#define SCE_PL_PUNCTUATION 8
+#define SCE_PL_PREPROCESSOR 9
+#define SCE_PL_OPERATOR 10
+#define SCE_PL_IDENTIFIER 11
+#define SCE_PL_SCALAR 12
+#define SCE_PL_ARRAY 13
+#define SCE_PL_HASH 14
+#define SCE_PL_SYMBOLTABLE 15
+#define SCE_PL_REGEX 17
+#define SCE_PL_REGSUBST 18
+#define SCE_PL_LONGQUOTE 19
+#define SCE_PL_BACKTICKS 20
+#define SCE_PL_DATASECTION 21
+#define SCE_PL_HERE_DELIM 22
+#define SCE_PL_HERE_Q 23
+#define SCE_PL_HERE_QQ 24
+#define SCE_PL_HERE_QX 25
+#define SCE_PL_STRING_Q 26
+#define SCE_PL_STRING_QQ 27
+#define SCE_PL_STRING_QX 28
+#define SCE_PL_STRING_QR 29
+#define SCE_PL_STRING_QW 30
+#define SCE_L_DEFAULT 0
+#define SCE_L_COMMAND 1
+#define SCE_L_TAG 2
+#define SCE_L_MATH 3
+#define SCE_L_COMMENT 4
+#define SCE_LUA_DEFAULT 0
+#define SCE_LUA_COMMENT 1
+#define SCE_LUA_COMMENTLINE 2
+#define SCE_LUA_COMMENTDOC 3
+#define SCE_LUA_NUMBER 4
+#define SCE_LUA_WORD 5
+#define SCE_LUA_STRING 6
+#define SCE_LUA_CHARACTER 7
+#define SCE_LUA_LITERALSTRING 8
+#define SCE_LUA_PREPROCESSOR 9
+#define SCE_LUA_OPERATOR 10
+#define SCE_LUA_IDENTIFIER 11
+#define SCE_LUA_STRINGEOL 12
+#define SCE_ERR_DEFAULT 0
+#define SCE_ERR_PYTHON 1
+#define SCE_ERR_GCC 2
+#define SCE_ERR_MS 3
+#define SCE_ERR_CMD 4
+#define SCE_ERR_BORLAND 5
+#define SCE_ERR_PERL 6
+#define SCE_ERR_NET 7
+#define SCE_ERR_LUA 8
+#define SCE_ERR_DIFF_CHANGED 10
+#define SCE_ERR_DIFF_ADDITION 11
+#define SCE_ERR_DIFF_DELETION 12
+#define SCE_ERR_DIFF_MESSAGE 13
+#define SCE_BAT_DEFAULT 0
+#define SCE_BAT_COMMENT 1
+#define SCE_BAT_WORD 2
+#define SCE_BAT_LABEL 3
+#define SCE_BAT_HIDE 4
+#define SCE_BAT_COMMAND 5
+#define SCE_BAT_IDENTIFIER 6
+#define SCE_BAT_OPERATOR 7
+#define SCE_MAKE_DEFAULT 0
+#define SCE_MAKE_COMMENT 1
+#define SCE_MAKE_PREPROCESSOR 2
+#define SCE_MAKE_IDENTIFIER 3
+#define SCE_MAKE_OPERATOR 4
+#define SCE_MAKE_TARGET 5
+#define SCE_MAKE_IDEOL 9
+#define SCE_CONF_DEFAULT 0
+#define SCE_CONF_COMMENT 1
+#define SCE_CONF_NUMBER 2
+#define SCE_CONF_IDENTIFIER 3
+#define SCE_CONF_EXTENSION 4
+#define SCE_CONF_PARAMETER 5
+#define SCE_CONF_STRING 6
+#define SCE_CONF_OPERATOR 7
+#define SCE_CONF_IP 8
+#define SCE_CONF_DIRECTIVE 9
+#define SCE_AVE_DEFAULT 0
+#define SCE_AVE_COMMENT 1
+#define SCE_AVE_NUMBER 2
+#define SCE_AVE_WORD 3
+#define SCE_AVE_KEYWORD 4
+#define SCE_AVE_STATEMENT 5
+#define SCE_AVE_STRING 6
+#define SCE_AVE_ENUM 7
+#define SCE_AVE_STRINGEOL 8
+#define SCE_AVE_IDENTIFIER 9
+#define SCE_AVE_OPERATOR 10
+#define SCE_ADA_DEFAULT 0
+#define SCE_ADA_COMMENT 1
+#define SCE_ADA_NUMBER 2
+#define SCE_ADA_WORD 3
+#define SCE_ADA_STRING 4
+#define SCE_ADA_CHARACTER 5
+#define SCE_ADA_OPERATOR 6
+#define SCE_ADA_IDENTIFIER 7
+#define SCE_ADA_STRINGEOL 8
+#define SCE_LISP_DEFAULT 0
+#define SCE_LISP_COMMENT 1
+#define SCE_LISP_NUMBER 2
+#define SCE_LISP_KEYWORD 3
+#define SCE_LISP_STRING 6
+#define SCE_LISP_STRINGEOL 8
+#define SCE_LISP_IDENTIFIER 9
+#define SCE_LISP_OPERATOR 10
+#define SCE_EIFFEL_DEFAULT 0
+#define SCE_EIFFEL_COMMENTLINE 1
+#define SCE_EIFFEL_NUMBER 2
+#define SCE_EIFFEL_WORD 3
+#define SCE_EIFFEL_STRING 4
+#define SCE_EIFFEL_CHARACTER 5
+#define SCE_EIFFEL_OPERATOR 6
+#define SCE_EIFFEL_IDENTIFIER 7
+#define SCE_EIFFEL_STRINGEOL 8
+//--Autogenerated -- end of section automatically generated from Scintilla.iface
+
+#endif
--- /dev/null
+// Scintilla source code edit control
+/** @file Scintilla.h
+ ** Interface to the edit control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+// Most of this file is automatically generated from the Scintilla.iface interface definition
+// file which contains any comments about the definitions. HFacer.py does the generation.
+
+#ifndef SCINTILLA_H
+#define SCINTILLA_H
+
+// Compile-time configuration options
+#define MACRO_SUPPORT 1 // Comment out to remove macro hooks
+
+#if PLAT_WIN
+#ifdef STATIC_BUILD
+void Scintilla_RegisterClasses(HINSTANCE hInstance);
+#endif
+#endif
+
+// Here should be placed typedefs for uptr_t, an unsigned integer type large enough to
+// hold a pointer and sptr_t, a signed integer large enough to hold a pointer.
+// May need to be changed for 64 bit platforms.
+typedef unsigned long uptr_t;
+typedef long sptr_t;
+
+typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam);
+
+//++Autogenerated -- start of section automatically generated from Scintilla.iface
+#define INVALID_POSITION -1
+#define SCI_START 2000
+#define SCI_OPTIONAL_START 3000
+#define SCI_LEXER_START 4000
+#define SCI_ADDTEXT 2001
+#define SCI_ADDSTYLEDTEXT 2002
+#define SCI_INSERTTEXT 2003
+#define SCI_CLEARALL 2004
+#define SCI_CLEARDOCUMENTSTYLE 2005
+#define SCI_GETLENGTH 2006
+#define SCI_GETCHARAT 2007
+#define SCI_GETCURRENTPOS 2008
+#define SCI_GETANCHOR 2009
+#define SCI_GETSTYLEAT 2010
+#define SCI_REDO 2011
+#define SCI_SETUNDOCOLLECTION 2012
+#define SCI_SELECTALL 2013
+#define SCI_SETSAVEPOINT 2014
+#define SCI_GETSTYLEDTEXT 2015
+#define SCI_CANREDO 2016
+#define SCI_MARKERLINEFROMHANDLE 2017
+#define SCI_MARKERDELETEHANDLE 2018
+#define SCI_GETUNDOCOLLECTION 2019
+#define SCWS_INVISIBLE 0
+#define SCWS_VISIBLEALWAYS 1
+#define SCWS_VISIBLEAFTERINDENT 2
+#define SCI_GETVIEWWS 2020
+#define SCI_SETVIEWWS 2021
+#define SCI_POSITIONFROMPOINT 2022
+#define SCI_POSITIONFROMPOINTCLOSE 2023
+#define SCI_GOTOLINE 2024
+#define SCI_GOTOPOS 2025
+#define SCI_SETANCHOR 2026
+#define SCI_GETCURLINE 2027
+#define SCI_GETENDSTYLED 2028
+#define SC_EOL_CRLF 0
+#define SC_EOL_CR 1
+#define SC_EOL_LF 2
+#define SCI_CONVERTEOLS 2029
+#define SCI_GETEOLMODE 2030
+#define SCI_SETEOLMODE 2031
+#define SCI_STARTSTYLING 2032
+#define SCI_SETSTYLING 2033
+#define SCI_GETBUFFEREDDRAW 2034
+#define SCI_SETBUFFEREDDRAW 2035
+#define SCI_SETTABWIDTH 2036
+#define SCI_GETTABWIDTH 2121
+#define SC_CP_UTF8 65001
+#define SCI_SETCODEPAGE 2037
+#define SCI_SETUSEPALETTE 2039
+#define MARKER_MAX 31
+#define SC_MARK_CIRCLE 0
+#define SC_MARK_ROUNDRECT 1
+#define SC_MARK_ARROW 2
+#define SC_MARK_SMALLRECT 3
+#define SC_MARK_SHORTARROW 4
+#define SC_MARK_EMPTY 5
+#define SC_MARK_ARROWDOWN 6
+#define SC_MARK_MINUS 7
+#define SC_MARK_PLUS 8
+#define SC_MARK_VLINE 9
+#define SC_MARK_LCORNER 10
+#define SC_MARK_TCORNER 11
+#define SC_MARK_BOXPLUS 12
+#define SC_MARK_BOXPLUSCONNECTED 13
+#define SC_MARK_BOXMINUS 14
+#define SC_MARK_BOXMINUSCONNECTED 15
+#define SC_MARK_LCORNERCURVE 16
+#define SC_MARK_TCORNERCURVE 17
+#define SC_MARK_CIRCLEPLUS 18
+#define SC_MARK_CIRCLEPLUSCONNECTED 19
+#define SC_MARK_CIRCLEMINUS 20
+#define SC_MARK_CIRCLEMINUSCONNECTED 21
+#define SC_MARKNUM_FOLDEREND 25
+#define SC_MARKNUM_FOLDEROPENMID 26
+#define SC_MARKNUM_FOLDERMIDTAIL 27
+#define SC_MARKNUM_FOLDERTAIL 28
+#define SC_MARKNUM_FOLDERSUB 29
+#define SC_MARKNUM_FOLDER 30
+#define SC_MARKNUM_FOLDEROPEN 31
+#define SCI_MARKERDEFINE 2040
+#define SCI_MARKERSETFORE 2041
+#define SCI_MARKERSETBACK 2042
+#define SCI_MARKERADD 2043
+#define SCI_MARKERDELETE 2044
+#define SCI_MARKERDELETEALL 2045
+#define SCI_MARKERGET 2046
+#define SCI_MARKERNEXT 2047
+#define SCI_MARKERPREVIOUS 2048
+#define SC_MARGIN_SYMBOL 0
+#define SC_MARGIN_NUMBER 1
+#define SCI_SETMARGINTYPEN 2240
+#define SCI_GETMARGINTYPEN 2241
+#define SCI_SETMARGINWIDTHN 2242
+#define SCI_GETMARGINWIDTHN 2243
+#define SCI_SETMARGINMASKN 2244
+#define SCI_GETMARGINMASKN 2245
+#define SCI_SETMARGINSENSITIVEN 2246
+#define SCI_GETMARGINSENSITIVEN 2247
+#define STYLE_DEFAULT 32
+#define STYLE_LINENUMBER 33
+#define STYLE_BRACELIGHT 34
+#define STYLE_BRACEBAD 35
+#define STYLE_CONTROLCHAR 36
+#define STYLE_INDENTGUIDE 37
+#define STYLE_MAX 127
+#define SC_CHARSET_ANSI 0
+#define SC_CHARSET_DEFAULT 1
+#define SC_CHARSET_BALTIC 186
+#define SC_CHARSET_CHINESEBIG5 136
+#define SC_CHARSET_EASTEUROPE 238
+#define SC_CHARSET_GB2312 134
+#define SC_CHARSET_GREEK 161
+#define SC_CHARSET_HANGUL 129
+#define SC_CHARSET_MAC 77
+#define SC_CHARSET_OEM 255
+#define SC_CHARSET_RUSSIAN 204
+#define SC_CHARSET_SHIFTJIS 128
+#define SC_CHARSET_SYMBOL 2
+#define SC_CHARSET_TURKISH 162
+#define SC_CHARSET_JOHAB 130
+#define SC_CHARSET_HEBREW 177
+#define SC_CHARSET_ARABIC 178
+#define SC_CHARSET_VIETNAMESE 163
+#define SC_CHARSET_THAI 222
+#define SCI_STYLECLEARALL 2050
+#define SCI_STYLESETFORE 2051
+#define SCI_STYLESETBACK 2052
+#define SCI_STYLESETBOLD 2053
+#define SCI_STYLESETITALIC 2054
+#define SCI_STYLESETSIZE 2055
+#define SCI_STYLESETFONT 2056
+#define SCI_STYLESETEOLFILLED 2057
+#define SCI_STYLERESETDEFAULT 2058
+#define SCI_STYLESETUNDERLINE 2059
+#define SC_CASE_MIXED 0
+#define SC_CASE_UPPER 1
+#define SC_CASE_LOWER 2
+#define SCI_STYLESETCASE 2060
+#define SCI_STYLESETCHARACTERSET 2066
+#define SCI_SETSELFORE 2067
+#define SCI_SETSELBACK 2068
+#define SCI_SETCARETFORE 2069
+#define SCI_ASSIGNCMDKEY 2070
+#define SCI_CLEARCMDKEY 2071
+#define SCI_CLEARALLCMDKEYS 2072
+#define SCI_SETSTYLINGEX 2073
+#define SCI_STYLESETVISIBLE 2074
+#define SCI_GETCARETPERIOD 2075
+#define SCI_SETCARETPERIOD 2076
+#define SCI_SETWORDCHARS 2077
+#define SCI_BEGINUNDOACTION 2078
+#define SCI_ENDUNDOACTION 2079
+#define INDIC_MAX 7
+#define INDIC_PLAIN 0
+#define INDIC_SQUIGGLE 1
+#define INDIC_TT 2
+#define INDIC_DIAGONAL 3
+#define INDIC_STRIKE 4
+#define INDIC0_MASK 32
+#define INDIC1_MASK 64
+#define INDIC2_MASK 128
+#define INDICS_MASK INDIC0_MASK | INDIC1_MASK | INDIC2_MASK
+#define SCI_INDICSETSTYLE 2080
+#define SCI_INDICGETSTYLE 2081
+#define SCI_INDICSETFORE 2082
+#define SCI_INDICGETFORE 2083
+#define SCI_SETSTYLEBITS 2090
+#define SCI_GETSTYLEBITS 2091
+#define SCI_SETLINESTATE 2092
+#define SCI_GETLINESTATE 2093
+#define SCI_GETMAXLINESTATE 2094
+#define SCI_GETCARETLINEVISIBLE 2095
+#define SCI_SETCARETLINEVISIBLE 2096
+#define SCI_GETCARETLINEBACK 2097
+#define SCI_SETCARETLINEBACK 2098
+#define SCI_AUTOCSHOW 2100
+#define SCI_AUTOCCANCEL 2101
+#define SCI_AUTOCACTIVE 2102
+#define SCI_AUTOCPOSSTART 2103
+#define SCI_AUTOCCOMPLETE 2104
+#define SCI_AUTOCSTOPS 2105
+#define SCI_AUTOCSETSEPARATOR 2106
+#define SCI_AUTOCGETSEPARATOR 2107
+#define SCI_AUTOCSELECT 2108
+#define SCI_AUTOCSETCANCELATSTART 2110
+#define SCI_AUTOCGETCANCELATSTART 2111
+#define SCI_AUTOCSETFILLUPS 2112
+#define SCI_AUTOCSETCHOOSESINGLE 2113
+#define SCI_AUTOCGETCHOOSESINGLE 2114
+#define SCI_AUTOCSETIGNORECASE 2115
+#define SCI_AUTOCGETIGNORECASE 2116
+#define SCI_USERLISTSHOW 2117
+#define SCI_AUTOCSETAUTOHIDE 2118
+#define SCI_AUTOCGETAUTOHIDE 2119
+#define SCI_SETINDENT 2122
+#define SCI_GETINDENT 2123
+#define SCI_SETUSETABS 2124
+#define SCI_GETUSETABS 2125
+#define SCI_SETLINEINDENTATION 2126
+#define SCI_GETLINEINDENTATION 2127
+#define SCI_GETLINEINDENTPOSITION 2128
+#define SCI_GETCOLUMN 2129
+#define SCI_SETHSCROLLBAR 2130
+#define SCI_GETHSCROLLBAR 2131
+#define SCI_SETINDENTATIONGUIDES 2132
+#define SCI_GETINDENTATIONGUIDES 2133
+#define SCI_SETHIGHLIGHTGUIDE 2134
+#define SCI_GETHIGHLIGHTGUIDE 2135
+#define SCI_GETLINEENDPOSITION 2136
+#define SCI_GETCODEPAGE 2137
+#define SCI_GETCARETFORE 2138
+#define SCI_GETUSEPALETTE 2139
+#define SCI_GETREADONLY 2140
+#define SCI_SETCURRENTPOS 2141
+#define SCI_SETSELECTIONSTART 2142
+#define SCI_GETSELECTIONSTART 2143
+#define SCI_SETSELECTIONEND 2144
+#define SCI_GETSELECTIONEND 2145
+#define SCI_SETPRINTMAGNIFICATION 2146
+#define SCI_GETPRINTMAGNIFICATION 2147
+#define SC_PRINT_NORMAL 0
+#define SC_PRINT_INVERTLIGHT 1
+#define SC_PRINT_BLACKONWHITE 2
+#define SC_PRINT_COLOURONWHITE 3
+#define SC_PRINT_COLOURONWHITEDEFAULTBG 4
+#define SCI_SETPRINTCOLOURMODE 2148
+#define SCI_GETPRINTCOLOURMODE 2149
+#define SCFIND_WHOLEWORD 2
+#define SCFIND_MATCHCASE 4
+#define SCFIND_WORDSTART 0x00100000
+#define SCFIND_REGEXP 0x00200000
+#define SCI_FINDTEXT 2150
+#define SCI_FORMATRANGE 2151
+#define SCI_GETFIRSTVISIBLELINE 2152
+#define SCI_GETLINE 2153
+#define SCI_GETLINECOUNT 2154
+#define SCI_SETMARGINLEFT 2155
+#define SCI_GETMARGINLEFT 2156
+#define SCI_SETMARGINRIGHT 2157
+#define SCI_GETMARGINRIGHT 2158
+#define SCI_GETMODIFY 2159
+#define SCI_SETSEL 2160
+#define SCI_GETSELTEXT 2161
+#define SCI_GETTEXTRANGE 2162
+#define SCI_HIDESELECTION 2163
+#define SCI_POINTXFROMPOSITION 2164
+#define SCI_POINTYFROMPOSITION 2165
+#define SCI_LINEFROMPOSITION 2166
+#define SCI_POSITIONFROMLINE 2167
+#define SCI_LINESCROLL 2168
+#define SCI_SCROLLCARET 2169
+#define SCI_REPLACESEL 2170
+#define SCI_SETREADONLY 2171
+#define SCI_NULL 2172
+#define SCI_CANPASTE 2173
+#define SCI_CANUNDO 2174
+#define SCI_EMPTYUNDOBUFFER 2175
+#define SCI_UNDO 2176
+#define SCI_CUT 2177
+#define SCI_COPY 2178
+#define SCI_PASTE 2179
+#define SCI_CLEAR 2180
+#define SCI_SETTEXT 2181
+#define SCI_GETTEXT 2182
+#define SCI_GETTEXTLENGTH 2183
+#define SCI_GETDIRECTFUNCTION 2184
+#define SCI_GETDIRECTPOINTER 2185
+#define SCI_SETOVERTYPE 2186
+#define SCI_GETOVERTYPE 2187
+#define SCI_SETCARETWIDTH 2188
+#define SCI_GETCARETWIDTH 2189
+#define SCI_SETTARGETSTART 2190
+#define SCI_GETTARGETSTART 2191
+#define SCI_SETTARGETEND 2192
+#define SCI_GETTARGETEND 2193
+#define SCI_REPLACETARGET 2194
+#define SCI_REPLACETARGETRE 2195
+#define SCI_SEARCHINTARGET 2197
+#define SCI_SETSEARCHFLAGS 2198
+#define SCI_GETSEARCHFLAGS 2199
+#define SCI_CALLTIPSHOW 2200
+#define SCI_CALLTIPCANCEL 2201
+#define SCI_CALLTIPACTIVE 2202
+#define SCI_CALLTIPPOSSTART 2203
+#define SCI_CALLTIPSETHLT 2204
+#define SCI_CALLTIPSETBACK 2205
+#define SCI_VISIBLEFROMDOCLINE 2220
+#define SCI_DOCLINEFROMVISIBLE 2221
+#define SC_FOLDLEVELBASE 0x400
+#define SC_FOLDLEVELWHITEFLAG 0x1000
+#define SC_FOLDLEVELHEADERFLAG 0x2000
+#define SC_FOLDLEVELNUMBERMASK 0x0FFF
+#define SCI_SETFOLDLEVEL 2222
+#define SCI_GETFOLDLEVEL 2223
+#define SCI_GETLASTCHILD 2224
+#define SCI_GETFOLDPARENT 2225
+#define SCI_SHOWLINES 2226
+#define SCI_HIDELINES 2227
+#define SCI_GETLINEVISIBLE 2228
+#define SCI_SETFOLDEXPANDED 2229
+#define SCI_GETFOLDEXPANDED 2230
+#define SCI_TOGGLEFOLD 2231
+#define SCI_ENSUREVISIBLE 2232
+#define SCI_SETFOLDFLAGS 2233
+#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234
+#define SCI_SETTABINDENTS 2260
+#define SCI_GETTABINDENTS 2261
+#define SCI_SETBACKSPACEUNINDENTS 2262
+#define SCI_GETBACKSPACEUNINDENTS 2263
+#define SC_TIME_FOREVER 10000000
+#define SCI_SETMOUSEDWELLTIME 2264
+#define SCI_GETMOUSEDWELLTIME 2265
+#define SCI_LINEDOWN 2300
+#define SCI_LINEDOWNEXTEND 2301
+#define SCI_LINEUP 2302
+#define SCI_LINEUPEXTEND 2303
+#define SCI_CHARLEFT 2304
+#define SCI_CHARLEFTEXTEND 2305
+#define SCI_CHARRIGHT 2306
+#define SCI_CHARRIGHTEXTEND 2307
+#define SCI_WORDLEFT 2308
+#define SCI_WORDLEFTEXTEND 2309
+#define SCI_WORDRIGHT 2310
+#define SCI_WORDRIGHTEXTEND 2311
+#define SCI_HOME 2312
+#define SCI_HOMEEXTEND 2313
+#define SCI_LINEEND 2314
+#define SCI_LINEENDEXTEND 2315
+#define SCI_DOCUMENTSTART 2316
+#define SCI_DOCUMENTSTARTEXTEND 2317
+#define SCI_DOCUMENTEND 2318
+#define SCI_DOCUMENTENDEXTEND 2319
+#define SCI_PAGEUP 2320
+#define SCI_PAGEUPEXTEND 2321
+#define SCI_PAGEDOWN 2322
+#define SCI_PAGEDOWNEXTEND 2323
+#define SCI_EDITTOGGLEOVERTYPE 2324
+#define SCI_CANCEL 2325
+#define SCI_DELETEBACK 2326
+#define SCI_TAB 2327
+#define SCI_BACKTAB 2328
+#define SCI_NEWLINE 2329
+#define SCI_FORMFEED 2330
+#define SCI_VCHOME 2331
+#define SCI_VCHOMEEXTEND 2332
+#define SCI_ZOOMIN 2333
+#define SCI_ZOOMOUT 2334
+#define SCI_DELWORDLEFT 2335
+#define SCI_DELWORDRIGHT 2336
+#define SCI_LINECUT 2337
+#define SCI_LINEDELETE 2338
+#define SCI_LINETRANSPOSE 2339
+#define SCI_LOWERCASE 2340
+#define SCI_UPPERCASE 2341
+#define SCI_LINESCROLLDOWN 2342
+#define SCI_LINESCROLLUP 2343
+#define SCI_MOVECARETINSIDEVIEW 2401
+#define SCI_LINELENGTH 2350
+#define SCI_BRACEHIGHLIGHT 2351
+#define SCI_BRACEBADLIGHT 2352
+#define SCI_BRACEMATCH 2353
+#define SCI_GETVIEWEOL 2355
+#define SCI_SETVIEWEOL 2356
+#define SCI_GETDOCPOINTER 2357
+#define SCI_SETDOCPOINTER 2358
+#define SCI_SETMODEVENTMASK 2359
+#define EDGE_NONE 0
+#define EDGE_LINE 1
+#define EDGE_BACKGROUND 2
+#define SCI_GETEDGECOLUMN 2360
+#define SCI_SETEDGECOLUMN 2361
+#define SCI_GETEDGEMODE 2362
+#define SCI_SETEDGEMODE 2363
+#define SCI_GETEDGECOLOUR 2364
+#define SCI_SETEDGECOLOUR 2365
+#define SCI_SEARCHANCHOR 2366
+#define SCI_SEARCHNEXT 2367
+#define SCI_SEARCHPREV 2368
+#define CARET_SLOP 0x01
+#define CARET_CENTER 0x02
+#define CARET_STRICT 0x04
+#define CARET_XEVEN 0x08
+#define CARET_XJUMPS 0x10
+#define SCI_SETCARETPOLICY 2369
+#define SCI_LINESONSCREEN 2370
+#define SCI_USEPOPUP 2371
+#define SCI_SELECTIONISRECTANGLE 2372
+#define SCI_SETZOOM 2373
+#define SCI_GETZOOM 2374
+#define SCI_CREATEDOCUMENT 2375
+#define SCI_ADDREFDOCUMENT 2376
+#define SCI_RELEASEDOCUMENT 2377
+#define SCI_GETMODEVENTMASK 2378
+#define SCI_SETFOCUS 2380
+#define SCI_GETFOCUS 2381
+#define SCI_SETSTATUS 2382
+#define SCI_GETSTATUS 2383
+#define SCI_SETMOUSEDOWNCAPTURES 2384
+#define SCI_GETMOUSEDOWNCAPTURES 2385
+#define SC_CURSORNORMAL -1
+#define SC_CURSORWAIT 3
+#define SCI_SETCURSOR 2386
+#define SCI_GETCURSOR 2387
+#define SCI_WORDPARTLEFT 2390
+#define SCI_WORDPARTLEFTEXTEND 2391
+#define SCI_WORDPARTRIGHT 2392
+#define SCI_WORDPARTRIGHTEXTEND 2393
+#define VISIBLE_SLOP 0x01
+#define VISIBLE_STRICT 0x04
+#define SCI_SETVISIBLEPOLICY 2394
+#define SCI_DELLINELEFT 2395
+#define SCI_DELLINERIGHT 2396
+#define SCI_GRABFOCUS 2400
+#define SCI_STARTRECORD 3001
+#define SCI_STOPRECORD 3002
+#define SCI_SETLEXER 4001
+#define SCI_GETLEXER 4002
+#define SCI_COLOURISE 4003
+#define SCI_SETPROPERTY 4004
+#define SCI_SETKEYWORDS 4005
+#define SCI_SETLEXERLANGUAGE 4006
+#define SC_MOD_INSERTTEXT 0x1
+#define SC_MOD_DELETETEXT 0x2
+#define SC_MOD_CHANGESTYLE 0x4
+#define SC_MOD_CHANGEFOLD 0x8
+#define SC_PERFORMED_USER 0x10
+#define SC_PERFORMED_UNDO 0x20
+#define SC_PERFORMED_REDO 0x40
+#define SC_LASTSTEPINUNDOREDO 0x100
+#define SC_MOD_CHANGEMARKER 0x200
+#define SC_MOD_BEFOREINSERT 0x400
+#define SC_MOD_BEFOREDELETE 0x800
+#define SC_MODEVENTMASKALL 0xF77
+#define SCEN_CHANGE 768
+#define SCEN_SETFOCUS 512
+#define SCEN_KILLFOCUS 256
+#define SCK_DOWN 300
+#define SCK_UP 301
+#define SCK_LEFT 302
+#define SCK_RIGHT 303
+#define SCK_HOME 304
+#define SCK_END 305
+#define SCK_PRIOR 306
+#define SCK_NEXT 307
+#define SCK_DELETE 308
+#define SCK_INSERT 309
+#define SCK_ESCAPE 7
+#define SCK_BACK 8
+#define SCK_TAB 9
+#define SCK_RETURN 13
+#define SCK_ADD 310
+#define SCK_SUBTRACT 311
+#define SCK_DIVIDE 312
+#define SCMOD_SHIFT 1
+#define SCMOD_CTRL 2
+#define SCMOD_ALT 4
+#define SCN_STYLENEEDED 2000
+#define SCN_CHARADDED 2001
+#define SCN_SAVEPOINTREACHED 2002
+#define SCN_SAVEPOINTLEFT 2003
+#define SCN_MODIFYATTEMPTRO 2004
+#define SCN_KEY 2005
+#define SCN_DOUBLECLICK 2006
+#define SCN_UPDATEUI 2007
+#define SCN_CHECKBRACE 2007
+#define SCN_MODIFIED 2008
+#define SCN_MACRORECORD 2009
+#define SCN_MARGINCLICK 2010
+#define SCN_NEEDSHOWN 2011
+#define SCN_POSCHANGED 2012
+#define SCN_PAINTED 2013
+#define SCN_USERLISTSELECTION 2014
+#define SCN_URIDROPPED 2015
+#define SCN_DWELLSTART 2016
+#define SCN_DWELLEND 2017
+//--Autogenerated -- end of section automatically generated from Scintilla.iface
+
+// Optional module for macro recording
+#ifdef MACRO_SUPPORT
+typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam,
+ long lParam, void *userData);
+#endif
+
+// These structures are defined to be exactly the same shape as the Win32
+// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs.
+// So older code that treats Scintilla as a RichEdit will work.
+
+struct CharacterRange {
+ long cpMin;
+ long cpMax;
+};
+
+struct TextRange {
+ struct CharacterRange chrg;
+ char *lpstrText;
+};
+
+struct TextToFind {
+ struct CharacterRange chrg;
+ char *lpstrText;
+ struct CharacterRange chrgText;
+};
+
+#ifdef PLATFORM_H
+
+// This structure is used in printing and requires some of the graphics types
+// from Platform.h. Not needed by most client code.
+
+struct RangeToFormat {
+ SurfaceID hdc;
+ SurfaceID hdcTarget;
+ PRectangle rc;
+ PRectangle rcPage;
+ CharacterRange chrg;
+};
+
+#endif
+
+struct NotifyHeader {
+ // hwndFrom is really an environment specifc window handle or pointer
+ // but most clients of Scintilla.h do not have this type visible.
+ //WindowID hwndFrom;
+ void *hwndFrom;
+ unsigned int idFrom;
+ unsigned int code;
+};
+
+struct SCNotification {
+ struct NotifyHeader nmhdr;
+ int position; // SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND
+ int ch; // SCN_CHARADDED, SCN_KEY
+ int modifiers; // SCN_KEY
+ int modificationType; // SCN_MODIFIED
+ const char *text; // SCN_MODIFIED
+ int length; // SCN_MODIFIED
+ int linesAdded; // SCN_MODIFIED
+#ifdef MACRO_SUPPORT
+ int message; // SCN_MACRORECORD
+ uptr_t wParam; // SCN_MACRORECORD
+ sptr_t lParam; // SCN_MACRORECORD
+#endif
+ int line; // SCN_MODIFIED
+ int foldLevelNow; // SCN_MODIFIED
+ int foldLevelPrev; // SCN_MODIFIED
+ int margin; // SCN_MARGINCLICK
+ int listType; // SCN_USERLISTSELECTION
+ int x; // SCN_DWELLSTART, SCN_DWELLEND
+ int y; // SCN_DWELLSTART, SCN_DWELLEND
+};
+
+#define SC_MASK_FOLDERS ((1<<SC_MARKNUM_FOLDER) | \
+ (1<<SC_MARKNUM_FOLDEROPEN) | \
+ (1<<SC_MARKNUM_FOLDERSUB) | \
+ (1<<SC_MARKNUM_FOLDERTAIL) | \
+ (1<<SC_MARKNUM_FOLDERMIDTAIL) | \
+ (1<<SC_MARKNUM_FOLDEROPENMID) | \
+ (1<<SC_MARKNUM_FOLDEREND))
+
+// Deprecation section listing all API features that are deprecated and will
+// will be removed completely in a future version.
+// To enable these features define INCLUDE_DEPRECATED_FEATURES
+
+#ifdef INCLUDE_DEPRECATED_FEATURES
+
+#endif
+
+#endif
--- /dev/null
+/********************************************************************
+* Module: editor.cpp. This is part of Visual-MinGW.
+*
+* Purpose: Procedures to manage Scintilla editor.
+*
+* Authors: These classes are based on SciTE release 1.39.
+* http://www.scintilla.org/
+* SciTE original code by Neil Hodgson.
+* Present revised code by Manu B.
+*
+* License: Both SciTE and Scintilla are covered by
+* "License for Scintilla and SciTE" agreement terms detailed in license.htm.
+* Present revised code is covered by GNU General Public License.
+*
+* Revisions:
+*
+********************************************************************/
+#include <windows.h>
+#include <stdio.h>
+#include "commctrl.h"
+#include "commdlg.h"
+#include "editor.h"
+#include "rsrc.h"
+
+extern CMessageBox MsgBox;
+
+int Minimum(int a, int b);
+int Maximum(int a, int b);
+
+int Minimum(int a, int b){
+ if (a < b)
+ return a;
+ else
+ return b;
+}
+
+int Maximum(int a, int b){
+ if (a > b)
+ return a;
+ else
+ return b;
+}
+
+void EnsureRangeVisible(HWND hwndCtrl, int posStart, int posEnd, bool enforcePolicy){
+ int lineStart = SendMessage(hwndCtrl, SCI_LINEFROMPOSITION, Minimum(posStart, posEnd), 0);
+ int lineEnd = SendMessage(hwndCtrl, SCI_LINEFROMPOSITION, Maximum(posStart, posEnd), 0);
+ for (int line = lineStart; line <= lineEnd; line++){
+ SendMessage(hwndCtrl,
+ enforcePolicy ? SCI_ENSUREVISIBLEENFORCEPOLICY : SCI_ENSUREVISIBLE, line, 0);
+ }
+}
+
+int LengthDocument(HWND hwndCtrl){
+return SendMessage(hwndCtrl, SCI_GETLENGTH, 0, 0);
+}
+
+CharacterRange GetSelection(HWND hwndCtrl){
+ CharacterRange crange;
+ crange.cpMin = SendMessage(hwndCtrl, SCI_GETSELECTIONSTART, 0, 0);
+ crange.cpMax = SendMessage(hwndCtrl, SCI_GETSELECTIONEND, 0, 0);
+return crange;
+}
+
+
+/********************************************************************
+* Class: CChooseFontDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CChooseFontDlg::CChooseFontDlg(){
+ ZeroMemory(&lf, sizeof(LOGFONT));
+/* lf.lfHeight;
+ lf.lfWidth;
+ lf.lfEscapement;
+ lf.lfOrientation;
+ lf.lfWeight;
+ lf.lfItalic;
+ lf.lfUnderline;
+ lf.lfStrikeOut;
+ lf.lfCharSet;
+ lf.lfOutPrecision;
+ lf.lfClipPrecision;
+ lf.lfQuality;
+ lf.lfPitchAndFamily;
+ lf.lfFaceName[LF_FACESIZE];*/
+
+ cf.lStructSize = sizeof(CHOOSEFONT);
+ cf.hwndOwner = 0;
+ cf.hDC = NULL;
+ cf.lpLogFont = &lf;//&(Profile.LogFont);
+ cf.iPointSize = 0;
+ cf.Flags = /*CF_INITTOLOGFONTSTRUCT
+ |*/ CF_SCREENFONTS | CF_EFFECTS
+ /*| CF_ENABLEHOOK*/;
+ cf.rgbColors = 0;//Profile.rgbForeColor;
+ cf.lCustData = 0;
+ cf.lpfnHook = NULL;
+ cf.lpTemplateName = NULL;
+ cf.hInstance = NULL;
+ cf.lpszStyle = NULL;
+ cf.nFontType = SCREEN_FONTTYPE;
+ cf.nSizeMin = 0;
+ cf.nSizeMax = 0;
+}
+
+CChooseFontDlg::~CChooseFontDlg(){
+}
+
+bool CChooseFontDlg::Create(CWindow * pWindow){
+ cf.hwndOwner = pWindow->_hWnd;
+return ChooseFont(&cf);
+}
+
+
+/*bool ChooseNewFont(HWND hWndListBox){
+ static CHOOSEFONT cf;
+ static BOOL bFirstTime = TRUE;
+ HFONT hFont;
+ if(bFirstTime){
+ bFirstTime = false;
+ }
+ if(ChooseFont(&cf)){
+ HDC hDC;
+ hFont = CreateFontIndirect( &(Profile.LogFont) );
+ hDC = GetDC( hWndListBox );
+ SelectObject( hDC, hFont );
+ Profile.rgbForeColor = cf.rgbColors;
+ InvalidateRect( hWndListBox, NULL, TRUE );
+ SendMessage( hWndListBox, WM_CTLCOLORLISTBOX, (DWORD) hDC, (LONG) hWndListBox );
+ SendMessage( hWndListBox, WM_SETFONT, (DWORD) hFont, TRUE );
+ ReleaseDC( hWndListBox, hDC );
+ }
+return true;
+}*/
+
+
+/********************************************************************
+* Class: CFindReplaceDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CFindReplaceDlg::CFindReplaceDlg(){
+ pEditor = NULL;
+ hEditor = 0;
+ resId = 0;
+ *findWhat = '\0';
+ *replaceWhat = '\0';
+
+ bWholeWord = false;
+ bMatchCase = true;
+ bRegExp = false;
+ bWrapFind = false;
+ bUnSlash = false;
+ bReverseFind = false;
+ bHavefound = false;
+}
+
+CFindReplaceDlg::~CFindReplaceDlg(){
+}
+
+HWND CFindReplaceDlg::Find(CScintilla * pEditor){
+ if (_hWnd || !pEditor)
+ return 0;
+return CreateParam(pEditor, IDD_FIND, (long) IDD_FIND);
+}
+
+HWND CFindReplaceDlg::Replace(CScintilla * pEditor){
+ if (_hWnd || !pEditor)
+ return 0;
+return CreateParam(pEditor, IDD_REPLACE, (long) IDD_REPLACE);
+}
+
+LRESULT CALLBACK CFindReplaceDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CFindReplaceDlg::OnInitDialog(HWND, LPARAM lInitParam){
+ // Set pointers.
+ pEditor = (CEditor *) _pParent;
+ if (pEditor == NULL)
+ return TRUE;
+
+ hEditor = pEditor->_hWnd;
+ resId = lInitParam;
+
+ hFindWhat = GetItem(IDC_FINDWHAT);
+ hWholeWord = GetItem(IDC_WHOLEWORD);
+ hMatchCase = GetItem(IDC_MATCHCASE);
+ hRegExp = GetItem(IDC_REGEXP);
+ hWrap = GetItem(IDC_WRAP);
+ hUnSlash = GetItem(IDC_UNSLASH);
+
+ if (resId == IDD_FIND)
+ return Find_OnInitDialog();
+ else if (resId == IDD_REPLACE)
+ return Replace_OnInitDialog();
+return FALSE;
+}
+
+BOOL CFindReplaceDlg::Find_OnInitDialog(void){
+
+ hUp = GetItem(IDC_DIRECTIONUP);
+ hDown = GetItem(IDC_DIRECTIONDOWN);
+
+ SetItemText(hFindWhat, findWhat);
+ //FillComboFromMemory(wFindWhat, memFinds);
+ if (bWholeWord)
+ ::SendMessage(hWholeWord, BM_SETCHECK, BST_CHECKED, 0);
+ if (bMatchCase)
+ ::SendMessage(hMatchCase, BM_SETCHECK, BST_CHECKED, 0);
+ if (bRegExp)
+ ::SendMessage(hRegExp, BM_SETCHECK, BST_CHECKED, 0);
+ if (bWrapFind)
+ ::SendMessage(hWrap, BM_SETCHECK, BST_CHECKED, 0);
+ if (bUnSlash)
+ ::SendMessage(hUnSlash, BM_SETCHECK, BST_CHECKED, 0);
+
+ if (bReverseFind) {
+ ::SendMessage(hUp, BM_SETCHECK, BST_CHECKED, 0);
+ } else {
+ ::SendMessage(hDown, BM_SETCHECK, BST_CHECKED, 0);
+ }
+return TRUE;
+}
+
+BOOL CFindReplaceDlg::Replace_OnInitDialog(void){
+ SetItemText(hFindWhat, findWhat);
+ //FillComboFromMemory(wFindWhat, sci->memFinds);
+
+ hReplaceWith = GetItem(IDC_REPLACEWITH);
+ SetItemText(hReplaceWith, replaceWhat);
+ //FillComboFromMemory(wReplaceWith, sci->memReplaces);
+
+ if (bWholeWord)
+ ::SendMessage(hWholeWord, BM_SETCHECK, BST_CHECKED, 0);
+ if (bMatchCase)
+ ::SendMessage(hMatchCase, BM_SETCHECK, BST_CHECKED, 0);
+ if (bRegExp)
+ ::SendMessage(hRegExp, BM_SETCHECK, BST_CHECKED, 0);
+ if (bWrapFind)
+ ::SendMessage(hWrap, BM_SETCHECK, BST_CHECKED, 0);
+ if (bUnSlash)
+ ::SendMessage(hUnSlash, BM_SETCHECK, BST_CHECKED, 0);
+ if ((findWhat) != '\0'){
+ ::SetFocus(hReplaceWith);
+ return FALSE;
+ }
+return TRUE;
+}
+
+BOOL CFindReplaceDlg::OnCommand(WORD, WORD wID, HWND){
+ if (resId == IDD_FIND)
+ return Find_OnCommand(wID);
+ else if (resId == IDD_REPLACE)
+ return Replace_OnCommand(wID);
+return FALSE;
+}
+
+BOOL CFindReplaceDlg::Find_OnCommand(WORD wID){
+ switch (wID){
+ case IDOK:
+ char s[200];
+ GetItemText(hFindWhat, s, sizeof(s));
+ strcpy(findWhat, s);
+ //memFinds.Insert(s);
+ bWholeWord = BST_CHECKED ==
+ ::SendMessage(hWholeWord, BM_GETCHECK, 0, 0);
+ bMatchCase = BST_CHECKED ==
+ ::SendMessage(hMatchCase, BM_GETCHECK, 0, 0);
+ bRegExp = BST_CHECKED ==
+ ::SendMessage(hRegExp, BM_GETCHECK, 0, 0);
+ bWrapFind = BST_CHECKED ==
+ ::SendMessage(hWrap, BM_GETCHECK, 0, 0);
+ bUnSlash = BST_CHECKED ==
+ ::SendMessage(hUnSlash, BM_GETCHECK, 0, 0);
+ bReverseFind = BST_CHECKED ==
+ ::SendMessage(hUp, BM_GETCHECK, 0, 0);
+
+ FindNext(bReverseFind, true);
+ return TRUE;
+
+ case IDCANCEL:
+ EndDlg(IDCANCEL);
+ return FALSE;
+ }
+return FALSE;
+}
+
+BOOL CFindReplaceDlg::Replace_OnCommand(WORD wID){
+ if (wID == IDCANCEL){
+ EndDlg(IDCANCEL);
+ return FALSE;
+ }else{
+ return HandleReplaceCommand(wID);
+ }
+return FALSE;
+}
+
+void CFindReplaceDlg::FindNext(bool reverseDirection, bool showWarnings){
+ if (!hEditor){
+ MsgBox.DisplayWarning("Can't get editor handle");
+ return;
+ }
+
+ if (!findWhat[0]) { // nothing to found
+ //Find(hEditor);
+ return;
+ }
+ char findTarget[FR_MAX_LEN + 1];
+ strcpy(findTarget, findWhat);
+
+ // for C conversions -> int lenFind = UnSlashAsNeeded(findTarget, unSlash, regExp);
+ int lenFind = strlen(findTarget); // normal return of UnSlashAsNeeded
+
+ if (lenFind == 0)
+ return;
+
+ CharacterRange cr = GetSelection(hEditor);
+ int startPosition = cr.cpMax;
+ int endPosition = LengthDocument(hEditor);
+
+ if (reverseDirection){
+ startPosition = cr.cpMin - 1;
+ endPosition = 0;
+ }
+
+ int flags = (bWholeWord ? SCFIND_WHOLEWORD : 0) |
+ (bMatchCase ? SCFIND_MATCHCASE : 0) |
+ (bRegExp ? SCFIND_REGEXP : 0);
+
+ ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0);
+ ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0);
+ ::SendMessage(hEditor, SCI_SETSEARCHFLAGS, flags, 0);
+ int posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, lenFind, (LPARAM) findTarget);
+
+ if (posFind == -1 && bWrapFind){ // not found with wrapFind
+
+ // Failed to find in indicated direction
+ // so search from the beginning (forward) or from the end (reverse)
+ // unless wrapFind is false
+ if (reverseDirection){
+ startPosition = LengthDocument(hEditor);
+ endPosition = 0;
+ } else {
+ startPosition = 0;
+ endPosition = LengthDocument(hEditor);
+ }
+ ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0);
+ ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0);
+ posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, lenFind, (LPARAM) findTarget);
+ }
+ if (posFind == -1){ // not found
+ bHavefound = false;
+ if (showWarnings){
+
+ /*warn that not found
+ WarnUser(warnNotFound);*/
+
+ if (strlen(findWhat) > FR_MAX_LEN)
+ findWhat[FR_MAX_LEN] = '\0';
+ char msg[FR_MAX_LEN + 50];
+ strcpy(msg, "Cannot find the string \"");
+ strcat(msg, findWhat);
+ strcat(msg, "\".");
+ if (_hWnd){
+ MsgBox.DisplayWarning(msg);
+ }else{
+ MessageBox(0, msg, "Message", MB_OK);
+ }
+ }
+ }else{ // found
+ bHavefound = true;
+ int start = ::SendMessage(hEditor, SCI_GETTARGETSTART, 0, 0);
+ int end = ::SendMessage(hEditor, SCI_GETTARGETEND, 0, 0);
+ EnsureRangeVisible(hEditor, start, end, true);
+ ::SendMessage(hEditor, SCI_SETSEL, start, end);
+ }
+}
+
+BOOL CFindReplaceDlg::HandleReplaceCommand(int cmd){
+ if (!hEditor){
+ MsgBox.DisplayWarning("Can't get editor handle");
+ return false;
+ }
+
+ if ((cmd == IDOK) || (cmd == IDC_REPLACE) || (cmd == IDC_REPLACEALL) || (cmd == IDC_REPLACEINSEL)) {
+ GetItemText(hFindWhat, findWhat, sizeof(findWhat));
+ //props.Set("find.what", findWhat);
+ //memFinds.Insert(findWhat);
+
+ bWholeWord = BST_CHECKED ==
+ ::SendMessage(hWholeWord, BM_GETCHECK, 0, 0);
+ bMatchCase = BST_CHECKED ==
+ ::SendMessage(hMatchCase, BM_GETCHECK, 0, 0);
+ bRegExp = BST_CHECKED ==
+ ::SendMessage(hRegExp, BM_GETCHECK, 0, 0);
+ bWrapFind = BST_CHECKED ==
+ ::SendMessage(hWrap, BM_GETCHECK, 0, 0);
+ bUnSlash = BST_CHECKED ==
+ ::SendMessage(hUnSlash, BM_GETCHECK, 0, 0);
+ }
+ if ((cmd == IDC_REPLACE) || (cmd == IDC_REPLACEALL) || (cmd == IDC_REPLACEINSEL)) {
+ GetItemText(hReplaceWith, replaceWhat, sizeof(replaceWhat));
+ //memReplaces.Insert(replaceWhat);
+ }
+
+ if (cmd == IDOK) {
+ FindNext(bReverseFind, true); // Find next
+ } else if (cmd == IDC_REPLACE) {
+ if (bHavefound){
+ ReplaceOnce();
+ } else {
+ CharacterRange crange = GetSelection(hEditor);
+ ::SendMessage(hEditor, SCI_SETSEL, crange.cpMin, crange.cpMin);
+ FindNext(bReverseFind, true);
+ if (bHavefound){
+ ReplaceOnce();
+ }
+ }
+ } else if ((cmd == IDC_REPLACEALL) || (cmd == IDC_REPLACEINSEL)){
+ ReplaceAll(cmd == IDC_REPLACEINSEL);
+ }
+return TRUE;
+}
+
+void CFindReplaceDlg::ReplaceOnce(void){
+ if (bHavefound){
+ char replaceTarget[FR_MAX_LEN + 1];
+ strcpy(replaceTarget, replaceWhat);
+ // for C conversions -> int replaceLen = UnSlashAsNeeded(replaceTarget, unSlash, regExp);
+ int replaceLen = strlen(replaceTarget); // normal return of UnSlashAsNeeded
+
+ CharacterRange cr = GetSelection(hEditor);
+ ::SendMessage(hEditor, SCI_SETTARGETSTART, cr.cpMin, 0);
+ ::SendMessage(hEditor, SCI_SETTARGETEND, cr.cpMax, 0);
+ int lenReplaced = replaceLen;
+ if (bRegExp)
+ lenReplaced = ::SendMessage(hEditor, SCI_REPLACETARGETRE, replaceLen, (LPARAM) replaceTarget);
+ else // Allow \0 in replacement
+ ::SendMessage(hEditor, SCI_REPLACETARGET, replaceLen, (LPARAM) replaceTarget);
+ ::SendMessage(hEditor, SCI_SETSEL, cr.cpMin + lenReplaced, cr.cpMin);
+ bHavefound = false;
+ }
+ FindNext(bReverseFind, true);
+}
+
+void CFindReplaceDlg::ReplaceAll(bool inSelection){
+ char findTarget[FR_MAX_LEN + 1];
+ strcpy(findTarget, findWhat);
+
+ // for C conversions -> int findLen = UnSlashAsNeeded(findTarget, unSlash, regExp);
+ int findLen = strlen(findTarget); // normal return of UnSlashAsNeeded
+
+ if (findLen == 0) {
+ MessageBox(_hWnd, "Find string for \"Replace All\" must not be empty.", "Message", MB_OK | MB_ICONWARNING);
+ return;
+ }
+
+ CharacterRange cr = GetSelection(hEditor);
+ int startPosition = cr.cpMin;
+ int endPosition = cr.cpMax;
+ if (inSelection) {
+ if (startPosition == endPosition) {
+ MessageBox(_hWnd, "Selection for \"Replace in Selection\" must not be empty.", "Message", MB_OK | MB_ICONWARNING);
+ return;
+ }
+ } else {
+ endPosition = LengthDocument(hEditor);
+ if (bWrapFind) {
+ // Whole document
+ startPosition = 0;
+ }
+ // If not wrapFind, replace all only from caret to end of document
+ }
+
+ char replaceTarget[FR_MAX_LEN + 1];
+ strcpy(replaceTarget, replaceWhat);
+
+ // for C conversions -> int replaceLen = UnSlashAsNeeded(replaceTarget, unSlash, regExp);
+ int replaceLen = strlen(replaceTarget); // normal return of UnSlashAsNeeded
+
+ int flags = (bWholeWord ? SCFIND_WHOLEWORD : 0) |
+ (bMatchCase ? SCFIND_MATCHCASE : 0) |
+ (bRegExp ? SCFIND_REGEXP : 0);
+ ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0);
+ ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0);
+ ::SendMessage(hEditor, SCI_SETSEARCHFLAGS, flags, 0);
+ int posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, findLen, (LPARAM) findTarget);
+ if ((findLen == 1) && bRegExp && (findTarget[0] == '^')) {
+ // Special case for replace all start of line so it hits the first line
+ posFind = startPosition;
+ ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0);
+ ::SendMessage(hEditor, SCI_SETTARGETEND, startPosition, 0);
+ }
+ if ((posFind != -1) && (posFind <= endPosition)) {
+ int lastMatch = posFind;
+ ::SendMessage(hEditor, SCI_BEGINUNDOACTION, 0, 0);
+ while (posFind != -1) {
+ int lenTarget = ::SendMessage(hEditor, SCI_GETTARGETEND, 0, 0) - ::SendMessage(hEditor, SCI_GETTARGETSTART, 0, 0);
+ int lenReplaced = replaceLen;
+ if (bRegExp)
+ lenReplaced = ::SendMessage(hEditor, SCI_REPLACETARGETRE, replaceLen, (LPARAM) replaceTarget);
+ else
+ ::SendMessage(hEditor, SCI_REPLACETARGET, replaceLen, (LPARAM) replaceTarget);
+ // Modify for change caused by replacement
+ endPosition += lenReplaced - lenTarget;
+ lastMatch = posFind + lenReplaced;
+ // For the special cases of start of line and end of line
+ // Something better could be done but there are too many special cases
+ if (lenTarget <= 0)
+ lastMatch++;
+ ::SendMessage(hEditor, SCI_SETTARGETSTART, lastMatch, 0);
+ ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0);
+ posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, findLen, (LPARAM) findTarget);
+ }
+ if (inSelection)
+ ::SendMessage(hEditor, SCI_SETSEL, startPosition, endPosition);
+ else
+ ::SendMessage(hEditor, SCI_SETSEL, lastMatch, lastMatch);
+ ::SendMessage(hEditor, SCI_ENDUNDOACTION, 0, 0);
+ } else {
+ if (strlen(findWhat) > FR_MAX_LEN)
+ findWhat[FR_MAX_LEN] = '\0';
+ char msg[FR_MAX_LEN + 50];
+ strcpy(msg, "No replacements because string \"");
+ strcat(msg, findWhat);
+ strcat(msg, "\" was not present.");
+ MessageBox(_hWnd, msg, "Message", MB_OK | MB_ICONWARNING);
+ }
+}
+
+
+/********************************************************************
+* Class: CEditor.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CEditor::CEditor(){
+ caretPos = 1;
+}
+
+CEditor::~CEditor(){
+}
+
+void CEditor::LoadFile(CFileItem * file){
+ if (!file || !_hWnd)
+ return;
+
+ if (file->nFileOffset == 0)
+ return; // Untitled file.
+
+ SetLexer(file->type);
+ ::SendMessage(_hWnd, SCI_CANCEL, 0, 0);
+ ::SendMessage(_hWnd, SCI_SETUNDOCOLLECTION, 0, 0);
+
+ FILE *fp = fopen(file->szFileName, "rb");
+ if (fp){
+ char data[blockSize];
+ int lenFile = fread(data, 1, sizeof(data), fp);
+
+ while (lenFile > 0){
+ ::SendMessage(_hWnd, SCI_ADDTEXT, lenFile, (LPARAM) data);
+ lenFile = fread(data, 1, sizeof(data), fp);
+ }
+
+ fclose(fp);
+
+ }else{
+ MsgBox.DisplayWarning("Can't load file %s", file->szFileName);
+ }
+
+ ::SendMessage(_hWnd, SCI_SETUNDOCOLLECTION, 1, 0);
+ ::SendMessage(_hWnd, EM_EMPTYUNDOBUFFER, 0, 0);
+ ::SendMessage(_hWnd, SCI_SETSAVEPOINT, 0 , 0);
+ ::SendMessage(_hWnd, SCI_GOTOPOS, 0, 0);
+}
+
+void GetFileType(CFileItem * file){
+ if (!file)
+ return;
+
+ if (file->nFileExtension){
+ char * ext = file->szFileName + file->nFileExtension;
+ // H_FILE ?
+ if (!stricmp(ext, "h")){
+ file->type = H_FILE;
+ return;
+ }else if (!stricmp(ext, "hpp")){
+ file->type = H_FILE;
+ return;
+ }else if (!stricmp(ext, "hxx")){
+ file->type = H_FILE;
+ return;
+ // C_FILE ?
+ }else if (!stricmp(ext, "c")){
+ file->type = C_FILE;
+ return;
+ }else if (!stricmp(ext, "cpp")){
+ file->type = C_FILE;
+ return;
+ }else if (!stricmp(ext, "cxx")){
+ file->type = C_FILE;
+ return;
+ // RC_FILE ?
+ }else if (!stricmp(ext, "rc")){
+ file->type = RC_FILE;
+ return;
+ }
+ }
+ file->type = U_FILE;
+return;
+}
+
+void CEditor::SaveFile(char * fullPath){
+ if (!_hWnd)
+ return;
+
+ FILE *fp = fopen(fullPath, "wb");
+ if (fp){
+ char data[blockSize + 1];
+ int lengthDoc = ::SendMessage(_hWnd, SCI_GETLENGTH, 0, 0);
+ for (int i = 0; i < lengthDoc; i += blockSize) {
+ int grabSize = lengthDoc - i;
+ if (grabSize > blockSize)
+ grabSize = blockSize;
+ GetRange(i, i + grabSize, data);
+ fwrite(data, grabSize, 1, fp);
+ }
+ fclose(fp);
+ ::SendMessage(_hWnd, SCI_SETSAVEPOINT, 0, 0);
+
+ }else{
+ MsgBox.DisplayWarning("Can't save file %s", fullPath);
+ }
+}
+
+int CEditor::GetCurrentPos(void){
+ int currentPos = ::SendMessage(_hWnd, SCI_GETCURRENTPOS, 0,0);
+ caretPos = ::SendMessage(_hWnd, SCI_LINEFROMPOSITION, currentPos, 0) + 1;
+return caretPos;
+}
+
+void CEditor::GetRange(int start, int end, char *text){
+ TextRange tr;
+ tr.chrg.cpMin = start;
+ tr.chrg.cpMax = end;
+ tr.lpstrText = text;
+ ::SendMessage(_hWnd, SCI_GETTEXTRANGE, 0, (LPARAM) &tr);
+}
+
+void CEditor::SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face){
+ ::SendMessage(_hWnd, SCI_STYLESETFORE, style, fore);
+ ::SendMessage(_hWnd, SCI_STYLESETBACK, style, back);
+ if (size >= 1)
+ ::SendMessage(_hWnd, SCI_STYLESETSIZE, style, size);
+ if (face)
+ ::SendMessage(_hWnd, SCI_STYLESETFONT, style, (LPARAM) face);
+}
+
+void CEditor::DefineMarker(int marker, int markerType, COLORREF fore, COLORREF back) {
+ ::SendMessage(_hWnd, SCI_MARKERDEFINE, marker, markerType);
+ ::SendMessage(_hWnd, SCI_MARKERSETFORE, marker, fore);
+ ::SendMessage(_hWnd, SCI_MARKERSETBACK, marker, back);
+}
+
+void CEditor::SetLexer(int fileType){
+ switch (fileType){
+
+ case H_FILE:
+ case C_FILE:
+ case RC_FILE:
+ SetCppLexer();
+ return;
+
+ default:
+ // Global default style.
+ SetAStyle(STYLE_DEFAULT, black, white, 10, "Verdana");
+ ::SendMessage(_hWnd, SCI_STYLECLEARALL, 0, 0); // Copies to all other styles.
+
+ }
+}
+
+void CEditor::SetCppLexer(void){
+ ::SendMessage(_hWnd, SCI_SETLEXER, SCLEX_CPP, 0);
+ ::SendMessage(_hWnd, SCI_SETSTYLEBITS, 5, 0);
+
+ ::SendMessage(_hWnd, SCI_SETKEYWORDS, 0, (LPARAM) cppKeyWords);
+
+ // Global default style.
+ SetAStyle(STYLE_DEFAULT, black, white, 10, "Verdana");
+ ::SendMessage(_hWnd, SCI_STYLECLEARALL, 0, 0); // Copies to all other styles.
+
+ // C Styles.
+ SetAStyle(SCE_C_DEFAULT, black, white, 10, "Verdana"); //0
+ SetAStyle(SCE_C_COMMENT, Green, white, 0, 0); //1
+ SetAStyle(SCE_C_COMMENTLINE, Green, white, 0, 0); //2
+ SetAStyle(SCE_C_COMMENTDOC, darkGreen, white, 0, 0); //3
+ SetAStyle(SCE_C_NUMBER, Ice, white, 0, 0); //4
+ SetAStyle(SCE_C_WORD, darkBlue, white, 0, 0); //5
+ ::SendMessage(_hWnd, SCI_STYLESETBOLD, SCE_C_WORD, 1);
+ SetAStyle(SCE_C_STRING, Purple, white, 0, 0); //6
+ SetAStyle(SCE_C_CHARACTER, Purple, white, 0, 0); //7
+ SetAStyle(SCE_C_PREPROCESSOR, Olive, white, 0, 0); //9
+ SetAStyle(SCE_C_OPERATOR, black, white, 0, 0); //10
+ ::SendMessage(_hWnd, SCI_STYLESETBOLD, SCE_C_OPERATOR, 1);
+// SetAStyle(SCE_C_STRINGEOL, darkBlue, white, 0, 0); //12
+// SetAStyle(SCE_C_COMMENTLINEDOC, darkBlue, white, 0, 0); //15
+// SetAStyle(SCE_C_WORD2, darkBlue, white, 0, 0); //16
+ ::SendMessage(_hWnd, SCI_SETPROPERTY, (long)"fold", (long)"1");
+ ::SendMessage(_hWnd, SCI_SETPROPERTY, (long)"fold.compact", (long)"1");
+ ::SendMessage(_hWnd, SCI_SETPROPERTY, (long)"fold.symbols", (long)"1");
+
+ ::SendMessage(_hWnd, SCI_SETFOLDFLAGS, 16, 0);
+
+ // To put the folder markers in the line number region
+ //SendEditor(SCI_SETMARGINMASKN, 0, SC_MASK_FOLDERS);
+
+ ::SendMessage(_hWnd, SCI_SETMODEVENTMASK, SC_MOD_CHANGEFOLD, 0);
+
+ // Create a margin column for the folding symbols
+ ::SendMessage(_hWnd, SCI_SETMARGINTYPEN, 2, SC_MARGIN_SYMBOL);
+
+ ::SendMessage(_hWnd, SCI_SETMARGINWIDTHN, 2, /*foldMargin ? foldMarginWidth :*/ 16);
+
+ ::SendMessage(_hWnd, SCI_SETMARGINMASKN, 2, SC_MASK_FOLDERS);
+ ::SendMessage(_hWnd, SCI_SETMARGINSENSITIVEN, 2, 1);
+
+ DefineMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS, white, black);
+ DefineMarker(SC_MARKNUM_FOLDER, SC_MARK_PLUS, white, black);
+ DefineMarker(SC_MARKNUM_FOLDERSUB, SC_MARK_EMPTY, white, black);
+ DefineMarker(SC_MARKNUM_FOLDERTAIL, SC_MARK_EMPTY, white, black);
+ DefineMarker(SC_MARKNUM_FOLDEREND, SC_MARK_EMPTY, white, black);
+ DefineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY, white, black);
+ DefineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY, white, black);
+
+return;
+}
+
+void CEditor::GotoLine(int line, char * /*fileName*/){
+ ::SendMessage(_hWnd, SCI_ENSUREVISIBLEENFORCEPOLICY, line, 0);
+ ::SendMessage(_hWnd, SCI_GOTOLINE, line, 0);
+}
+
+bool CEditor::MarginClick(int position, int modifiers){
+ int lineClick = ::SendMessage(_hWnd, SCI_LINEFROMPOSITION, position, 0);
+ //Platform::DebugPrintf("Margin click %d %d %x\n", position, lineClick,
+ // ::SendMessage(_hWnd, SCI_GETFOLDLEVEL, lineClick) & SC_FOLDLEVELHEADERFLAG);
+/* if ((modifiers & SCMOD_SHIFT) && (modifiers & SCMOD_CTRL)) {
+ FoldAll();
+ } else {*/
+ int levelClick = ::SendMessage(_hWnd, SCI_GETFOLDLEVEL, lineClick, 0);
+ if (levelClick & SC_FOLDLEVELHEADERFLAG) {
+ if (modifiers & SCMOD_SHIFT) {
+ // Ensure all children visible
+ ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, lineClick, 1);
+ Expand(lineClick, true, true, 100, levelClick);
+ } else if (modifiers & SCMOD_CTRL) {
+ if (::SendMessage(_hWnd, SCI_GETFOLDEXPANDED, lineClick, 0)) {
+ // Contract this line and all children
+ ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, lineClick, 0);
+ Expand(lineClick, false, true, 0, levelClick);
+ } else {
+ // Expand this line and all children
+ ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, lineClick, 1);
+ Expand(lineClick, true, true, 100, levelClick);
+ }
+ } else {
+ // Toggle this line
+ ::SendMessage(_hWnd, SCI_TOGGLEFOLD, lineClick, 0);
+ }
+ }
+/* }*/
+ return true;
+}
+
+void CEditor::Expand(int &line, bool doExpand, bool force, int visLevels, int level){
+ int lineMaxSubord = ::SendMessage(_hWnd, SCI_GETLASTCHILD, line, level & SC_FOLDLEVELNUMBERMASK);
+ line++;
+ while (line <= lineMaxSubord) {
+ if (force) {
+ if (visLevels > 0)
+ ::SendMessage(_hWnd, SCI_SHOWLINES, line, line);
+ else
+ ::SendMessage(_hWnd, SCI_HIDELINES, line, line);
+ } else {
+ if (doExpand)
+ ::SendMessage(_hWnd, SCI_SHOWLINES, line, line);
+ }
+ int levelLine = level;
+ if (levelLine == -1)
+ levelLine = ::SendMessage(_hWnd, SCI_GETFOLDLEVEL, line, 0);
+ if (levelLine & SC_FOLDLEVELHEADERFLAG) {
+ if (force) {
+ if (visLevels > 1)
+ ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, line, 1);
+ else
+ ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, line, 0);
+ Expand(line, doExpand, force, visLevels - 1);
+ } else {
+ if (doExpand) {
+ if (!::SendMessage(_hWnd, SCI_GETFOLDEXPANDED, line, 0))
+ ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, line, 1);
+ Expand(line, true, force, visLevels - 1);
+ } else {
+ Expand(line, false, force, visLevels - 1);
+ }
+ }
+ } else {
+ line++;
+ }
+ }
+}
+
--- /dev/null
+/********************************************************************
+* Module: editor.h. This is part of Visual-MinGW.
+*
+* License: Visual-MinGW is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+*******************************************************************/
+#ifndef EDITOR_H
+#define EDITOR_H
+
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "winui.h"
+
+#define U_FILE 3
+#define H_FILE (U_FILE+1)
+#define C_FILE (U_FILE+2)
+#define RC_FILE (U_FILE+3)
+
+// Default block size.
+const int blockSize = 131072;
+
+// Default colors.
+const COLORREF black = RGB(0,0,0);
+const COLORREF white = RGB(0xff,0xff,0xff);
+const COLORREF darkBlue = RGB(0, 0, 0x7f);
+const COLORREF Green = RGB(0, 0x7f, 0);
+const COLORREF darkGreen = RGB(0x3f, 0x70, 0x3f);
+const COLORREF Purple = RGB(0x7f, 0x00, 0x7f);
+const COLORREF Ice = RGB(0x00, 0x7f, 0x7f);
+const COLORREF Olive = RGB(0x7f, 0x7f, 0x00);
+
+// Default Cpp keywords.
+const char cppKeyWords[] =
+"asm auto bool break case catch char class const const_cast continue "
+"default delete do double dynamic_cast else enum explicit export extern false float for "
+"friend goto if inline int long mutable namespace new operator private protected public "
+"register reinterpret_cast return short signed sizeof static static_cast struct switch "
+"template this throw true try typedef typeid typename union unsigned using "
+"virtual void volatile wchar_t while";
+
+void EnsureRangeVisible(HWND hwndCtrl, int posStart, int posEnd, bool enforcePolicy);
+int LengthDocument(HWND hwndCtrl);
+CharacterRange GetSelection(HWND hwndCtrl);
+
+class CFileItem : public CNode
+{
+ public:
+ CFileItem();
+ ~CFileItem();
+
+ // File name.
+ char szFileName[MAX_PATH];
+ WORD nFileOffset;
+ WORD nFileExtension;
+
+ // Owner tree view.
+ CTreeView * pTreeView;
+ HTREEITEM _hItem;
+ HTREEITEM _hDirItem;
+
+ // Owner child window.
+ CMDIChild * pMdiChild;
+ int show;
+ bool isInProject;
+
+ protected:
+
+ private:
+};
+
+void GetFileType(CFileItem * file);
+
+class CEditor : public CScintilla
+{
+ public:
+ CEditor();
+ ~CEditor();
+
+ void LoadFile(CFileItem * file);
+ void SaveFile(char * fullPath);
+ int GetCurrentPos(void);
+ void GotoLine(int line, char * fileName = NULL);
+ int caretPos;
+ void SetLexer(int fileType);
+ void SetCppLexer(void);
+ bool MarginClick(int position, int modifiers);
+
+ protected:
+
+ private:
+ void DefineMarker(int marker, int markerType, COLORREF fore, COLORREF back);
+ void GetRange(int start, int end, char *text);
+ void SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face);
+ void Expand(int &line, bool doExpand, bool force = false,
+ int visLevels = 0, int level = -1);
+};
+
+#define FR_MAX_LEN 200
+
+class CFindReplaceDlg : public CDlgBase
+{
+ public:
+ CFindReplaceDlg();
+ virtual ~CFindReplaceDlg();
+
+ HWND Find(CScintilla * pEditor);
+ HWND Replace(CScintilla * pEditor);
+
+ protected:
+ void FindNext(bool reverseDirection, bool showWarnings);
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL Find_OnInitDialog(void);
+ BOOL Replace_OnInitDialog(void);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+ BOOL Find_OnCommand(WORD wIDl);
+ BOOL Replace_OnCommand(WORD wID);
+ BOOL HandleReplaceCommand(int cmd);
+ void ReplaceOnce(void);
+ void ReplaceAll(bool inSelection);
+
+ private:
+ HWND hFindWhat;
+ HWND hReplaceWith;
+ HWND hWholeWord;
+ HWND hMatchCase;
+ HWND hRegExp;
+ HWND hWrap;
+ HWND hUnSlash;
+ HWND hUp;
+ HWND hDown;
+ char findWhat[FR_MAX_LEN + 1];
+ char replaceWhat[FR_MAX_LEN + 1];
+
+ bool bWholeWord;
+ bool bMatchCase;
+ bool bRegExp;
+ bool bWrapFind;
+ bool bUnSlash;
+ bool bReverseFind;
+ bool bHavefound;
+
+ CEditor * pEditor;
+ HWND hEditor;
+ int resId;
+};
+
+class CChooseFontDlg : public CWindow
+{
+ public:
+ CChooseFontDlg();
+ ~CChooseFontDlg();
+
+ bool Create(CWindow * pWindow);
+
+ protected:
+ CHOOSEFONT cf;
+ LOGFONT lf;
+
+ private:
+};
+
+#endif
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>Visual-MinGW license agreement.</title>
+<meta name="generator" content="Namo WebEditor v3.0">
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red" style="font-family:Arial; font-size:12;">
+
+<div align="center"><table border="0" cellspacing="0" bgcolor="teal">
+ <tr>
+ <td width="597"><p align="center"><font size="5" color="white"><b>Visual-MinGW's
+ license</b></font></td>
+ </tr>
+ <tr>
+ <td width="597"><table border="0" cellpadding="5" bgcolor="white">
+ <tr>
+ <td width="591" valign="top"><p align="center">
+ <table border="0">
+ <tr>
+ <td width="55"><p> </td>
+ <td width="518"><p><font size="2">Visual-MinGW
+ is a C/C++ Integrated Development Environment.<br>
+ Copyright (C) 2001 Manu B.</font></p>
+ <p><font size="2">The following license
+ terms applies to Visual-MinGW:</font></p>
+ <p><font size="2">This program is free software;
+ you can redistribute it and/or modify it
+ under the<br> terms of the GNU General Public
+ License version 2 as published by the Free
+ <br>
+ Software Foundation.</font></p>
+ <p><font size="2">This program is distributed
+ in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or <br>
+ FITNESS FOR A PARTICULAR PURPOSE.<br> See
+ the </font><a href="GNU-GPL.txt"><font size="2">GNU
+ General Public License</font></a><font size="2">
+ for more details.</font></p>
+ <p><font size="2">You should have received
+ a copy of the </font><a href="GNU-GPL.txt"><font
+ size="2">GNU General Public License</font></a><font
+ size="2"><br> along with this program;
+ if not, write to the Free Software<br> Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307,USA.</font></p>
+ <p> </td>
+ </tr>
+ <tr>
+ <td width="577" colspan="2"><p><hr size="1" width="80%"
+ noshade></td>
+ </tr>
+ <tr>
+ <td width="55"><p> </td>
+ <td width="518"><p><font size="2">Visual-MinGW
+ uses Neil Hodgson's</font><font size="2">
+ </font><a href="http://www.scintilla.org/"><font
+ size="2">Scintilla</font></a><font size="2">
+ </font><font size="2">editing component</font><font
+ size="2"> a</font><font size="2">s source
+ code <br>
+ editor. </font></p>
+ <p><font size="2">Th</font><font size="2">e
+ following license terms applies to both
+ </font><a href="http://www.scintilla.org/"><font
+ size="2">Scintilla</font></a><font size="2">
+ and </font><a href="http://www.scintilla.org/"><font
+ size="2">SciTE</font></a><font size="2">.</font></p>
+ <p> </td>
+ </tr>
+ </table></td>
+ </tr>
+ </table></td>
+ </tr>
+ <tr>
+ <td width="597"><p align="center"><font size="5" color="white"><b>License
+ for Scintilla and SciTE</b></font></td>
+ </tr>
+ <tr>
+ <td width="597"><table border="0" cellpadding="5" bgcolor="white">
+ <tr>
+ <td width="591" valign="top"><table border="0">
+ <tr>
+ <td width="55"><p> </p>
+ <p> </td>
+ <td width="518"><p><font size="2">Copyright
+ 1998-2001 by Neil Hodgson <neilh@scintilla.org></font></p>
+ <p><font size="2">All Rights Reserved </font></p>
+ <p><font size="2">Permission to use, copy,
+ modify, and distribute this software and
+ its <br> documentation for any purpose and
+ without fee is hereby granted, <br> provided
+ that the above copyright notice appear in
+ all copies and that <br> both that copyright
+ notice and this permission notice appear
+ in <br> supporting documentation. </font></p>
+ <p><font size="2">NEIL HODGSON DISCLAIMS
+ ALL WARRANTIES WITH REGARD TO THIS <br>
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ OF MERCHANTABILITY <br> AND FITNESS, IN
+ NO EVENT SHALL NEIL HODGSON BE LIABLE FOR
+ ANY <br> SPECIAL, INDIRECT OR CONSEQUENTIAL
+ DAMAGES OR ANY DAMAGES <br> WHATSOEVER RESULTING
+ FROM LOSS OF USE, DATA OR PROFITS, <br>
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ OR OTHER <br> TORTIOUS ACTION, ARISING OUT
+ OF OR IN CONNECTION WITH THE USE <br> OR
+ PERFORMANCE OF THIS SOFTWARE.</font></p>
+ <p> </td>
+ </tr>
+ </table></td>
+ </tr>
+ </table></td>
+ </tr>
+</table></div>
+<p> </p>
+<p> </p>
+</body>
+
+</html>
\ No newline at end of file
--- /dev/null
+Visual-MinGW's license
+----------------------
+
+Visual-MinGW is a C/C++ Integrated Development Environment.
+Copyright (C) 2001 Manu B.
+
+The following license terms applies to Visual-MinGW:
+
+This program is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License version 2 as published by the Free
+Software Foundation.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
+
+--------------------------------------------------------------------------------
+
+Visual-MinGW uses Neil Hodgson's Scintilla editing component as source code
+editor.
+
+The following license terms applies to both Scintilla and SciTE.
+
+
+License for Scintilla and SciTE
+-------------------------------
+
+Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THIS SOFTWARE.
+
+
+
+
+
+
+
+
+
--- /dev/null
+/********************************************************************
+* Module: main.cpp. This is part of Visual-MinGW.
+*
+* Purpose: Main module.
+*
+* Authors: Manu B.
+*
+* License: Visual-MinGW is a C/C++ Integrated Development Environment.
+* Copyright (C) 2001 Manu.
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+* USA.
+*
+* (See license.htm for more details.)
+*
+* Revisions:
+* Manu B. 12/15/01 CFileList created.
+*
+********************************************************************/
+#include <windows.h>
+#include <commctrl.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "process.h"
+#include "project.h"
+#include "main.h"
+#include "rsrc.h"
+
+#define MSG_MODIFIED "Modified"
+
+CCriticalSection CriticalSection;
+extern CMessageBox MsgBox;
+CFindReplaceDlg EditorDlg;
+void Main_CmdTest(HWND hwnd);
+
+/* Globals */
+char * g_env_path = NULL;
+char * g_vm_path = NULL;
+CWinApp winApp;
+CProject Project;
+CChrono Chrono;
+
+// File filters & flags.
+DWORD singleFileOpen = OFN_EXPLORER | OFN_FILEMUSTEXIST;
+DWORD multipleFileOpen = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT;
+DWORD fileSave = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
+ OFN_OVERWRITEPROMPT;
+
+char * defFilter = "All Sources\0*.c;*.cpp;*.cxx;*.h;*.hpp;*.hxx;*.rc;*.mingw;*.prj\0"
+ "C Files\0*.c;*.cpp;*.cxx;*.rc\0"
+ "Headers\0*.h;*.hpp;*.hxx\0"
+ "Ini file\0*.ini\0"
+ "All Files (*.*)\0*.*\0\0";
+
+char * prjFilter = "Project Files (*.prj)\0*.prj\0All Files (*.*)\0*.*\0\0";
+char * prjDefExt = "prj";
+
+char * srcFilter = "All Sources\0*.c;*.cpp;*.cxx;*.h;*.hpp;*.hxx;*.rc\0"
+ "C Files\0*.c;*.cpp;*.cxx;*.rc\0"
+ "Headers\0*.h;*.hpp;*.hxx\0"
+ "All Files (*.*)\0*.*\0\0";
+char * srcDefExt = "cpp";
+
+/* For tests */
+ CChooseFontDlg CChooseFont;
+void Main_CmdTest(HWND){
+ winApp.Process.AddTask(
+ "sh.exe",
+ IN_PIPE || OUTERR_PIPE,
+ LVOUT_ERROR);
+ winApp.Process.Run();
+/* CChooseFont.Create(&winApp);*/
+return;
+}
+
+
+/********************************************************************
+* Class: CFileDlg.
+*
+* Purpose: A CFileDlgBase for Open/Save dlg boxes.
+*
+* Revisions:
+*
+********************************************************************/
+CFileDlg::CFileDlg(){
+}
+
+CFileDlg::~CFileDlg(){
+}
+
+bool CFileDlg::Open(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag){
+
+ switch(fileflag){
+ // Project file.
+ case PRJ_FILE:
+ SetData(prjFilter, prjDefExt, singleFileOpen);
+ break;
+
+ // Add multiple files to project.
+ case ADD_SRC_FILE:
+ Reset();
+ SetTitle("Add files to project");
+ nMaxFile = 2048;
+ SetFilterIndex(1);
+ SetData(srcFilter, srcDefExt, multipleFileOpen);
+ break;
+
+ default: // SRC_FILE
+ SetData(defFilter, srcDefExt, singleFileOpen);
+ SetFilterIndex(1);
+ break;
+ }
+return OpenFileName(pWindow, pszFileName, nMaxFile);
+}
+
+bool CFileDlg::Save(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag){
+ Reset();
+
+ switch(fileflag){
+ case SRC_FILE:
+ SetData(defFilter, srcDefExt, fileSave);
+ SetFilterIndex(1);
+ break;
+
+ default: // PRJ_FILE
+ SetData(prjFilter, prjDefExt, fileSave);
+ break;
+ }
+return SaveFileName(pWindow, pszFileName, nMaxFile);
+}
+
+
+/********************************************************************
+* Class: CPreferencesDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CPreferencesDlg::CPreferencesDlg(){
+}
+
+CPreferencesDlg::~CPreferencesDlg(){
+}
+
+int CPreferencesDlg::Create(void){
+return CreateModal(&winApp, IDD_PREFERENCES, (LPARAM) this);
+}
+
+LRESULT CALLBACK CPreferencesDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_NOTIFY:
+ OnNotify((int) wParam, (LPNMHDR) lParam);
+ break;
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CPreferencesDlg::OnInitDialog(HWND, LPARAM){
+ // Tab control handle and TCITEM.
+ _hWndTab = ::GetDlgItem(_hWnd, IDC_PREF_TABS);
+ tcitem.mask = TCIF_TEXT | TCIF_PARAM;
+
+ // Insert tabs.
+ HWND hwndChild = EnvDlg.Create(this, IDD_ENVIRON, NULL, (long) NULL);
+ tcitem.pszText = "Environment";
+ tcitem.lParam = (long) &EnvDlg;
+ ::SendMessage(_hWndTab, TCM_INSERTITEM, 0, (LPARAM)&tcitem);
+ SetChildPosition(hwndChild);
+
+/* tcitem.pszText = "General";
+ tcitem.lParam = (long) NULL;
+ ::SendMessage(_hWndTab, TCM_INSERTITEM, 1, (LPARAM)&tcitem);
+
+ tcitem.pszText = "Find in files";
+ tcitem.lParam = (long) NULL;
+ ::SendMessage(_hWndTab, TCM_INSERTITEM, 2, (LPARAM)&tcitem);*/
+
+ // Show the dialog and default pane.
+ Show();
+ EnvDlg.Show();
+ EnvDlg.SetFocus();
+return TRUE;
+}
+
+BOOL CPreferencesDlg::OnCommand(WORD, WORD wID, HWND){
+ switch (wID){
+ case IDOK:
+ EnvDlg.OnCommand(0, wID, 0);
+ EndDlg(IDOK);
+ return TRUE;
+
+ case IDCANCEL:
+ EndDlg(IDCANCEL);
+ return FALSE;
+
+ case IDAPPLY:
+ EnvDlg.OnCommand(0, wID, 0);
+ return TRUE;
+ }
+return FALSE;
+}
+
+BOOL CPreferencesDlg::EndDlg(int nResult){
+ EnvDlg.EndDlg(0);
+ EnvDlg.bIsVisible = false;
+ if (_hWnd){
+ BOOL result = ::EndDialog(_hWnd, nResult);
+ _hWnd = 0;
+ return result;
+ }
+return false;
+}
+
+
+/********************************************************************
+* Class: CEnvDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CEnvDlg::CEnvDlg(){
+}
+
+CEnvDlg::~CEnvDlg(){
+}
+
+LRESULT CALLBACK CEnvDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CEnvDlg::OnInitDialog(HWND, LPARAM){
+ bIsVisible = false;
+ bModified = false;
+ /* Get control handles */
+ hApply = ::GetDlgItem(_pParent->_hWnd, IDAPPLY);
+ hSetCcBin = GetItem(IDC_SET_CCBIN);
+ hCcBinDir = GetItem(IDC_CCBIN);
+ hBrowseCc = GetItem(IDC_BROWSE_CC);
+ hSetCmdBin = GetItem(IDC_SET_CMDBIN);
+ hCmdBinDir = GetItem(IDC_CMDBIN);
+ hBrowseCmd = GetItem(IDC_BROWSE_CMD);
+ hAutoexec = GetItem(IDC_AUTOEXEC);
+ hEnvView = GetItem(IDC_ENV_VIEW);
+
+ if (winApp.bSetCcEnv)
+ ::SendMessage(hSetCcBin, BM_SETCHECK, BST_CHECKED, 0);
+ if (winApp.bSetCmdEnv)
+ ::SendMessage(hSetCmdBin, BM_SETCHECK, BST_CHECKED, 0);
+ if (winApp.bSetDefEnv)
+ ::SendMessage(hAutoexec, BM_SETCHECK, BST_CHECKED, 0);
+
+ SetItemText(hCcBinDir, winApp.szCcBinDir);
+ SetItemText(hCmdBinDir, winApp.szCmdBinDir);
+ SetEnvText();
+/* hCcIncDir = GetItem(IDC_CC_INCDIR);
+
+ SetItemText(hCcIncDir, winApp.includeDir);*/
+ bIsVisible = true;
+return TRUE;
+}
+
+BOOL CEnvDlg::OnCommand(WORD wNotifyCode, WORD wID, HWND){
+ char directory[MAX_PATH];
+
+ switch (wID){
+ case IDC_BROWSE_CC:
+ if (winApp.ShellDlg.BrowseForFolder(&winApp, directory, "Browse",
+ BIF_RETURNONLYFSDIRS)){
+ SetItemText(hCcBinDir, directory);
+ }
+ return TRUE;
+
+ case IDC_BROWSE_CMD:
+ if (winApp.ShellDlg.BrowseForFolder(&winApp, directory, "Browse",
+ BIF_RETURNONLYFSDIRS)){
+ SetItemText(hCmdBinDir, directory);
+ }
+ return TRUE;
+
+ case IDOK:
+ winApp.bSetCcEnv =
+ (BST_CHECKED==::SendMessage(hSetCcBin, BM_GETCHECK, 0, 0));
+ winApp.bSetCmdEnv =
+ (BST_CHECKED==::SendMessage(hSetCmdBin, BM_GETCHECK, 0, 0));
+ winApp.bSetDefEnv =
+ (BST_CHECKED==::SendMessage(hAutoexec, BM_GETCHECK, 0, 0));
+
+ GetItemText(hCcBinDir, winApp.szCcBinDir, MAX_PATH);
+ GetItemText(hCmdBinDir, winApp.szCmdBinDir, MAX_PATH);
+// GetItemText(hCcIncDir, winApp.includeDir, MAX_PATH);
+ if (bModified)
+ winApp.SetEnv();
+ return TRUE;
+
+ case IDCANCEL:
+ return FALSE;
+
+ case IDAPPLY:
+ if (bModified){
+ winApp.bSetCcEnv =
+ (BST_CHECKED==::SendMessage(hSetCcBin, BM_GETCHECK, 0, 0));
+ winApp.bSetCmdEnv =
+ (BST_CHECKED==::SendMessage(hSetCmdBin, BM_GETCHECK, 0, 0));
+ winApp.bSetDefEnv =
+ (BST_CHECKED==::SendMessage(hAutoexec, BM_GETCHECK, 0, 0));
+
+ GetItemText(hCcBinDir, winApp.szCcBinDir, MAX_PATH);
+ GetItemText(hCmdBinDir, winApp.szCmdBinDir, MAX_PATH);
+ winApp.SetEnv();
+ SetEnvText();
+ bModified = false;
+ ::EnableWindow(hApply, false);
+ }
+ return TRUE;
+
+ default:
+ if (bIsVisible && !bModified){
+ switch(wNotifyCode){
+ case EN_CHANGE:
+ case BN_CLICKED:
+ bModified = true;
+ ::EnableWindow(hApply, true);
+ return TRUE;
+ }
+ }
+ break;
+ }
+return FALSE;
+}
+
+void CEnvDlg::SetEnvText(void){
+ if (g_vm_path){
+ char * text = (char *) malloc(strlen(g_vm_path)+20); // 10 lines max.
+ char * start = text;
+ char * parse = g_vm_path;
+ while (*parse){
+ if (*parse == ';'){
+ // Change ';' into CR/LF.
+ *text = '\r';
+ text++;
+ *text = '\n';
+ text++;
+ parse++;
+ }else if (*parse == '='){
+ // Rewind buffer.
+ text = start;
+ parse++;
+ }else{
+ // Copy one char.
+ *text = *parse;
+ text++;
+ parse++;
+ }
+ }
+ *text = '\0';
+ SetItemText(hEnvView, start);
+ free(start);
+ }
+}
+
+
+/********************************************************************
+* Class: CGrepDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CGrepDlg::CGrepDlg(){
+ *findWhat = '\0';
+ *gDir = '\0';
+}
+
+CGrepDlg::~CGrepDlg(){
+}
+
+int CGrepDlg::Create(void){
+return CreateModal(&winApp, IDD_GREP, (LPARAM) this);
+}
+
+LRESULT CALLBACK CGrepDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CGrepDlg::OnInitDialog(HWND, LPARAM){
+ hFindWhat = GetItem(IDC_FINDWHAT);
+ hgDir = GetItem(IDC_GFILTER);
+
+ SetItemText(hFindWhat, findWhat);
+ SetItemText(hgDir, gDir);
+ // Show the dialog and default pane.
+ Show();
+return TRUE;
+}
+
+BOOL CGrepDlg::OnCommand(WORD, WORD wID, HWND){
+ switch (wID){
+ case IDOK:
+ GetItemText(hFindWhat, findWhat, sizeof(findWhat));
+ GetItemText(hgDir, gDir, sizeof(gDir));
+ FindInFiles(findWhat, gDir);
+ return TRUE;
+
+ case IDCANCEL:
+ EndDlg(IDCANCEL);
+ return FALSE;
+ }
+return FALSE;
+}
+
+void CGrepDlg::FindInFiles(char * findWhat, char * fileFilter){
+ if (!findWhat || !fileFilter || winApp.Process.isRunning())
+ return;
+
+ winApp.Report.Clear();
+ winApp.Report.Append("Grep search...", LVOUT_NORMAL);
+
+ winApp.Process.AddTask("grep -G -n -H ", OUTERR_PIPE, LVOUT_ERROR);
+ winApp.Process.CmdCat(findWhat);
+ winApp.Process.CmdCat(" ");
+ winApp.Process.CmdCat(fileFilter);
+
+ winApp.Process.Run();
+}
+
+
+/********************************************************************
+* Functions: WinMain procedure.
+*
+* Purpose: Runs the application.
+*
+* Revisions:
+*
+********************************************************************/
+int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
+return winApp.Run(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
+}
+
+
+/********************************************************************
+* Class: CWinApp.
+*
+* Purpose: Manages the all application.
+*
+* Revisions:
+*
+********************************************************************/
+CWinApp::CWinApp(){
+ *iniFileName = '\0';
+ hmod = NULL;
+ *openFilesDir ='\0';
+ *projectDir = '\0';
+ *includeDir = '\0';
+ bSetCcEnv = false;
+ bSetCmdEnv = false;
+ bSetDefEnv = false;
+ *szCcBinDir = '\0';
+ *szCmdBinDir = '\0';
+
+ firstRun = false;
+ // Child windows dimensions.
+ deltaY = 0;
+ tbarHeight = 26;
+ sbarHeight = 20;
+ tvWidth = 140;
+ lvHeight = 120;
+
+ hSplitter = 4;
+ vSplitter = 4;
+}
+
+CWinApp::~CWinApp(){
+}
+
+bool CWinApp::CustomInit(void){
+ /* Get PATH environment variable */
+ char * env_path = getenv("PATH");
+ if (env_path)
+ g_env_path = strdup(env_path);
+
+ SetName("Visual MinGW", APP_VERSION);
+ MsgBox.SetCaption("Visual MinGW");
+ IsWinNT();
+ ReadIniFile("visual-mingw.ini");
+
+ hAccel = LoadAccelerators(_hInst, "ACCELS");
+ hmod = LoadLibrary("SciLexer.DLL");
+ if (!hmod){
+ MsgBox.DisplayFatal("Unable to load SciLexer.DLL");
+ return false;
+ }
+return true;
+}
+
+bool CWinApp::Release(void){
+ WriteIniFile();
+ if (hmod)
+ FreeLibrary(hmod);
+ if (g_env_path)
+ free(g_env_path);
+return true;
+}
+
+bool CWinApp::ReadIniFile(char * fileName){
+ ParseCmdLine(iniFileName);
+ strcat(iniFileName, fileName);
+
+ if (!IniFile.Load(iniFileName)){
+ /* Create an empty file and fill it */
+ firstRun = true;
+ MsgBox.DisplayWarning("Visual-MinGW first run !\n"
+ "Step 1: User interface initialization.\n"
+ "Please report bugs to Visual-MinGW home page.\n"
+ "See the Readme text for more information.");
+ FILE * file = fopen(iniFileName, "wb");
+ if (!file)
+ return false;
+ SaveIniFile(file);
+ fclose(file);
+ return false;
+ }
+ // [General] section
+ IniFile.GetString(openFilesDir, "FilesDirectory", "General" );
+ IniFile.GetString(projectDir, "ProjectDirectory" );
+ bSetDefEnv = IniFile.GetInt( "SetDefEnv" );
+ bSetCmdEnv = IniFile.GetInt( "SetBinDir" );
+ IniFile.GetString(szCmdBinDir, "BinDir" );
+ // [Compiler] section
+ IniFile.GetString(includeDir, "IncludeDir", "Compiler" );
+ bSetCcEnv = IniFile.GetInt( "SetBinDir" );
+ IniFile.GetString(szCcBinDir, "BinDir" );
+
+ SetEnv();
+return true;
+}
+
+void CWinApp::SaveIniFile(FILE * file){
+ // [General]
+ fprintf (file, "\t; Generated automatically by Visual-MinGW.\n");
+ fprintf (file, "\t ; http://visual-mingw.sourceforge.net/\n");
+ fprintf (file, "[General]\nSignature = 40");
+ fprintf (file, "\nFilesDirectory = %s", openFilesDir);
+ fprintf (file, "\nProjectDirectory = %s", projectDir);
+ fprintf (file, "\nTvWidth = %d", tvWidth);
+ fprintf (file, "\nLvHeight = %d", lvHeight);
+ fprintf (file, "\nSetDefEnv = %d", bSetDefEnv);
+ fprintf (file, "\nSetBinDir = %d", bSetCmdEnv);
+ fprintf (file, "\nBinDir = %s", szCmdBinDir);
+ // [Compiler]
+ fprintf (file, "\n\n[Compiler]\nIncludeDir = %s", includeDir);
+ fprintf (file, "\nSetBinDir = %d", bSetCcEnv);
+ fprintf (file, "\nBinDir = %s", szCcBinDir);
+}
+
+bool CWinApp::WriteIniFile(void){
+ if (*iniFileName == '\0')
+ return false;
+ FILE * file = fopen(iniFileName, "wb");
+ if (!file)
+ return false;
+ SaveIniFile(file);
+ fclose(file);
+ IniFile.Close();
+return true;
+}
+
+bool CWinApp::SetEnv(void){
+ // Free previous variable.
+ //getenv("PATH=");
+ // Malloc a buffer.
+ int len = 0;
+ if (bSetCcEnv)
+ len += strlen(winApp.szCcBinDir);
+ if (bSetCmdEnv)
+ len += strlen(winApp.szCmdBinDir);
+ if (bSetDefEnv && g_env_path)
+ len += strlen(g_env_path);
+ g_vm_path = (char *) malloc(len+8);
+
+ // Copy the environment variable.
+ strcpy(g_vm_path, "PATH=");
+ if (bSetCcEnv && *winApp.szCcBinDir){
+ strcat(g_vm_path, winApp.szCcBinDir);
+ strcat(g_vm_path, ";");
+ }
+ if (bSetCmdEnv && *winApp.szCmdBinDir){
+ strcat(g_vm_path, winApp.szCmdBinDir);
+ strcat(g_vm_path, ";");
+ }
+ if (bSetDefEnv && g_env_path)
+ strcat(g_vm_path, g_env_path);
+
+ len = strlen(g_vm_path) - 1;
+ if (g_vm_path[len] == ';')
+ g_vm_path[len] = '\0';
+ if (putenv(g_vm_path) == -1){
+ free(g_vm_path);
+ g_vm_path = NULL;
+ return false;
+ }
+return true;
+}
+
+
+/********************************************************************
+* CWinApp: Create each application's window.
+********************************************************************/
+bool CWinApp::CreateUI(void){
+
+ InitCommonControls();
+
+ // Custom values.
+ wc.style = 0;
+ wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wc.hCursor = NULL;
+ wc.hbrBackground = //NULL;
+ (HBRUSH)(COLOR_INACTIVEBORDER + 1);
+ wc.lpszMenuName = MAKEINTRESOURCE(ID_MENU);
+ wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
+
+ if(!MainRegisterEx("main_class")) {
+ MsgBox.DisplayFatal("Can't Register Main Window");
+ return false;
+ }
+
+ // Custom values.
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = 0;
+
+ if(!ChildRegisterEx("child_class")) {
+ MsgBox.DisplayFatal("Can't Register MDI Class");
+ return false;
+ }
+
+ // Use a CreateWindowEx like procedure.
+ HWND hwnd = CreateEx(
+ this, // Owner class.
+ 0,
+ mainClass,
+ appName,
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ 0,
+ NULL);
+
+ if(!hwnd) {
+ MsgBox.DisplayFatal("Can't create Main window");
+ return false;
+ }
+ MsgBox.SetParent(hwnd);
+
+ // SW_SHOWMAXIMIZED.
+ ::ShowWindow(hwnd, SW_SHOWMAXIMIZED);
+ ::UpdateWindow(hwnd);
+ if (firstRun)
+ FirstRunTest();
+ firstRun = false;
+return true;
+}
+
+void CWinApp::FirstRunTest(void){
+ MsgBox.DisplayWarning("Visual-MinGW first run !\n"
+ "Step 2: You will now set your environment variables.\n"
+ "\"Use default environment variables\" should be checked.\n"
+ "Then Visual-MinGW will try to launch the compiler.");
+ PreferencesDlg.Create();
+ MsgBox.DisplayWarning("Visual-MinGW first run !\n"
+ "Step 3: Installation checking.\n"
+ "Try to launch rm and gcc.\n"
+ "See \"Main\" or \"Log\" report views for results.\n");
+ winApp.Report.Clear();
+ winApp.Report.Append("Testing for first run...", LVOUT_NORMAL);
+
+ // Put the command line and the run flag in the command stack.
+ winApp.Process.AddTask("gcc -v", OUTERR_PIPE, LVOUT_NORMAL);
+ winApp.Process.AddTask("rm --version", OUTERR_PIPE, LVOUT_NORMAL);
+ winApp.Process.Run();
+return;
+}
+
+void CWinApp::CreateToolbar(void){
+ Toolbar.CreateEx(
+ this,
+ 0,
+ WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ |TBSTYLE_FLAT | TBSTYLE_TOOLTIPS
+ | CCS_NORESIZE);
+
+ Toolbar.AddBitmap(IDB_TOOLBAR, 15);
+
+ TBBUTTON tbButtons [] =
+ { { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
+ { 0, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0},
+ { 1, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0},
+ { 2, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0},
+ { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
+ { 3, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0},
+ { 4, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0},
+ { 5, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0},
+ { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
+ { 6, IDM_UNDO, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0},
+ { 7, IDM_REDO, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0} };
+
+ int numbutton = sizeof tbButtons/sizeof tbButtons[0];
+
+ Toolbar.AddButtons(&tbButtons[0], numbutton);
+}
+
+void CWinApp::CreateSplitter(void){
+ MainSplitter.Init(&ChildSplitter, &Report, SPLSTYLE_HORZ, lvHeight, SPLMODE_2);
+ ChildSplitter.Init(&Manager, &MdiClient, SPLSTYLE_VERT, tvWidth, SPLMODE_1);
+
+ // File Manager.
+ Manager.Create(this);
+ // MDI client.
+ CreateMDI();
+ // ListView.
+ Report.Create(this);
+}
+
+void CWinApp::CreateMDI(void){
+ MdiClient.Init(3, ID_FIRSTCHILD);
+ MdiClient.CreateEx(
+ this,
+ WS_EX_CLIENTEDGE,
+ WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ | WS_VSCROLL | WS_HSCROLL
+ );
+}
+
+HWND CWinApp::CreateChild(char * caption, LPVOID lParam){
+
+ CChildView * mdiChild = new CChildView;
+
+ HWND hwnd = mdiChild->CreateEx(
+ &MdiClient, // MUST be an MdiClient *.
+ WS_EX_MDICHILD,
+ MDIS_ALLCHILDSTYLES | WS_CHILD | WS_SYSMENU | WS_CAPTION
+ | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
+ | WS_MAXIMIZE,
+ caption,
+ 0,
+ lParam);
+
+ if (!hwnd)
+ delete mdiChild;
+return hwnd;
+}
+
+void CWinApp::CreateStatusBar(void){
+ Sbar.CreateEx(
+ this,
+ 0,
+ WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBARS_SIZEGRIP);
+
+ int sbWidths[] = {60, 120, -1};
+
+ int numparts = sizeof sbWidths/sizeof sbWidths[0];
+
+ Sbar.SetParts(numparts, &sbWidths[0]);
+}
+
+void CWinApp::SendCaretPos(int caretPos) {
+ // To display the "Line : xxxx" message, we use our standard msgBuf[256].
+ sprintf(msgBuf, "Line : %d", caretPos);
+ Sbar.SendMessage(SB_SETTEXT, 0, (LPARAM) msgBuf);
+return;
+}
+
+
+/********************************************************************
+* CWinApp: Message handling procedures.
+********************************************************************/
+LRESULT CALLBACK CWinApp::CMainWndProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_CREATE:
+ return OnCreate((LPCREATESTRUCT) lParam);
+
+ case WM_PAINT:
+ return OnPaint((HDC) wParam);
+
+ case WM_SIZE:
+ return OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
+
+ case WM_DESTROY:
+ return OnDestroy();
+
+ case WM_COMMAND:
+ return OnCommand(wParam, lParam);
+
+ case WM_CLOSE:
+ return OnClose();
+
+ case WM_NOTIFY:
+ return OnNotify((int) wParam, (LPNMHDR) lParam);
+
+ case WM_LBUTTONDOWN:
+ return OnLButtonDown((short) LOWORD(lParam), (short) HIWORD(lParam), wParam);
+
+ case WM_MOUSEMOVE:
+ return OnMouseMove((short) LOWORD(lParam), (short) HIWORD(lParam), wParam);
+
+ case WM_LBUTTONUP:
+ return OnLButtonUp((short) LOWORD(lParam), (short) HIWORD(lParam), wParam);
+
+ case WM_SETCURSOR:
+ OnSetCursor((HWND) wParam, (UINT) LOWORD(lParam), (UINT) HIWORD(lParam));
+ return DefWindowProc(_hWnd, Message, wParam, lParam);
+
+ default:
+ return DefFrameProc(_hWnd, MdiClient.GetId(), Message, wParam, lParam);
+ }
+return 0;
+}
+
+BOOL CWinApp::OnCreate(LPCREATESTRUCT){
+ // Toolbar.
+ CreateToolbar();
+ // Splitter.
+ CreateSplitter();
+ // Statusbar.
+ CreateStatusBar();
+return TRUE;
+}
+
+BOOL CWinApp::OnPaint(HDC){
+ PAINTSTRUCT ps;
+ BeginPaint(_hWnd, &ps);
+ EndPaint(_hWnd, &ps);
+return 0;
+}
+
+BOOL CWinApp::OnSize(UINT, int width, int height){
+ // TreeView and MDI Client delta-height.
+ deltaY = height-sbarHeight-lvHeight-vSplitter-tbarHeight;
+
+ if (deltaY>3){
+ Toolbar.SetPosition(0,
+ 0, 0,
+ width, tbarHeight,
+ 0);
+
+ MainSplitter.SetPosition(0,
+ 0, tbarHeight,
+ width, height-tbarHeight-sbarHeight,
+ 0);
+
+ Sbar.SetPosition(0,
+ 0, height-sbarHeight,
+ width, sbarHeight,
+ 0);
+ }
+ InvalidateRect(_hWnd, NULL, false);
+return 0;
+}
+
+BOOL CWinApp::OnDestroy(void){
+ PostQuitMessage(0);
+return 0;
+}
+
+BOOL CWinApp::OnClose(void){
+ if (IDCANCEL == Manager.SaveAll(IDASK)) // Ask to save.
+ return TRUE; // Cancelled by user.
+ ::DestroyWindow(_hWnd);
+return 0;
+}
+
+BOOL CWinApp::OnNotify(int idCtrl, LPNMHDR notify){
+ Manager.OnNotify(idCtrl, notify);
+ Report.OnNotify(idCtrl, notify);
+return 0;
+}
+
+BOOL CWinApp::OnLButtonDown(short xPos, short yPos, UINT){
+ MainSplitter.OnLButtonDown(_hWnd, xPos, yPos);
+ ChildSplitter.OnLButtonDown(_hWnd, xPos, yPos);
+return 0;
+}
+
+BOOL CWinApp::OnMouseMove(short xPos, short yPos, UINT){
+ MainSplitter.OnMouseMove(_hWnd, xPos, yPos);
+ ChildSplitter.OnMouseMove(_hWnd, xPos, yPos);
+return 0;
+}
+
+BOOL CWinApp::OnLButtonUp(short xPos, short yPos, UINT){
+ MainSplitter.OnLButtonUp(_hWnd, xPos, yPos);
+ ChildSplitter.OnLButtonUp(_hWnd, xPos, yPos);
+return 0;
+}
+
+BOOL CWinApp::OnSetCursor(HWND, UINT nHittest, UINT){
+ if (nHittest == HTCLIENT) {
+ if (MainSplitter.OnSetCursor(_hWnd, 0)){
+ return 0;
+ }else if (ChildSplitter.OnSetCursor(_hWnd, 0)){
+ return 0;
+ }else{
+ ::SetCursor(::LoadCursor(NULL, IDC_ARROW));
+ }
+ }
+return 0;
+}
+
+
+/********************************************************************
+* CWinApp: Dispatch command messages.
+********************************************************************/
+BOOL CWinApp::OnCommand(WPARAM wParam, LPARAM lParam){
+ int wID = LOWORD(wParam);
+
+ switch (wID){
+ /* File Menu */
+ case IDM_NEW:
+ Manager.FilesView.New();
+ break;
+
+ case IDM_OPEN:
+ Manager.OpenFileDialog();
+ break;
+
+ case IDM_NEW_PROJECT:
+ Manager.NewProjectDialog();
+ break;
+
+ case IDM_OPEN_PROJECT:
+ Manager.OpenProjectDialog();
+ break;
+
+ case IDM_SAVE_PROJECT:
+ Manager.SaveProjectFiles(IDYES);
+ break;
+
+ case IDM_CLOSE_PROJECT:
+ Manager.CloseProject();
+ break;
+
+ case IDM_PREFERENCES:
+ PreferencesDlg.Create();
+ break;
+
+ case IDM_QUIT:
+ PostMessage(_hWnd, WM_CLOSE, 0, 0);
+ break;
+
+ /* Find Menu */
+ case IDM_GREP:
+ GrepDlg.Create();
+ break;
+
+ /* Window Menu */
+ case IDM_CASCADE:
+ PostMessage(MdiClient.GetId(), WM_MDICASCADE, 0, 0);
+ break;
+ case IDM_TILEHORZ:
+ PostMessage(MdiClient.GetId(), WM_MDITILE, MDITILE_HORIZONTAL, 0);
+ break;
+ case IDM_TILEVERT:
+ PostMessage(MdiClient.GetId(), WM_MDITILE, MDITILE_VERTICAL, 0);
+ break;
+ case IDM_ARRANGE:
+ PostMessage(MdiClient.GetId(), WM_MDIICONARRANGE, 0, 0);
+ break;
+
+ /* Project Menu */
+ case IDM_NEW_MODULE:
+ Project.NewModuleDlg();
+ break;
+
+ case IDM_ADD:
+ Project.AddFiles();
+ break;
+
+ case IDM_REMOVE_FILE:
+ Manager.RemoveProjectFile();
+ break;
+
+ case IDM_REMOVE_MODULE:
+ Manager.RemoveProjectModule();
+ break;
+
+ case IDM_OPTION:
+ Project.OptionsDlg();
+ break;
+
+ case IDM_ZIP_SRCS:
+ Project.ZipSrcs();
+ break;
+
+ case IDM_EXPLORE:
+ Project.Explore(_hWnd);
+ break;
+
+ /* Build Menu */
+ case IDM_BUILD:
+ Project.Build();
+ break;
+
+ case IDM_REBUILDALL:
+ Project.RebuildAll();
+ break;
+
+ case IDM_RUN_TARGET:
+ Project.RunTarget();
+ break;
+
+ case IDM_MKCLEAN:
+ Project.MakeClean();
+ break;
+
+ case IDM_MKF_BUILD:
+ Project.BuildMakefile();
+ break;
+
+ case IDM_RUN_CMD:
+ winApp.Process.CommandDlg.Create();
+ break;
+
+ case IDM_TEST:
+ Main_CmdTest(_hWnd);
+ break;
+
+ default:{
+ if (wID >= ID_FIRSTCHILD){
+ DefFrameProc(_hWnd, MdiClient.GetId(), WM_COMMAND, wParam, lParam);
+ }else{
+ HWND hChildWindow = (HWND) MdiClient.SendMessage(WM_MDIGETACTIVE);
+
+ if (hChildWindow)
+ ::SendMessage(hChildWindow, WM_COMMAND, wParam, lParam);
+ }
+ }
+ }
+return TRUE;
+}
+
+
+/********************************************************************
+* CWinApp: Handles child messages.
+********************************************************************/
+LRESULT CALLBACK CWinApp::CChildWndProc(CWindow * pWnd, UINT Message, WPARAM wParam, LPARAM lParam){
+
+ CChildView * childView = (CChildView *) pWnd;
+ HWND hwndChild = childView->_hWnd;
+
+ switch(Message){
+ case WM_CREATE:
+ childView->OnCreate((LPCREATESTRUCT) lParam);
+ break;
+
+ case WM_SIZE:
+ childView->OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
+ break;
+
+ case WM_COMMAND:
+ childView->OnCommand(wParam, lParam);
+ break;
+
+ case WM_DESTROY:
+ childView->OnDestroy();
+ break;
+
+ case WM_CLOSE:
+ if (childView->OnClose()){
+ MdiClient.SendMessage(WM_MDIDESTROY,(WPARAM) hwndChild, 0);
+ }
+ return true;
+
+ case WM_NOTIFY:
+ childView->OnNotify((int) wParam, (LPNMHDR) lParam);
+ break;
+
+ case WM_SETFOCUS:
+ childView->OnSetFocus((HWND) wParam);
+ break;
+
+ case WM_MDIACTIVATE:
+ childView->OnActivate((HWND) wParam, (HWND) lParam);
+ break;
+ }
+return DefMDIChildProc(hwndChild, Message, wParam, lParam);
+}
+
+
+/********************************************************************
+* Class: CChildView.
+*
+* Purpose: MDI child window class.
+*
+* Revisions:
+*
+********************************************************************/
+CChildView::CChildView(){
+ modified = false;
+}
+
+CChildView::~CChildView(){
+}
+
+bool CChildView::OnCreate(LPCREATESTRUCT){
+ CFileItem * file = (CFileItem *) GetLong(GWL_USERDATA);
+
+ // Create Scintilla Editor Control.
+ HWND hwnd = Editor.CreateEx(
+ this,
+ 0,
+ WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ | WS_VSCROLL | WS_HSCROLL);
+
+ if (!hwnd)
+ return false; // @@TODO need to manage creation failure.
+
+ // Set window handles
+ file->pMdiChild = this;
+
+ // Load a file if there is one to load.
+ Editor.LoadFile(file);
+return true;
+}
+
+bool CChildView::OnSize(UINT wParam, int width, int height){
+ if(wParam != SIZE_MINIMIZED){
+ Editor.SetPosition(0,
+ 0,
+ 0,
+ width,
+ height,
+ 0);
+ }
+return true;
+}
+
+BOOL CChildView::OnClose(void){
+ if (modified){
+ int decision = MsgBox.AskToSave(true);
+ switch (decision){
+ case IDCANCEL:
+ return FALSE;
+
+ case IDYES:
+ CmdSave();
+ break;
+ }
+ }
+return TRUE;
+}
+
+BOOL CChildView::OnDestroy(void){
+ CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA);
+
+ if (file){
+ if (!file->isInProject){
+ // A simple file.
+ winApp.Manager.FilesView.CloseFile(file);
+ }else{
+ // A project one.
+ file->pMdiChild = NULL;
+ //modified = false;
+ }
+ }
+return 0;
+}
+
+BOOL CChildView::OnNotify(int, LPNMHDR notify){
+ SCNotification * notification = (SCNotification *) notify;
+
+ // Notify Message from Current Editor Control.
+ if (notify->hwndFrom == Editor._hWnd){
+ switch (notify->code){
+ case SCN_UPDATEUI:
+ Editor.GetCurrentPos();
+ winApp.SendCaretPos(Editor.caretPos);
+ break;
+
+ case SCN_SAVEPOINTREACHED:
+ modified = false;
+ winApp.Sbar.WriteString("", 1);
+ break;
+
+ case SCN_SAVEPOINTLEFT:
+ modified = true;
+ winApp.Sbar.WriteString(MSG_MODIFIED, 1);
+ break;
+
+ case SCN_MARGINCLICK:
+ if (notification->margin == 2)
+ Editor.MarginClick(notification->position, notification->modifiers);
+ break;
+ }
+ }
+return 0;
+}
+
+BOOL CChildView::OnSetFocus(HWND){
+ CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA);
+ if (!file)
+ return false;
+ // Select corresponding TreeView item.
+ CTreeView * pTreeView = file->pTreeView;
+
+ if(!pTreeView)
+ return false;
+
+ pTreeView->SendMessage(TVM_SELECTITEM, (WPARAM)TVGN_CARET, (LPARAM)file->_hItem);
+
+ // Set Focus on Editor Control.
+ Editor.SetFocus();
+
+ // Display "Modified" message or nothing in the Status Bar.
+ winApp.SendCaretPos(Editor.caretPos);
+
+ if(modified)
+ winApp.Sbar.SendMessage(SB_SETTEXT, 1, (LPARAM) MSG_MODIFIED);
+ else
+ winApp.Sbar.SendMessage(SB_SETTEXT, 1, (LPARAM) "");
+
+ int selectedTab = winApp.Manager.SendMessage(TCM_GETCURSEL);
+
+ if (file->isInProject == true && selectedTab != PROJECT_TAB){
+ winApp.Manager.SendMessage(TCM_SETCURFOCUS, PROJECT_TAB);
+ }else if (file->isInProject == false && selectedTab != FILES_TAB){
+ winApp.Manager.SendMessage(TCM_SETCURFOCUS, FILES_TAB);
+ }
+return 0;
+}
+
+BOOL CChildView::OnActivate(HWND, HWND hwndChildAct){
+ HMENU hMenu;
+ HMENU hFileMenu;
+ BOOL EnableFlag;
+ HWND hwndMain = winApp._hWnd;
+
+ hMenu = GetMenu(hwndMain);
+
+ if(_hWnd == hwndChildAct){
+ EnableFlag = TRUE; //being activated
+ }else{
+ EnableFlag = FALSE; //being de-activated
+ }
+ // Menu items.
+ EnableMenuItem(hMenu, 1, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
+ EnableMenuItem(hMenu, 3, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
+
+ // Sub-menu items.
+ hFileMenu = GetSubMenu(hMenu, 0);
+ EnableMenuItem(hFileMenu, IDM_SAVE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
+ EnableMenuItem(hFileMenu, IDM_SAVEAS, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
+ hFileMenu = GetSubMenu(hMenu, 2);
+ EnableMenuItem(hFileMenu, IDM_FIND, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
+ EnableMenuItem(hFileMenu, IDM_REPLACE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
+ DrawMenuBar(hwndMain);
+return 0;
+}
+
+void CChildView::CmdSave(void){
+ CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA);
+
+ if (!file)
+ return;
+ /* Untitled file ? */
+ if (file->nFileOffset == 0){
+ CmdSaveAs();
+ return;
+ }
+
+ if (!file->isInProject){
+ // A simple file.
+ Editor.SaveFile(file->szFileName);
+ }else{
+ // A project one.
+ Project.szDirBuffer[Project.nFileOffset - 1] = '\\';
+ strcpy(&Project.szDirBuffer[Project.nFileOffset], file->szFileName);
+ Editor.SaveFile(Project.szDirBuffer);
+ Project.szDirBuffer[Project.nFileOffset - 1] = '\0';
+ }
+}
+
+void CChildView::CmdSaveAs(void){
+ CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA);
+ if (!file)
+ return;
+
+ char fileName[MAX_PATH];
+ if (!winApp.FileDlg.Save(&winApp, fileName, MAX_PATH, SRC_FILE)) //@@
+ return; // canceled by user
+
+ ::SetWindowText(_hWnd, fileName);
+ strcpy(file->szFileName, fileName);
+
+ Editor.SaveFile(file->szFileName);
+ //@@ TODO we need to check for errors
+}
+
+BOOL CChildView::OnCommand(WPARAM wParam, LPARAM){
+ CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA);
+
+ if(!file)
+ return false;
+
+ switch (LOWORD(wParam)){
+ case IDM_SAVE:
+ CmdSave();
+ break;
+
+ case IDM_SAVEAS:
+ CmdSaveAs();
+ break;
+
+ case IDM_SAVEALL:
+ winApp.Manager.SaveAll(IDYES); // Silent.
+ break;
+
+/* case IDM_CLOSE:
+ PostMessage(pWnd, WM_CLOSE, 0, 0);
+ break;
+*/
+ // To Scintilla control.
+ case IDM_FIND:
+ EditorDlg.Find(&Editor);
+ break;
+
+ case IDM_REPLACE:
+ EditorDlg.Replace(&Editor);
+ break;
+
+ case IDM_CUT:
+ Editor.SendMessage(SCI_CUT);
+ break;
+ case IDM_COPY:
+ Editor.SendMessage(SCI_COPY);
+ break;
+ case IDM_PASTE:
+ Editor.SendMessage(SCI_PASTE);
+ break;
+ case IDM_UNDO:
+ Editor.SendMessage(SCI_UNDO);
+ break;
+ case IDM_REDO:
+ Editor.SendMessage(SCI_REDO);
+ break;
+ case IDM_SELECTALL:
+ Editor.SendMessage(SCI_SELECTALL);
+ break;
+ }
+return TRUE;
+}
+
+
+/********************************************************************
+* Class: CManager.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CManager::CManager(){
+}
+
+CManager::~CManager(){
+}
+
+void CManager::OpenFileDialog(void){
+ CFileItem * file = new CFileItem;
+
+ /* Show the "Open file" dialog */
+ winApp.FileDlg.Reset();
+ winApp.FileDlg.SetInitialDir(winApp.openFilesDir);
+
+ if(!winApp.FileDlg.Open(&winApp, file->szFileName, MAX_PATH, SRC_FILE)){
+ delete file;
+ return; // canceled by user
+ }
+
+ /* Get file information */
+ file->nFileExtension = winApp.FileDlg.GetFileExtension();
+ file->nFileOffset = winApp.FileDlg.GetFileOffset();
+ GetFileType(file);
+ // Copy file directory.
+ strncpy(winApp.openFilesDir, file->szFileName, (file->nFileOffset - 1));
+ winApp.openFilesDir[file->nFileOffset-1] = '\0';
+
+ /* Load the file */
+ if(!OpenFile(file)){
+ delete file;
+ MsgBox.DisplayString("This file is already opened.");
+ }
+}
+
+bool CManager::OpenFile(CFileItem * file){
+ if (!file)
+ return false;
+
+ if (!file->isInProject){
+ if (!FilesView.OpenFile(file))
+ return false;
+ }else{
+ if (!ProjectView.OpenFile(file))
+ return false;
+ }
+return true;
+}
+
+bool CManager::NewProjectDialog(void){
+ if(IDYES == Project.CloseDecision())
+ CloseProject();
+
+ char fileName[MAX_PATH];
+ WORD fileOffset;
+ *fileName = '\0';
+
+
+ if (!winApp.FileDlg.Save(&winApp, fileName, MAX_PATH, PRJ_FILE)){
+ return false; // canceled by user
+ }
+ // Copy prj file's directory.
+ fileOffset = winApp.FileDlg.GetFileOffset();
+
+ ProjectView.CreateRoot("Project");
+ if (!Project.New(fileName, fileOffset)){
+ ProjectView.DestroyRoot();
+ ProjectView.DestroyList();
+ return false;
+ }
+return true;
+}
+
+bool CManager::OpenProjectDialog(void){
+ if(IDYES == Project.CloseDecision())
+ CloseProject();
+
+ char fileName[MAX_PATH];
+ WORD offset;
+ *fileName = '\0';
+
+ // Load default values.
+ winApp.FileDlg.Reset();
+ winApp.FileDlg.SetInitialDir(winApp.projectDir);
+
+ if (!winApp.FileDlg.Open(&winApp, fileName, MAX_PATH, PRJ_FILE)){
+ return false; // canceled by user
+ }
+ // Copy project file's directory.
+ offset = winApp.FileDlg.GetFileOffset();
+
+ // Initialize project tree view.
+ ProjectView.CreateRoot(fileName+offset);
+
+ if (!Project.Open(fileName, offset)){
+ ProjectView.DestroyRoot();
+ ProjectView.DestroyList();
+ return false;
+ }
+return true;
+}
+
+bool CManager::CloseProject(void){
+return ProjectView.Close();
+}
+
+void CManager::RemoveProjectFile(void){
+ ProjectView.RemoveFile();
+}
+
+void CManager::RemoveProjectModule(void){
+ ProjectView.RemoveModule();
+}
+
+int CManager::SaveProjectFiles(int decision){
+return ProjectView.SaveAll(decision);
+}
+
+int CManager::SaveAll(int decision){
+ /* Save open files ? */
+ decision = FilesView.SaveAll(decision);
+ /* Save project files ? */
+ decision = ProjectView.SaveAll(decision);
+return decision;
+}
+
+void CManager::CreateImageList(void){
+ // Create an empty image list.
+ ImgList.Create(16, 16, ILC_COLORDDB|ILC_MASK, 8, 1);
+
+ // Load treeview bmp and add it to the image list.
+ CBitmap tvBitmap;
+ tvBitmap.Load(this, IDB_TREEVIEW);
+ ImgList.AddMasked(&tvBitmap, RGB(255,0,255));
+
+ // We no longer need treeview bmp.
+ tvBitmap.Destroy();
+}
+
+void CManager::Create(CWindow * pParent){
+ // Create the Tab Control.
+ CreateEx(
+ pParent,
+ WS_EX_CLIENTEDGE,
+ WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ | TCS_BOTTOM | TCS_FOCUSNEVER);
+
+ // Give it the default font, create tabs, select first one and show the control.
+ SendMessage(WM_SETFONT, (long) GetStockObject(DEFAULT_GUI_FONT), 0);
+
+ InsertItem(FILES_TAB, TCIF_TEXT, 0, 0, "Files", 16, 0, 0);
+ InsertItem(PROJECT_TAB, TCIF_TEXT, 0, 0, "Project", 16, 0, 0);
+ Show();
+
+ // Create an Image list and then the Project TreeView.
+ CreateImageList();
+ ProjectView.Create(this, &ImgList);
+ SetItem_Param(PROJECT_TAB, (long) &ProjectView);
+ FilesView.Create(this, &ImgList);
+ SetItem_Param(FILES_TAB, (long) &FilesView);
+}
+
+bool CManager::SetPosition(HWND, int x, int y, int width, int height, UINT){
+ /* Overwrites CTabCtrl::SetPosition() so that all child windows are also resized */
+
+ // Tab Control.
+ ::SetWindowPos(_hWnd, 0,
+ x,
+ y,
+ width,
+ height,
+ 0);
+ // Child windows.
+ RECT Rect;
+ ::GetClientRect(_hWnd, &Rect);
+ ProjectView.SetPosition(0, Rect.top +5, Rect.left +5,
+ Rect.right-10, Rect.bottom-30, 0);
+
+ FilesView.SetPosition(0, Rect.top +5, Rect.left +5,
+ Rect.right-10, Rect.bottom-30, 0);
+return true;
+}
+
+BOOL CManager::OnNotify(int, LPNMHDR notify){
+ // Dispatch messages.
+ switch (notify->code){
+ // Tab Control.
+ case TCN_SELCHANGING:
+ OnSelChanging(notify);
+ break;
+
+ case TCN_SELCHANGE:
+ OnSelChange(notify);
+ break;
+
+ // TreeView.
+ case TVN_SELCHANGED:
+ Tv_OnSelchanged((LPNMTREEVIEW) notify);
+ break;
+ }
+return TRUE;
+}
+
+void CManager::OnSelChanging(LPNMHDR notify){
+ if (_hWnd == notify->hwndFrom){
+ CTreeView * pTreeView = (CTreeView *) GetItem_Param(GetCurSel());
+ if (pTreeView){
+ pTreeView->Hide();
+ }
+ }
+}
+
+void CManager::OnSelChange(LPNMHDR notify){
+ if (_hWnd == notify->hwndFrom){
+ CTreeView * pTreeView = (CTreeView *) GetItem_Param(GetCurSel());
+ if (pTreeView){
+ pTreeView->Show();
+ }
+ }
+}
+
+void CManager::Tv_OnSelchanged(LPNMTREEVIEW notify){
+ // Get lParam of current tree item.
+ CFileItem * file = (CFileItem *) notify->itemNew.lParam;
+
+ if (file){
+ CChildView * pMdiChild = (CChildView *) file->pMdiChild;
+
+ if(pMdiChild){
+ // An editor, focus it.
+ ::SetFocus((HWND) pMdiChild->_hWnd);
+ }else{
+ // No editor, the item is part of a project.
+ Project.SwitchCurrentDir();
+ winApp.CreateChild(file->szFileName, file);
+ }
+ }
+}
+
+
+/********************************************************************
+* Class: CFilesView.
+*
+* Purpose: Open files TreeView.
+*
+* Revisions:
+*
+********************************************************************/
+CFilesView::CFilesView(){
+ hRoot = NULL;
+}
+
+CFilesView::~CFilesView(){
+}
+
+void CFilesView::New(void){
+ CFileItem * file = new CFileItem;
+ if(!winApp.Manager.OpenFile(file)){
+ delete file;
+ MsgBox.DisplayString("Untitled file already exist.");
+ }
+}
+
+bool CFilesView::OpenFile(CFileItem * file){
+ if (!file)
+ return false;
+
+ int listAction;
+ char * fileName = file->szFileName + file->nFileOffset;
+
+ /* Untitled file ? */
+ if (file->nFileOffset == 0){
+ //@@TODO add a counter to get Untitled01, 02, etc...
+ strcpy(file->szFileName, "Untitled");
+ }
+
+ /* Check if this file is already opened */
+ listAction = InsertSorted_New(file);
+
+ if (listAction == FILE_FOUND){
+ /* Focus the editor window */
+ CFileItem * currentFile = (CFileItem *) GetCurrent();
+ if (currentFile){
+ CMDIChild * pMdiChild = currentFile->pMdiChild;
+ if (pMdiChild)
+ pMdiChild->SetFocus();
+ }
+ return false;
+ }
+
+ /* Create the editor window */
+ if (!winApp.CreateChild(file->szFileName, file)){
+ MsgBox.DisplayFatal("Can't create child window");
+ return false;
+ }
+ // Note: A WM_SETFOCUS message will be send to the child window.
+
+ /* Append the file to the list */
+ InsertLast(file);
+
+ /* Create a Tree View item */
+ file->_hItem = CreateItem(
+ hRoot, //@@ use a GetRootItem() ?
+ TVI_LAST,
+ file->type,
+ fileName,
+ (LPARAM) file);
+
+ file->pTreeView = this;
+return true;
+}
+
+void CFilesView::CloseFile(CFileItem * file){
+ SendMessage(TVM_DELETEITEM, 0, (LPARAM) file->_hItem);
+ Destroy(file);
+}
+
+int CFilesView::SaveAll(int decision){
+ if (decision == IDNO || decision == IDCANCEL)
+ return decision;
+ CFileItem * file = (CFileItem*) First();
+ while (file){
+ if (file->pMdiChild){
+ CChildView * childView = (CChildView *) file->pMdiChild;
+ /* Modified ? */
+ if (childView->modified){
+ /* Ask ? */
+ if (decision == IDASK){
+ decision = MsgBox.AskToSave(true); // Cancel button.
+ if (decision != IDYES)
+ return decision; // IDNO or IDCANCEL.
+ }
+ childView->CmdSave();
+ }
+ }
+ file = (CFileItem*) Next();
+ }
+return decision;
+}
+
+HWND CFilesView::Create(CWindow * pParent, CImageList * imgList){
+ // Create TreeView.
+ CreateEx(
+ pParent,
+ WS_EX_CLIENTEDGE,
+ WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ | TVS_EDITLABELS | TVS_HASLINES | TVS_HASBUTTONS,
+ 0,
+ (void*) 12);
+
+ // Assign the image list to the treeview control.
+ SendMessage(TVM_SETIMAGELIST, (long)TVSIL_NORMAL, (long) imgList->GetId());
+ hRoot = CreateItem(TVI_ROOT, TVI_LAST, WORKSPACE, "Workspace", 0);
+return _hWnd;
+}
+
+
+/********************************************************************
+* Class: CProjectView.
+*
+* Purpose: Project TreeView.
+*
+* Revisions:
+*
+********************************************************************/
+CProjectView::CProjectView(){
+ hRoot = NULL;
+}
+
+CProjectView::~CProjectView(){
+}
+
+CFileItem * CProjectView::NewFile(char * name){
+ CFileItem * current = (CFileItem *) GetCurrent();
+ CFileItem * srcFile = new CFileItem;
+
+ // Copy directory name.
+ if (current){
+ strncpy(srcFile->szFileName, current->szFileName, current->nFileOffset);
+ srcFile->nFileOffset = current->nFileOffset;
+ }else{
+ // No files in the project yet, use makefile directory.
+ strcpy(srcFile->szFileName, Project.Makefile.mkfDir);
+ srcFile->nFileOffset = strlen(srcFile->szFileName)+1;
+ }
+
+ srcFile->szFileName[srcFile->nFileOffset - 1] = '\\';
+
+ // Append file name.
+ strcpy(&srcFile->szFileName[srcFile->nFileOffset], name);
+ //MsgBox.DisplayString(srcFile->szFileName);
+
+ if (::CheckFile(srcFile)){
+ ::GetFileType(srcFile);
+ srcFile->isInProject = true;
+ HANDLE hFile;
+ hFile = ::CreateFile(srcFile->szFileName,
+ 0,
+ 0,
+ NULL,
+ CREATE_NEW,
+ FILE_ATTRIBUTE_ARCHIVE,
+ NULL);
+
+ if (hFile != INVALID_HANDLE_VALUE){
+ CloseHandle(hFile);
+ // Try to add new file to the project.
+ if(OpenFile(srcFile)){
+ Project.modified = true;
+ return srcFile;
+ }
+ }
+ }
+ delete srcFile;
+return NULL;
+}
+
+bool CProjectView::OpenFile(CFileItem * file){
+ if (!file)
+ return false;
+
+ int listAction;
+ char * fileName = file->szFileName + file->nFileOffset;
+
+ /* Check if this file is already opened */
+ listAction = InsertSorted_New(file);
+
+ if (listAction == FILE_FOUND){
+ /* Focus the editor window */
+ CFileItem * currentFile = (CFileItem *) GetCurrent();
+ if (currentFile){
+ CMDIChild * pMdiChild = currentFile->pMdiChild;
+ if (!pMdiChild){
+ /* Create a child window */
+ Project.SwitchCurrentDir();
+ winApp.CreateChild(file->szFileName, file);
+ }else{
+ pMdiChild->SetFocus();
+ }
+ }
+ return false;
+ }
+
+ file->_hDirItem = hRoot;
+ CreateSubDirItem(file);
+
+ if (listAction == EMPTY_LIST){
+ InsertFirst(file);
+ }else if (listAction == INSERT_FIRST){
+ InsertFirst(file);
+ }else if (listAction == INSERT_LAST){
+ InsertLast(file);
+ }else if (listAction == INSERT_BEFORE){
+ InsertBefore(file);
+ }else if (listAction == INSERT_AFTER){
+ InsertAfter(file);
+ }
+
+ /* Create the file icon */
+ file->_hItem = CreateItem(
+ file->_hDirItem,
+ TVI_SORT,
+ file->type,
+ fileName,
+ (LPARAM) file);
+
+ file->pTreeView = this;
+
+ /* Create an editor view */
+ if (file->show){
+ winApp.CreateChild(file->szFileName, file);
+ }
+return true;
+}
+
+bool CProjectView::Close(){
+ if (Project.NoProject())
+ return false;
+
+ int decision = IDASK;
+ decision = SaveAll(decision);
+ if (decision == IDCANCEL)
+ return false;
+
+ // Parse the list while there's a next node.
+ CFileItem * srcFile = (CFileItem *) First();
+ while(srcFile){
+ DestroyFile(srcFile, decision);
+ srcFile = (CFileItem *) Next();
+ }
+ Project.loaded = false;
+
+ DestroyRoot();
+ DestroyList();
+ winApp.Report.Clear();
+return true;
+}
+
+void CProjectView::RemoveFile(void){
+ if (Project.NoProject())
+ return;
+
+ CFileItem * srcFile = (CFileItem *) GetSelectedItemParam();
+
+ if (srcFile){
+ if (srcFile->pMdiChild)
+ DestroyFile(srcFile);
+ TreeView_DeleteItem(_hWnd, srcFile->_hItem);
+ if (!TreeView_GetChild(_hWnd, srcFile->_hDirItem))
+ TreeView_DeleteItem(_hWnd, srcFile->_hDirItem);
+/* else
+ TreeView_SelectItem(_hWnd, srcFile->_hDirItem);*/
+ Destroy(srcFile);
+
+ // we need to save prj file before exit.
+ //@@ Project.CloseFile, modified & buildMakefile should be private.
+ Project.modified = true;
+ Project.buildMakefile = true;
+ }else{
+ MsgBox.DisplayWarning("No project file selected");
+ }
+}
+
+void CProjectView::RemoveModule(void){
+ if (Project.NoProject())
+ return;
+
+ CFileItem * srcFile = (CFileItem *) GetSelectedItemParam();
+ CFileItem * otherFile;
+
+ if (srcFile){
+ if (srcFile->prev){
+ otherFile = (CFileItem *) srcFile->prev;
+ if (otherFile->nFileExtension != 0){
+ if (0 == strnicmp(srcFile->szFileName, otherFile->szFileName, otherFile->nFileExtension)){
+ if (otherFile->pMdiChild)
+ DestroyFile(otherFile);
+ TreeView_DeleteItem(_hWnd, otherFile->_hItem);
+ Destroy(otherFile);
+ }
+ }
+ }
+ if (srcFile->next){
+ otherFile = (CFileItem *) srcFile->next;
+ if (otherFile->nFileExtension != 0){
+ if (0 == strnicmp(srcFile->szFileName, otherFile->szFileName, otherFile->nFileExtension)){
+ if (otherFile->pMdiChild)
+ DestroyFile(otherFile);
+ TreeView_DeleteItem(_hWnd, otherFile->_hItem);
+ Destroy(otherFile);
+ }
+ }
+ }
+ if (srcFile->pMdiChild)
+ DestroyFile(srcFile);
+ TreeView_DeleteItem(_hWnd, srcFile->_hItem);
+ Destroy(srcFile);
+
+ // we need to save prj file before exit.
+ //@@ Project.CloseFile, modified & buildMakefile should be private.
+ Project.modified = true;
+ Project.buildMakefile = true;
+ }else{
+ MsgBox.DisplayWarning("No project file selected");
+ }
+}
+
+int CProjectView::DestroyFile(CFileItem * file, int decision){
+ if (file && file->pMdiChild){
+ CChildView * pMdiChild = (CChildView *) file->pMdiChild;
+
+ if (pMdiChild->modified && decision != IDNO){
+ // Ask ?
+ if (decision == IDASK){
+ decision = MsgBox.AskToSave(true); // (Cancel button)
+ if (decision == IDCANCEL)
+ return decision;
+ }
+ pMdiChild->CmdSave();
+ }
+
+ if (pMdiChild->_hWnd) // have an editor window, so destroy it.
+ winApp.MdiClient.SendMessage(WM_MDIDESTROY, (WPARAM)pMdiChild->_hWnd, 0);
+ }
+return decision;
+}
+
+int CProjectView::SaveAll(int decision){
+ if (!Project.loaded)
+ return 0;
+
+ if (decision == IDNO || decision == IDCANCEL)
+ return decision;
+
+ CFileItem * file = (CFileItem*) First();
+ while (file){
+ if (file->pMdiChild){
+ CChildView * childView = (CChildView *) file->pMdiChild;
+ /* Modified ? */
+ if (childView->modified){
+ /* Ask ? */
+ if (decision == IDASK){
+ decision = MsgBox.AskToSave(true); // Cancel button.
+ if (decision != IDYES)
+ return decision; // IDNO or IDCANCEL.
+ }
+ childView->CmdSave();
+ }
+ }
+ file = (CFileItem*) Next();
+ }
+
+ if (Project.modified)
+ return Project.SavePrjFile(decision);
+return decision;
+}
+
+bool CProjectView::CreateSubDirItem(CFileItem * file){
+ /* Initialize _hDirItem and get a pointer to current file */
+ file->_hDirItem = hRoot;
+ CFileItem * currentFile = (CFileItem *) GetCurrent();
+
+ /* See if our new file is in the same directory than current file */
+ if (currentFile){
+ // There's some files in the list.
+ if (file->nFileOffset == currentFile->nFileOffset){
+ // Same directory length, we may have found the directory.
+ if (0 == strnicmp(file->szFileName, currentFile->szFileName, currentFile->nFileOffset)){
+ /* We have found the directory, then copy _hDirItem */
+ file->_hDirItem = currentFile->_hDirItem;
+ return true;
+ }
+ }
+ }
+
+ /* We need to parse the tree view and create directory icons */
+ char * parse = file->szFileName;
+ if (*parse == '.' && *(parse+1) == '\\'){
+ /* This is a valid relative path */
+ char dir[MAX_PATH];
+ strcpy(dir, file->szFileName);
+ parse = dir+2;
+ char * dirStart;
+ HTREEITEM hParent = hRoot;
+ HTREEITEM hFound;
+ if (*parse){
+ for ( ; ; ){
+ /* Found each backslash */
+ dirStart = parse;
+ parse = strchr(parse, '\\');
+ if (!parse)
+ break; // No more backslash.
+ else if (parse == dirStart)
+ return false; // Avoids an endless loop.
+ *parse = '\0';
+
+ /* Find the directory */
+ hFound = FindDirItem(hParent, dirStart);
+ if (!hFound){
+ /* Append a new directory icon */
+ hParent = CreateDirItem(hParent, dirStart);
+ }
+ parse++;
+ }
+ }
+ file->_hDirItem = hParent;
+ }
+return true;
+}
+
+HTREEITEM CProjectView::FindDirItem(HTREEITEM hItem, char * dir){
+ char buffer[_MAX_DIR];
+ HTREEITEM hNext = TreeView_GetChild(_hWnd, hItem);
+ while (hNext){
+ _TvItem.hItem = hNext;
+ _TvItem.mask = TVIF_HANDLE | TVIF_TEXT;
+ _TvItem.pszText = buffer;
+ _TvItem.cchTextMax = _MAX_DIR;
+ if (TreeView_GetItem(_hWnd, &_TvItem)){
+ if (!stricmp(dir, buffer))
+ return hNext;
+ }
+ hNext = TreeView_GetNextSibling(_hWnd, hNext);
+ }
+return NULL;
+}
+
+HWND CProjectView::Create(CWindow * pParent, CImageList * imgList){
+ // Create TreeView.
+ CreateEx(
+ pParent,
+ WS_EX_CLIENTEDGE,
+ WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ | TVS_EDITLABELS | TVS_HASLINES | TVS_HASBUTTONS);
+
+ // Assign the image list to the treeview control.
+ SendMessage(TVM_SETIMAGELIST, (long)TVSIL_NORMAL, (long) imgList->GetId());
+return _hWnd;
+}
+
+void CProjectView::CreateRoot(char * projectName){
+
+ _pParent->SendMessage(TCM_SETCURFOCUS, 1, 0);
+
+ // Create Root Item.
+ hRoot = CreateItem(TVI_ROOT, TVI_LAST, PROJECT, projectName, 0);
+ SendMessage(TVM_EXPAND, (long) TVE_EXPAND, (long) hRoot);
+}
+
+void CProjectView::DestroyRoot(void){
+ TreeView_DeleteItem(_hWnd, hRoot);
+ hRoot = 0;
+
+ _pParent->SendMessage(TCM_SETCURFOCUS, 0, 0);
+}
+
+HTREEITEM CProjectView::CreateDirItem(HTREEITEM hParent, char * dir){
+return CreateItem(hParent, TVI_SORT, DIR, dir, 0);
+}
+
+CFileItem * CProjectView::FindFile(char * szFileName){
+ if (!szFileName || !*szFileName)
+ return NULL;
+
+ char * currentFile;
+ bool stripDir = true;
+ if (*szFileName == '.')
+ stripDir = false;
+ // Get the current node.
+ CFileItem * currentNode = (CFileItem *) GetCurrent();
+
+ if(!currentNode)
+ return NULL; // The list is empty.
+
+ currentFile = GetFileName(currentNode, stripDir);
+ int cmpResult = stricmp(szFileName, currentFile);
+ // Compare names to know if we must parse Up
+ // or Down from current node.
+ if (cmpResult == 0){
+ return currentNode; // Found !
+ }
+ // Search Up -----------------------------------------------------------------
+ else if (cmpResult == -1){
+ // Parse the list while there's a previous node.
+ while (Prev()){
+ currentNode = (CFileItem *) GetCurrent();
+ currentFile = GetFileName(currentNode, stripDir);
+ if(!stricmp(szFileName, currentFile))
+ return currentNode; // Found !
+ }
+ }
+ // Search Down --------------------------------------------------------------
+ else if (cmpResult == 1){
+ // Parse the list while there's a next node.
+ while (Next()){
+ currentNode = (CFileItem *) GetCurrent();
+ currentFile = GetFileName(currentNode, stripDir);
+ if(!stricmp(szFileName, currentFile))
+ return currentNode; // Found !
+ }
+ }
+return NULL;
+}
+
+char * CProjectView::GetFileName(CFileItem * currentNode, bool flag){
+ char * fileName = currentNode->szFileName;
+ if (flag == true){
+ fileName += currentNode->nFileOffset;
+ }
+return fileName;
+}
+
+
+/********************************************************************
+* Class: CReport.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CReport::CReport(){
+}
+
+CReport::~CReport(){
+}
+
+void CReport::Create(CWindow * pParent){
+ // Create the Tab Control.
+ CreateEx(
+ pParent,
+ WS_EX_CLIENTEDGE,
+ WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ /*| TCS_BOTTOM*/ | TCS_MULTILINE | TCS_VERTICAL
+ | TCS_FOCUSNEVER);
+
+ // Give it a smart font, create tabs, select first one and show the control.
+ SendMessage(WM_SETFONT, (long) GetStockObject(DEFAULT_GUI_FONT), 0);
+
+ InsertItem(REPORT_MAIN_TAB, TCIF_TEXT, 0, 0, "Main", 16, 0, 0);
+ InsertItem(REPORT_LOG_TAB, TCIF_TEXT, 0, 0, "Log", 16, 0, 0);
+ Show();
+
+ // Create an Image list and then the Project TreeView.
+ MainList.Create(this);
+ SetItem_Param(REPORT_MAIN_TAB, (long) &MainList);
+ LogList.Create(this);
+ SetItem_Param(REPORT_LOG_TAB, (long) &LogList);
+}
+
+bool CReport::SetPosition(HWND, int x, int y, int width, int height, UINT){
+ /* Overwrites CTabCtrl::SetPosition() so that all child windows are also resized */
+
+ // Tab Control.
+ ::SetWindowPos(_hWnd, 0,
+ x,
+ y,
+ width,
+ height,
+ 0);
+
+ // Get tab's display area.
+ RECT area;
+ area.left = 0;
+ area.top = 0;
+ area.right = width;
+ area.bottom = height;
+ ::SendMessage(_hWnd, TCM_ADJUSTRECT, FALSE, (LPARAM) &area);
+ area.right -= area.left;
+ area.bottom -= area.top;
+ /* WS_EX_CLIENTEDGE correction */
+ area.top -= 2;
+ area.right -= 2;
+ // Borders.
+ area.left += 3;
+ area.top += 3;
+ area.right -= 6;
+ area.bottom -= 6;
+
+ // Child windows.
+ MainList.SetPosition(0, area.left, area.top,
+ area.right, area.bottom, 0);
+ LogList.SetPosition(0, area.left, area.top,
+ area.right, area.bottom, 0);
+return true;
+}
+
+BOOL CReport::OnNotify(int, LPNMHDR notify){
+ // Dispatch messages.
+ switch (notify->code){
+ // Tab Control.
+ case TCN_SELCHANGING:
+ OnSelChanging(notify);
+ break;
+
+ case TCN_SELCHANGE:
+ OnSelChange(notify);
+ break;
+
+ // Main list.
+ case NM_DBLCLK:
+ MainList.Lv_OnDbClick((LPNMLISTVIEW) notify);
+ break;
+ }
+return TRUE;
+}
+
+void CReport::OnSelChanging(LPNMHDR notify){
+ if (_hWnd == notify->hwndFrom){
+ CWindow * pWindow = (CWindow *) GetItem_Param(GetCurSel());
+ if (pWindow){
+ pWindow->Hide();
+ }
+ }
+}
+
+void CReport::OnSelChange(LPNMHDR notify){
+ if (_hWnd == notify->hwndFrom){
+ CWindow * pWindow = (CWindow *) GetItem_Param(GetCurSel());
+ if (pWindow){
+ pWindow->Show();
+ }
+ }
+}
+
+void CReport::Clear(void){
+ MainList.Clear();
+ LogList.Clear();
+}
+
+bool CReport::Append(char * line, WORD outputFlag){
+ LogList.Append(line, outputFlag);
+ MainList.Append(line, outputFlag);
+return true;
+}
+
+
+/********************************************************************
+* Class: CMainList.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CMainList::CMainList(){
+}
+
+CMainList::~CMainList(){
+}
+
+void CMainList::Create(CWindow * pParent){
+ CreateEx(
+ pParent,
+ WS_EX_CLIENTEDGE,
+ WS_VISIBLE | WS_CHILD| WS_CLIPCHILDREN | WS_CLIPSIBLINGS
+ | LVS_REPORT);
+
+ SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,
+ LVS_EX_GRIDLINES, LVS_EX_GRIDLINES);
+ SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,
+ LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
+
+ // Insert columns.
+ LVCOLUMN lvc;
+ lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ lvc.fmt = LVCFMT_LEFT;
+
+ lvc.iSubItem = 0;
+ lvc.cx = 35;
+ lvc.pszText = "Line";
+ SendMessage(LVM_INSERTCOLUMN, 0, (LPARAM) &lvc);
+
+ lvc.iSubItem = 1;
+ lvc.cx = 70;
+ lvc.pszText = "Unit";
+ SendMessage(LVM_INSERTCOLUMN, 1, (LPARAM) &lvc);
+
+ lvc.iSubItem = 2;
+ lvc.cx = 640;
+ lvc.pszText = "Message";
+ SendMessage(LVM_INSERTCOLUMN, 2, (LPARAM) &lvc);
+}
+
+void CMainList::Lv_OnDbClick(LPNMLISTVIEW lpnmlv){
+ if (_hWnd == lpnmlv->hdr.hwndFrom){
+ char lineBuff[256];
+ *lineBuff = '\0';
+ char * c = lineBuff;
+ LV_ITEM lvi;
+ lvi.mask = LVIF_TEXT;
+ lvi.iItem = lpnmlv->iItem;
+ lvi.iSubItem = 0;
+ lvi.pszText = lineBuff;
+ lvi.cchTextMax = 256;
+ lvi.lParam = 0;
+ if (!SendMessage(LVM_GETITEMTEXT, lpnmlv->iItem, (long) &lvi))
+ return;
+ while(*c){
+ if (!isdigit(*c))
+ return;
+ c++;
+ }
+ int line = atoi(lineBuff);
+
+ //MsgBox.DisplayLong((long) line);
+
+ lvi.iSubItem = 1;
+ if (!SendMessage(LVM_GETITEMTEXT, lpnmlv->iItem, (long) &lvi))
+ return;
+ CFileItem * item = winApp.Manager.ProjectView.FindFile(lineBuff);
+ if (item && item->isInProject){
+ CChildView * pMdiChild = (CChildView *) item->pMdiChild;
+
+ if(pMdiChild){
+ // An editor, focus it.
+ ::SetFocus((HWND) pMdiChild->_hWnd);
+ }else{
+ // No editor, the item is part of a project.
+ Project.SwitchCurrentDir();
+ winApp.CreateChild(item->szFileName, item);
+ }
+ pMdiChild = (CChildView *) item->pMdiChild;
+ if (pMdiChild)
+ pMdiChild->Editor.GotoLine(line-1);
+ }
+ }
+}
+
+bool CMainList::Append(char * line, WORD outputFlag){
+ int row;
+
+ *szLine = '\0';
+ *szUnit = '\0';
+ *szMsg = '\0';
+
+ if (outputFlag == LVOUT_ERROR){
+ if (!SplitErrorLine(line))
+ return false;
+ }else if (outputFlag == LVOUT_NORMAL){
+ strcpy (szMsg, line);
+ }else{
+ strcpy (szMsg, "Unrecognized outputFlag");
+ }
+
+ // Fill in List View columns, first is column 0.
+ LV_ITEM lvi;
+ lvi.mask = LVIF_TEXT; // | LVIF_PARAM;
+ lvi.iItem = 0x7FFF;
+ lvi.iSubItem = 0;
+ lvi.pszText = szLine;
+ lvi.cchTextMax = strlen(lvi.pszText)+1;
+ lvi.lParam = 0;
+
+ row = SendMessage(LVM_INSERTITEM, 0, (LPARAM) &lvi);
+
+ // Continue with column 1.
+ lvi.iSubItem = 1;
+ lvi.pszText = szUnit;
+ lvi.cchTextMax = strlen(lvi.pszText)+1;
+ SendMessage(LVM_SETITEMTEXT, (WPARAM)row, (LPARAM)&lvi);
+
+ // Continue with column 2.
+ lvi.iSubItem = 2;
+ lvi.pszText = szMsg;
+ lvi.cchTextMax = strlen(lvi.pszText)+1;
+ SendMessage(LVM_SETITEMTEXT, (WPARAM)row, (LPARAM)&lvi);
+
+ // Save last row position
+ lastRow = row+1;
+
+return true;
+}
+
+bool CMainList::SplitErrorLine(char * line){
+ char * chr = line;
+ char * col;
+ // line => [unit]:[line_n°]: [error message]
+ // or => [unit]: [error message]
+
+ if (!*line)
+ return false;
+
+ /* Unit */
+ col = szUnit;
+ for ( ; ; ){
+ if (!*chr){
+ /* Not an error line */
+ //strcpy(szMsg, szUnit);
+ *szUnit = '\0';
+ return false;
+ }else if (*chr == ':'){
+ if (*(chr+1) == '\\'){
+ *col = *chr;
+ col++;
+ chr++;
+ continue;
+ }else{
+ chr++;
+ break;
+ }
+ }
+ *col = *chr;
+ col++;
+ chr++;
+ }
+ *col = '\0';
+
+ /* Line number ? */
+ col = szLine;
+ if (*chr && isdigit(*chr)){ //@@ *chr=0 ?
+ while (*chr && *chr != ':'){
+ *col = *chr;
+ col++;
+ chr++;
+ }
+ *col = '\0';
+ chr++;
+ }
+
+ /* Message */
+ col = szMsg;
+ if (isspace(*chr)){
+ /**col = '>';
+ col++;
+ *col = ' ';
+ col++;*/
+ chr++;
+ }
+
+ while (*chr){
+ *col = *chr;
+ col++;
+ chr++;
+ }
+ *col = '\0';
+return true;
+}
+
+
+/********************************************************************
+* Class: CLogList.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CLogList::CLogList(){
+}
+
+CLogList::~CLogList(){
+}
+
+void CLogList::Create(CWindow * pParent){
+ CreateEx(
+ pParent,
+ WS_EX_CLIENTEDGE,
+ WS_CHILD| WS_CLIPCHILDREN | WS_CLIPSIBLINGS | LVS_REPORT
+ | LVS_NOCOLUMNHEADER);
+
+ SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,
+ LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
+
+ // Insert columns.
+ LVCOLUMN lvc;
+ lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ lvc.fmt = LVCFMT_LEFT;
+
+ lvc.iSubItem = 0;
+ lvc.cx = 100;
+ lvc.pszText = "Message";
+ SendMessage(LVM_INSERTCOLUMN, 0, (LPARAM) &lvc);
+}
+
+bool CLogList::SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags){
+ ::SendMessage(_hWnd, WM_SETREDRAW, FALSE, 0);
+ ::SetWindowPos(_hWnd, hInsertAfter, x, y, width, height, uFlags);
+ ::SendMessage(_hWnd, LVM_SETCOLUMNWIDTH, 0, MAKELPARAM((int) width-22, 0));
+ ::SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0);
+return true;
+}
+
+bool CLogList::Append(char * line, WORD /*outputFlag*/){
+ int row;
+
+ *szMsg = '\0';
+
+/* if (outputFlag != LVOUT_ERROR)
+ return false;
+*/
+ // Fill in List View columns, first is column 0.
+ LV_ITEM lvi;
+ lvi.mask = LVIF_TEXT; // | LVIF_PARAM;
+ lvi.iItem = 0x7FFF;
+ lvi.iSubItem = 0;
+ lvi.pszText = line;
+ lvi.cchTextMax = strlen(lvi.pszText)+1;
+ lvi.lParam = 0;
+
+ row = SendMessage(LVM_INSERTITEM, 0, (LPARAM) &lvi);
+
+ // Save last row position
+ lastRow = row+1;
+
+return true;
+}
+
+
+/********************************************************************
+* Class: CFileItem.
+*
+* Purpose: Linked List Node for file parameters.
+*
+* Revisions:
+*
+********************************************************************/
+CFileItem::CFileItem(){
+ type = U_FILE;
+
+ *szFileName = '\0';
+ szFileName[MAX_PATH - 1] = '\0'; // security.
+ nFileOffset = 0;
+ nFileExtension = 0;
+
+ pTreeView = NULL;
+ _hDirItem = 0;
+ _hItem = 0;
+
+ pMdiChild = NULL;
+ show = 0;
+ isInProject = false;
+}
+
+CFileItem::~CFileItem(){
+}
+
+
+/********************************************************************
+* Class: CFileList.
+*
+* Purpose: A CList with a dedicated Compare() procedure.
+*
+* Revisions:
+*
+********************************************************************/
+CFileList::CFileList(){
+}
+
+CFileList::~CFileList(){
+}
+
+int CFileList::Compare(CNode *node1, CNode *node2){
+return stricmp(((CFileItem *)node1)->szFileName, ((CFileItem *)node2)->szFileName);
+}
+
--- /dev/null
+/********************************************************************
+* Module: main.h. This is part of Visual-MinGW.
+*
+* License: Visual-MinGW is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+********************************************************************/
+#ifndef MAIN_H
+#define MAIN_H
+
+#include "CList.h"
+#include "winui.h"
+#include "editor.h"
+#include "process.h"
+
+#define LVOUT_NORMAL (STDOUT_USER)
+#define LVOUT_ERROR (STDOUT_USER+1)
+#define IDASK 21
+
+#define WORKSPACE 0
+#define PROJECT 1
+#define DIR 2
+
+#define PRJ_FILE 0
+#define SRC_FILE 1
+#define ADD_SRC_FILE 2
+
+#define FILES_TAB 0
+#define PROJECT_TAB 1
+
+#define REPORT_MAIN_TAB 0
+#define REPORT_LOG_TAB 1
+
+
+class CChildView : public CMDIChild
+{
+ public:
+ CChildView();
+ virtual ~CChildView();
+
+ bool modified;
+
+ bool OnCreate(LPCREATESTRUCT lParam);
+ bool OnSize(UINT wParam, int width, int height);
+ BOOL OnClose(void);
+ BOOL OnDestroy(void);
+
+ BOOL OnCommand(WPARAM wParam, LPARAM lParam);
+ BOOL OnNotify(int idCtrl, LPNMHDR notify);
+ BOOL OnSetFocus(HWND hwndLoseFocus);
+ BOOL OnActivate(HWND hwndChildDeact, HWND hwndChildAct);
+
+ void CmdSave(void);
+ void CmdSaveAs(void);
+ CEditor Editor;
+
+ protected:
+
+ private:
+};
+
+class CFileList : public CList
+{
+ public:
+ CFileList();
+ ~CFileList();
+
+ protected:
+ virtual int Compare(CNode *node1, CNode *node2);
+
+ private:
+};
+
+class CProjectView : public CTreeView, public CFileList
+{
+ public:
+ CProjectView();
+ ~CProjectView();
+
+ CFileItem * NewFile(char * name);
+ bool OpenFile(CFileItem * file);
+ void RemoveFile(void);
+ void RemoveModule(void);
+ int DestroyFile(CFileItem * file, int decision=IDASK);
+ int SaveAll(int decision);
+ bool Close();
+
+ void CreateRoot(char * projectName);
+ void DestroyRoot(void);
+ CFileItem * FindFile(char * szFileName);
+ char * GetFileName(CFileItem * currentNode, bool flag);
+
+ HWND Create(CWindow * pParent, CImageList * imgList);
+ HTREEITEM CreateDirItem(HTREEITEM hParent, char * dir);
+
+ protected:
+
+ private:
+ bool CreateSubDirItem(CFileItem * file);
+ HTREEITEM FindDirItem(HTREEITEM hItem, char * dir);
+ HTREEITEM hRoot;
+};
+
+class CFilesView : public CTreeView, public CFileList
+{
+ public:
+ CFilesView();
+ ~CFilesView();
+
+ bool OpenFile(CFileItem * file);
+ void New (void);
+ void CloseFile(CFileItem * file);
+ int SaveAll(int decision);
+
+ HWND Create(CWindow * pParent, CImageList * imgList);
+
+ protected:
+
+ private:
+ HTREEITEM hRoot;
+};
+
+class CManager : public CTabCtrl
+{
+ public:
+ CManager();
+ ~CManager();
+
+ void OpenFileDialog(void);
+ bool OpenFile(CFileItem * file);
+ int SaveAll(int silent);
+
+ bool NewProjectDialog(void);
+ bool OpenProjectDialog(void);
+ bool CloseProject(void);
+ int SaveProjectFiles(int decision);
+ void RemoveProjectFile(void);
+ void RemoveProjectModule(void);
+
+ void Create(CWindow * pParent);
+ bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags);
+
+ BOOL OnNotify(int idCtrl, LPNMHDR notify);
+ void Tv_OnDeleteItem(LPNMTREEVIEW notify);
+ void Tv_OnSelchanged(LPNMTREEVIEW notify);
+ void OnSelChanging(LPNMHDR notify);
+ void OnSelChange(LPNMHDR notify);
+
+ CImageList ImgList;
+ CFilesView FilesView;
+ CProjectView ProjectView;
+
+ protected:
+
+ private:
+ void CreateImageList(void);
+
+};
+
+class CLogList : public CListView
+{
+ public:
+ CLogList();
+ ~CLogList();
+
+ void Create(CWindow * pParent);
+ bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags);
+ bool Append(char * line, WORD outputFlag);
+
+ protected:
+
+ private:
+ char szMsg[1024];
+};
+
+class CMainList : public CListView
+{
+ public:
+ CMainList();
+ ~CMainList();
+
+ void Create(CWindow * pParent);
+ void Lv_OnDbClick(LPNMLISTVIEW lpnmlv);
+ bool Append(char * line, WORD outputFlag);
+
+ protected:
+
+ private:
+ char szLine[512];
+ char szUnit[512];
+ char szMsg[512];
+
+ bool SplitErrorLine(char * line);
+};
+
+class CReport : public CTabCtrl
+{
+ public:
+ CReport();
+ ~CReport();
+
+ bool Append(char * line, WORD outputFlag);
+ void Clear(void);
+ void Create(CWindow * pParent);
+ bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags);
+
+ BOOL OnNotify(int idCtrl, LPNMHDR notify);
+ void OnSelChanging(LPNMHDR notify);
+ void OnSelChange(LPNMHDR notify);
+
+ CMainList MainList;
+ CLogList LogList;
+
+ protected:
+
+ private:
+ void CreateImageList(void);
+};
+
+class CFileDlg : public CFileDlgBase
+{
+ public:
+ CFileDlg();
+ ~CFileDlg();
+
+ bool Open(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag);
+ bool Save(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag);
+
+ protected:
+
+ private:
+};
+
+class CGrepDlg : public CDlgBase
+{
+ public:
+ CGrepDlg();
+ ~CGrepDlg();
+
+ int Create(void);
+ LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+ void FindInFiles(char * findWhat, char * fileFilter);
+ char gDir[MAX_PATH];
+ char findWhat[200];
+
+ protected:
+
+ private:
+ HWND hFindWhat;
+ HWND hgDir;
+};
+
+class CEnvDlg : public CDlgBase
+{
+ public:
+ CEnvDlg();
+ virtual ~CEnvDlg();
+
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+ void SetEnvText(void);
+ bool bIsVisible;
+ bool bModified;
+
+ protected:
+
+ private:
+ HWND hApply;
+ HWND hSetCcBin;
+ HWND hCcBinDir;
+ HWND hBrowseCc;
+ HWND hSetCmdBin;
+ HWND hCmdBinDir;
+ HWND hBrowseCmd;
+ HWND hAutoexec;
+ HWND hEnvView;
+};
+
+class CPreferencesDlg : public CTabbedDlg
+{
+ public:
+ CPreferencesDlg();
+ virtual ~CPreferencesDlg();
+
+ int Create(void);
+ BOOL EndDlg(int nResult);
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+
+ protected:
+
+ private:
+ CEnvDlg EnvDlg;
+};
+
+class CWinApp : public CMDIBase
+{
+ public:
+ CWinApp();
+ ~CWinApp();
+
+ void FirstRunTest(void);
+ bool ReadIniFile(char * iniFile);
+ void SaveIniFile(FILE * file);
+ bool WriteIniFile(void);
+ bool CustomInit(void);
+ bool Release(void);
+ bool SetEnv(void);
+
+ bool CreateUI(void);
+ void CreateToolbar(void);
+ void CreateSplitter(void);
+ void CreateMDI(void);
+ HWND CreateChild(char * caption, LPVOID lParam);
+ void CreateStatusBar(void);
+
+ void SendCaretPos(int caretPos);
+
+ // Main window.
+ LRESULT CALLBACK CMainWndProc(UINT Message, WPARAM wParam, LPARAM lParam);
+
+ BOOL OnCreate(LPCREATESTRUCT lParam);
+ BOOL OnPaint(HDC wParam);
+ BOOL OnSize(UINT wParam, int width, int height);
+ BOOL OnDestroy(void);
+ BOOL OnClose (void);
+ BOOL OnNotify(int idCtrl, LPNMHDR notify);
+
+ BOOL OnLButtonDown(short xPos, short yPos, UINT fwKeys);
+ BOOL OnMouseMove(short xPos, short yPos, UINT fwKeys);
+ BOOL OnLButtonUp(short xPos, short yPos, UINT fwKeys);
+ BOOL OnSetCursor(HWND hwnd, UINT nHittest, UINT wMouseMsg);
+
+ BOOL OnCommand(WPARAM wParam, LPARAM lParam);
+
+ // Child window.
+ LRESULT CALLBACK CChildWndProc(CWindow * pWnd, UINT Message, WPARAM wParam, LPARAM lParam);
+
+ HMODULE hmod;
+ char iniFileName[MAX_PATH];
+ CIniFile IniFile;
+ CPreferencesDlg PreferencesDlg;
+ CGrepDlg GrepDlg;
+ CShellDlg ShellDlg;
+ CFileDlg FileDlg;
+ CProcess Process;
+
+ CToolBar Toolbar;
+ CSplitter MainSplitter;
+ CSplitter ChildSplitter;
+ CManager Manager;
+ CReport Report;
+ CStatusBar Sbar;
+
+ /* Preferences */
+ char openFilesDir[MAX_PATH];
+ char projectDir[MAX_PATH];
+ bool bSetCcEnv;
+ bool bSetCmdEnv;
+ bool bSetDefEnv;
+ char szCcBinDir[MAX_PATH];
+ char szCmdBinDir[MAX_PATH];
+ char includeDir[MAX_PATH];
+
+ protected:
+
+ private:
+ bool firstRun;
+ // Child windows dimensions.
+ int deltaY;
+ int tbarHeight;
+ int sbarHeight;
+ int tvWidth;
+ int lvHeight;
+
+ int hSplitter;
+ int vSplitter;
+};
+
+#endif
--- /dev/null
+/********************************************************************
+* Module: process.cpp. This is part of Visual-MinGW.
+*
+* Purpose: Procedures to invoke MinGW compiler.
+*
+* Authors: Manu B.
+*
+* License: Visual-MinGW is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+* Note: The following article from MSDN explanes how to handle Callback
+* procedures :
+* Calling All Members: Member Functions as Callbacks.
+* by Dale Rogerson.
+* Microsoft Developer Network Technology Group.
+* April 30, 1992.
+* http://msdn.microsoft.com/archive/default.asp
+*
+* Revisions:
+*
+********************************************************************/
+#include <windows.h>
+#include <stdio.h>
+#include <process.h>
+#include <time.h>
+#include <process.h>
+#include "process.h"
+#include "project.h"
+#include "main.h"
+#include "rsrc.h"
+
+extern CCriticalSection CriticalSection;
+extern CMessageBox MsgBox;
+char errmsg[128];
+
+// For winApp.isWinNT and winApp.Report.Append
+extern CWinApp winApp;
+
+/********************************************************************
+* Class: CCommandDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CCommandDlg::CCommandDlg(){
+ *cmdLine = '\0';
+}
+
+CCommandDlg::~CCommandDlg(){
+}
+
+HWND CCommandDlg::Create(void){
+return CreateParam(&winApp, IDD_COMMAND, 0);
+}
+
+LRESULT CALLBACK CCommandDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CCommandDlg::OnInitDialog(HWND, LPARAM){
+ hCmdLine = GetItem(IDC_CMDLINE);
+
+ SetItemText(hCmdLine, cmdLine);
+ // Show the dialog.
+ Show();
+return TRUE;
+}
+
+BOOL CCommandDlg::OnCommand(WORD, WORD wID, HWND){
+ switch (wID){
+ case IDOK:
+ GetItemText(hCmdLine, cmdLine, sizeof(cmdLine));
+ //MsgBox.DisplayString(cmdLine);
+ winApp.Process.CommandLine(cmdLine);
+ return TRUE;
+
+ case IDCANCEL:
+ EndDlg(IDCANCEL);
+ return FALSE;
+ }
+return FALSE;
+}
+
+
+/********************************************************************
+* Class: CTask.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CTask::CTask(){
+ *cmdLine = '\0';
+ *szFileName = '\0';
+ creationFlag = 0;
+ outputFlag = 0;
+}
+
+CTask::~CTask(){
+}
+
+
+/********************************************************************
+* Class: CStack.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CStack::CStack(){
+ retBuf = NULL;
+}
+
+CStack::~CStack(){
+ DestroyList();
+ if (retBuf)
+ delete retBuf;
+}
+
+void CStack::DetachCurrent(void){
+ // Empty list ?
+ if (current != NULL){
+ CNode * node = current;
+
+ // Detach node from the list.
+ if (node->next != NULL)
+ node->next->prev = node->prev;
+ if (node->prev != NULL)
+ node->prev->next = node->next;
+
+ // Set current node.
+ if(node->next != NULL)
+ current = node->next;
+ else
+ current = node->prev;
+
+ if (current == NULL){
+ // Now, the list is empty.
+ first = last = NULL;
+
+ }else if (first == node){
+ // Detached node was first.
+ first = current;
+
+ }else if (last == node){
+ // Detached node was last.
+ last = current;
+ }
+ count--;
+ }
+}
+
+/********************************************************************
+* Push/Pop/Flush.
+********************************************************************/
+int CStack::Push(CTask * newTask){
+ InsertLast(newTask);
+return Length();
+}
+
+CTask * CStack::Pop(void){
+ // Delete return buffer.
+ if (retBuf){
+ delete retBuf;
+ retBuf = NULL;
+ }
+
+ // Get first node. (FIFO stack)
+ retBuf = (CTask*) First();
+
+ // The Stack is empty ?
+ if (!retBuf)
+ return NULL;
+
+ // Detach current node from the list. Return a pointer to it.
+ DetachCurrent();
+return retBuf;
+}
+
+void CStack::Flush(void){
+ DestroyList();
+ if (retBuf)
+ delete retBuf;
+ retBuf = NULL;
+}
+
+
+/********************************************************************
+* Class: CPipes.
+*
+* Purpose: Creates needed pipes, depending on creationFlag.
+* Like GNU Make does, we use an Handle array for our pipes.
+* Parent Process Side is stdXXX[0] and Child Process Side is stdXXX[1].
+*
+* Ex: PARENT ->[0]IN_PIPE[1]-> CHILD_IO ->[1]OUT_PIPE[0]-> PARENT
+* ->[1]ERR_PIPE[0]-> PARENT
+* Revisions:
+*
+********************************************************************/
+CPipes::CPipes(){
+ hIn[0] = NULL;
+ hIn[1] = NULL;
+ hOut[0] = NULL;
+ hOut[1] = NULL;
+ hErr[0] = NULL;
+ hErr[1] = NULL;
+}
+
+CPipes::~CPipes(){
+}
+
+bool CPipes::Create(WORD creationFlag, bool winNT){
+ /* Create needed pipes according to creationFlag */
+ /* Parent side of pipes is [0], child side is [1] */
+ HANDLE hDup;
+ SECURITY_ATTRIBUTES sa;
+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+ sa.bInheritHandle = TRUE;
+ sa.lpSecurityDescriptor = NULL;
+
+ if (winNT){
+ /* Create a security descriptor for Windows NT */
+ SECURITY_DESCRIPTOR sd;
+ if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)){
+ sprintf(errmsg, "vm error: Process.cpp InitializeSecurityDescriptor(winNT) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+ if (!SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE)){
+ sprintf(errmsg, "vm error: Process.cpp SetSecurityDescriptorDacl(winNT) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+ sa.lpSecurityDescriptor = &sd;
+ }
+
+ /* Input pipe */
+ if (!CreatePipe(&hIn[1], &hIn[0], &sa, 0)){
+ sprintf(errmsg, "vm error: Process.cpp CreatePipe(In) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+
+ if (!DuplicateHandle(GetCurrentProcess(),
+ hIn[0],
+ GetCurrentProcess(),
+ &hDup,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS)){
+ sprintf(errmsg, "vm error: Process.cpp DuplicateHandle(In) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+ CloseHandle(hIn[0]);
+ hIn[0] = hDup;
+
+ /* Output pipe */
+ if (!CreatePipe(&hOut[0], &hOut[1], &sa, 0)){
+ sprintf(errmsg, "vm error: Process.cpp CreatePipe(Out) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+
+ if (!DuplicateHandle(GetCurrentProcess(),
+ hOut[0],
+ GetCurrentProcess(),
+ &hDup,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS)){
+ sprintf(errmsg, "vm error: Process.cpp DuplicateHandle(Out) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+ CloseHandle(hOut[0]);
+ hOut[0] = hDup;
+
+ /* Error pipe */
+ if (!(creationFlag & OUTERR_PIPE) && (creationFlag & ERR_PIPE)){
+ if (!CreatePipe(&hErr[0], &hErr[1], &sa, 0)){
+ sprintf(errmsg, "vm error: Process.cpp CreatePipe(Err) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+
+ if (!DuplicateHandle(GetCurrentProcess(),
+ hErr[0],
+ GetCurrentProcess(),
+ &hDup,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS)){
+ sprintf(errmsg, "vm error: Process.cpp DuplicateHandle(Err) failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }
+ CloseHandle(hErr[0]);
+ hErr[0] = hDup;
+ }
+return true;
+}
+
+bool CPipes::CloseChildSide(void){
+return Close(1);
+}
+
+bool CPipes::CloseParentSide(void){
+return Close(0);
+}
+
+bool CPipes::Close(int side){
+
+ if (side < 0 || side > 1)
+ return false;
+
+ if (hIn[side]){
+ CloseHandle(hIn[side]);
+ hIn[side] = NULL;
+ }
+
+ if (hOut[side]){
+ CloseHandle(hOut[side]);
+ hOut[side] = NULL;
+ }
+
+ if (hErr[side]){
+ CloseHandle(hErr[side]);
+ hErr[side] = NULL;
+ }
+return true;
+}
+
+
+/********************************************************************
+* Class: CProcess.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CProcess::CProcess(){
+ Running = false;
+ exitCode = 0;
+
+ pi.hProcess = 0;
+ pi.hThread = 0;
+ pi.dwProcessId = 0;
+ pi.dwThreadId = 0;
+}
+
+CProcess::~CProcess(){
+}
+
+/********************************************************************
+* Manage Tasks.
+********************************************************************/
+bool CProcess::isRunning(void){
+ if (Running){
+ MsgBox.DisplayWarning("A process is already running !");
+ return true;
+ }
+return false;
+}
+
+CTask * CProcess::AddTask(char * cmdLine, WORD creationFlag, WORD outputFlag){
+ CTask * newTask = new CTask;
+
+ strcpy(newTask->cmdLine, cmdLine);
+ newTask->creationFlag = creationFlag;
+ newTask->outputFlag = outputFlag;
+ Push(newTask);
+return newTask;
+}
+
+bool CProcess::CmdCat(char * cmdLine){
+ CTask * task = (CTask*) GetCurrent();
+ if (!task)
+ return false;
+
+ strcat(task->cmdLine, cmdLine);
+return true;
+}
+
+/********************************************************************
+* RunNext/Run/RunProcess.
+********************************************************************/
+void __cdecl call_thread(void * ptr){
+ /* C++ adapter */
+ ((CProcess *) ptr)->Run_Thread_Internal();
+}
+
+void CProcess::Run(void){
+ // Check if something is already running before creating a thread.
+ if (!Running){
+ // Call Run_Thread_Internal()
+ _beginthread(call_thread, 1024 * 1024, (void *) this);
+ }
+}
+
+void CProcess::Run_Thread_Internal(void){
+ exitCode = 0;
+ /* Execute each task */
+ for ( ; ; ){
+ /* If previous task returns an error code, abort */
+ if (exitCode != 0)
+ break;
+
+ // Get one task to execute.
+ currTask = Pop();
+
+ // Nothing to run.
+ if (!currTask)
+ break;
+
+ /* Show command lines ?*/
+ winApp.Report.Append(currTask->cmdLine, LVOUT_NORMAL);
+
+ if (RunProcess(currTask)){
+ winApp.Report.Append("Abort !", LVOUT_NORMAL);
+ exitCode = 1;
+ break;
+ }
+ }
+
+ // Successful ?
+ if (exitCode == 0)
+ winApp.Report.Append("Performed successfully.", LVOUT_NORMAL);
+
+ Flush();
+ Running = false;
+return;
+}
+
+bool CProcess::RunProcess(CTask * task){
+ if (!task)
+ return false;
+
+ bool usePipes = task->creationFlag;
+ STARTUPINFO si = {sizeof(STARTUPINFO), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0};
+
+ /* PROCESS_INFORMATION */
+ pi.hProcess = 0;
+ pi.hThread = 0;
+ pi.dwProcessId = 0;
+ pi.dwThreadId = 0;
+
+ /* Process creation with pipes */
+ if (usePipes){
+ /* Create needed pipes according to creationFlag */
+ if(!Pipes.Create(task->creationFlag, winApp.isWinNT)){
+ Pipes.CloseChildSide();
+ Pipes.CloseParentSide();
+ return false;
+ }
+
+ si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
+ si.wShowWindow = SW_HIDE;
+ //si.wShowWindow = SW_SHOWNORMAL;
+
+ /* Set pipe handles */
+ if (Pipes.hIn[1] != NULL && Pipes.hOut[1] != NULL){
+ si.hStdInput = Pipes.hIn[1];
+ si.hStdOutput = Pipes.hOut[1];
+ if (Pipes.hErr[1] == NULL)
+ si.hStdError = Pipes.hOut[1];
+ else
+ si.hStdError = Pipes.hErr[1];
+ }else{
+ sprintf(errmsg, "vm error: Process.cpp Invalid pipe handle");
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ Pipes.CloseChildSide();
+ Pipes.CloseParentSide();
+ return false;
+ }
+ }
+
+ /* Create the child process */
+ Running = CreateProcess(NULL,
+ task->cmdLine,
+ NULL,
+ NULL,
+ usePipes,
+ 0,
+ NULL,
+ /*startDir[0] ? startDir :*/ NULL,
+ &si,
+ &pi);
+
+ if (!Running){
+ /* CreateProcess failed. Close handles and return */
+ Pipes.CloseChildSide();
+ Pipes.CloseParentSide();
+ sprintf(errmsg, "vm error: Process.cpp CreateProcess failed (e=%d)", (int)GetLastError());
+ winApp.Report.Append(errmsg, LVOUT_ERROR);
+ return false;
+ }else{
+ /* Close child process handles */
+ Pipes.CloseChildSide();
+
+ if (!(usePipes & IN_PIPE)){
+ /* Don't use the Input pipe */
+ ::CloseHandle(Pipes.hIn[0]);
+ Pipes.hIn[0] = NULL;
+ }
+ }
+
+ //sprintf(errmsg, "vm debug: enter io loop");
+ //winApp.Report.Append(errmsg, LVOUT_ERROR);
+ if (usePipes){
+ /* Initialize buffers */
+ *outBuf = 0;
+ chr = outBuf;
+ bool bResult;
+ for ( ; ; ){
+ Sleep(100L);
+
+ bResult = ReadStdOut(task, Pipes.hOut[0]);
+ if (bResult != NO_ERROR)
+ break;
+
+ ::GetExitCodeProcess(pi.hProcess, &exitCode);
+ if (exitCode != STILL_ACTIVE){
+ break;
+ }
+ }
+ }
+ //sprintf(errmsg, "vm debug: exit io loop");
+ //winApp.Report.Append(errmsg, LVOUT_ERROR);
+
+ /* The child process is running. Perform I/O until terminated */
+ ::WaitForSingleObject(pi.hProcess, INFINITE);
+ /* Process terminated. Get exit code. */
+ ::GetExitCodeProcess(pi.hProcess, &exitCode);
+ if (exitCode == NO_ERROR){
+ return NO_ERROR;
+ }
+ /* Close handles */
+ Pipes.CloseParentSide();
+ ::CloseHandle(pi.hProcess);
+ if (pi.hThread){
+ ::CloseHandle(pi.hThread);
+ pi.hThread = NULL;
+ }
+return exitCode;
+}
+
+/********************************************************************
+* Pipes input/output.
+********************************************************************/
+void CProcess::WriteStdIn(HANDLE hPipe, WORD){
+ if (!hPipe)
+ return;
+
+return;
+}
+
+void CProcess::ReadStdErr(HANDLE hPipe, WORD){
+ if (!hPipe)
+ return;
+
+return;
+}
+
+long CProcess::ReadStdOut(CTask * task, HANDLE hPipe){
+ if (!task || !hPipe)
+ return ERROR_INVALID_FUNCTION;
+
+ /* Copy each char and output lines while there is something to read */
+ for ( ; ; ){
+ // Copy one char, return if nothing available.
+ if (!ReadOneChar(hPipe, chr))
+ break;
+
+ // Ignore CR.
+ if (*chr == '\r')
+ continue;
+
+ if (*chr != '\n'){
+ chr++;
+ /* @@TODO Overflow
+ if ((chr - outBuf) >= max_len)
+ realloc(buffer);*/
+ // End of line
+ }else if (*chr =='\n'){
+ *chr = '\0';
+ // Output error lines to List View.
+ if (task->outputFlag == STDOUT_FILE_APPEND){
+ WriteFileAppend(task->szFileName, outBuf, (chr - outBuf));
+ }else{
+ OutputLine(task->outputFlag, outBuf, (chr - outBuf));
+ }
+ *outBuf = '\0';
+ chr = outBuf;
+ }
+ }
+return NO_ERROR;
+}
+
+int CProcess::ReadOneChar(HANDLE hPipe, char * chrin){
+ DWORD bytesRead = 0;
+ DWORD bytesAvail = 0;
+
+ if (!PeekNamedPipe(hPipe, chrin, (DWORD)1, &bytesRead, &bytesAvail, NULL))
+ return 0;
+
+ if (bytesAvail == 0)
+ return 0;
+
+ if (!ReadFile(hPipe, chrin, (DWORD)1, &bytesRead, NULL))
+ return 0;
+
+return bytesRead;
+}
+
+bool CProcess::CommandLine(char * cmdLine){
+ if (!Pipes.hIn[0])
+ return false;
+ if (!Running || !currTask || !currTask->creationFlag)
+ return false;
+ int len = strlen(cmdLine);
+ if (len){
+ strcpy(inBuf, cmdLine);
+ char * s = inBuf;
+ s+=len;
+ *s = '\r';
+ s++;
+ *s = '\n';
+ s++;
+ *s = '\0';
+ }
+ DWORD written;
+
+ if (!WriteFile(Pipes.hIn[0], inBuf, strlen(inBuf), &written, 0))
+ return false;
+
+return true;
+}
+
+bool CProcess::WriteFileAppend(char * fileName, char * line, int /*len*/){
+ if (!*fileName)
+ return false;
+
+ /* Append one line of text to a file */
+ FILE * file = fopen(fileName, "a");
+ if (file){
+ fprintf(file, line);
+ fprintf(file, "\n");
+ fclose(file);
+ return true;
+ }
+return false;
+}
+
+bool CProcess::OutputLine(WORD outputFlag, char * line, int /*len*/){
+ /* Output error lines to List View */
+
+ CriticalSection.Enter();
+ winApp.Report.Append(line, outputFlag);
+ CriticalSection.Leave();
+return true;
+}
+
--- /dev/null
+/********************************************************************
+* Module: process.h. This is part of Visual-MinGW.
+*
+* License: Visual-MinGW is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+********************************************************************/
+#ifndef PROCESS_H
+#define PROCESS_H
+#include "winui.h"
+#include "CList.h"
+
+
+class CCommandDlg : public CDlgBase
+{
+ public:
+ CCommandDlg();
+ ~CCommandDlg();
+
+ HWND Create(void);
+ LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+ char cmdLine[1024];
+
+ protected:
+
+ private:
+ HWND hCmdLine;
+};
+
+/********************************************************
+ creationFlag truth table
+ -----------------------------------
+ 8 4 2 1
+ ------------------
+ NO_PIPE 0 0 0 0
+ IN_PIPE 0 0 0 1
+ OUT_PIPE 0 0 1 0
+ ERR_PIPE 0 1 0 0
+ OUTERR_PIPE 1 0 1 0
+
+*********************************************************/
+#define NO_PIPE 0x0000
+#define IN_PIPE 0x0001
+#define OUT_PIPE 0x0002
+#define ERR_PIPE 0x0004
+#define OUTERR_PIPE 0x000A
+
+#define STDOUT_NONE 0
+#define STDOUT_FILE_APPEND 1
+#define STDOUT_USER 2
+
+class CTask : public CNode
+{
+ public:
+ CTask();
+ ~CTask();
+
+ char cmdLine[MAX_PATH];
+ char szFileName[MAX_PATH];
+ WORD creationFlag;
+ WORD outputFlag;
+
+ protected:
+
+ private:
+
+};
+
+class CStack : public CList
+{
+ public:
+ CStack();
+ ~CStack();
+
+ int Push(CTask * newTask);
+ CTask * Pop(void);
+ void Flush(void);
+
+ protected:
+
+ private:
+ CTask * retBuf;
+ void DetachCurrent(void);
+};
+
+class CPipes
+{
+ public:
+ CPipes();
+ ~CPipes();
+
+ HANDLE hIn[2];
+ HANDLE hOut[2];
+ HANDLE hErr[2];
+
+ bool Create(WORD creationFlag, bool winNT);
+ bool CloseChildSide(void);
+ bool CloseParentSide(void);
+ protected:
+
+ private:
+ bool Close(int side);
+};
+
+class CProcess : public CStack
+{
+ public:
+ CProcess();
+ ~CProcess();
+
+ bool CommandLine(char * cmdLine);
+ bool isRunning(void);
+ CTask * AddTask(char * cmdLine, WORD creationFlag, WORD outputFlag/* = STDOUT_NONE*/);
+ bool CmdCat(char * cmdLine);
+ void Run(void);
+ void Run_Thread_Internal(void);
+
+ CCommandDlg CommandDlg;
+ protected:
+
+ private:
+ PROCESS_INFORMATION pi;
+ bool Running;
+ DWORD exitCode;
+ CTask * currTask;
+ CPipes Pipes;
+ char * chr;
+ char inBuf[1024];
+ char outBuf[1024];
+ char errBuf[1024];
+
+ bool RunProcess(CTask * task);
+
+ void WriteStdIn(HANDLE hPipe, WORD creationFlag);
+ void ReadStdErr(HANDLE hPipe, WORD creationFlag);
+ long ReadStdOut(CTask * task, HANDLE hPipe);
+ int ReadOneChar(HANDLE hPipe, char * chrin);
+
+ bool WriteFileAppend(char * fileName, char * line, int len=-1);
+ bool OutputLine(WORD outputFlag, char * line, int len=-1);
+};
+
+#endif
--- /dev/null
+/********************************************************************
+* Module: project.cpp. This is part of Visual-MinGW.
+*
+* Purpose: Procedures to manage a loaded project.
+*
+* Authors: Manu B.
+*
+* License: Visual-MinGW is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+* Revisions:
+*
+********************************************************************/
+#include <windows.h>
+#include <stdio.h>
+
+#include "project.h"
+#include "rsrc.h"
+
+extern CMessageBox MsgBox;
+
+// For dialogs.
+extern CWinApp winApp;
+
+WORD AppendPath(char * dirBuffer, WORD offset, char * absolutePath);
+
+bool CheckFile(CFileItem * file){
+ if (!file)
+ return false;
+
+ char * fileName = file->szFileName;
+ char * s = fileName;
+ char * dot = fileName;
+ char * bkslash = fileName+1;
+ // Valid relative path ?
+ if (*dot == '.' && *bkslash == '\\'){
+ s+=2;
+ // Find backslashes & dots.
+ while (*s != '\0'){
+ if (*s == '\\'){
+ bkslash = s;
+ }else if (*s == '.'){
+ dot = s;
+ }
+ s++;
+ }
+ if (*bkslash != '\0'){
+ file->nFileOffset = (bkslash - fileName) +1;
+ }else{
+ file->nFileOffset = 0;
+ return false;
+ }
+
+ if (dot != fileName)
+ file->nFileExtension = (dot - fileName) +1;
+ else
+ file->nFileExtension = 0;
+ return true;
+ }
+return false;
+}
+
+WORD AppendPath(char * dirBuffer, WORD offset, char * absolutePath){
+ WORD len = 0;
+ if (absolutePath[0] == '.'){
+ if (absolutePath[1] == '\\' && absolutePath[2] != '\0'){
+ dirBuffer[offset-1] = '\\';
+ strcpy(&dirBuffer[offset], &absolutePath[2]);
+ len = strlen(&dirBuffer[offset]);
+ len++;
+ }
+ }
+return len;
+}
+
+
+/********************************************************************
+* Class: COptionsDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+COptionsDlg::COptionsDlg(){
+ pProject = NULL;
+ pMakefile = NULL;
+}
+
+COptionsDlg::~COptionsDlg(){
+}
+
+LRESULT CALLBACK COptionsDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_NOTIFY:
+ OnNotify((int) wParam, (LPNMHDR) lParam);
+ break;
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL COptionsDlg::OnInitDialog(HWND, LPARAM lInitParam){
+ // Set pointers.
+ pProject = (CProject *) lInitParam;
+ if (pProject == NULL)
+ return TRUE;
+
+ // Tab control handle and TCITEM.
+ _hWndTab = ::GetDlgItem(_hWnd, IDC_OPTION_TABS);
+ tcitem.mask = TCIF_TEXT | TCIF_PARAM;
+
+ // Insert General tab.
+ HWND hwndChild = GeneralDlg.Create(this, IDD_GENERAL_PANE, NULL, (long) pProject);
+ tcitem.pszText = "General";
+ tcitem.lParam = (long) &GeneralDlg;
+ ::SendMessage(_hWndTab, TCM_INSERTITEM, 0,
+ (LPARAM)&tcitem);
+ SetChildPosition(hwndChild);
+
+ // Insert Compiler tab item.
+ CompilerDlg.Create(this, IDD_COMPILER, &Pos, (long) pProject);
+ tcitem.pszText = "Compiler";
+ tcitem.lParam = (long) &CompilerDlg;
+ ::SendMessage(_hWndTab, TCM_INSERTITEM, 1,
+ (LPARAM)&tcitem);
+
+ // Insert Linker tab.
+ LinkerDlg.Create(this, IDD_LINKER, &Pos, (long) pProject);
+ tcitem.pszText = "Linker";
+ tcitem.lParam = (long) &LinkerDlg;
+ ::SendMessage(_hWndTab, TCM_INSERTITEM, 2,
+ (LPARAM)&tcitem);
+
+ // Insert Archives tab.
+ ZipDlg.Create(this, IDD_ZIP, &Pos, (long) pProject);
+ tcitem.pszText = "Archives";
+ tcitem.lParam = (long) &ZipDlg;
+ ::SendMessage(_hWndTab, TCM_INSERTITEM, 3,
+ (LPARAM)&tcitem);
+
+ // Show the dialog and default pane.
+ Show();
+ GeneralDlg.Show();
+ GeneralDlg.SetFocus();
+return TRUE;
+}
+
+BOOL COptionsDlg::OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl){
+ switch (wID){
+ case IDOK:
+ GeneralDlg.OnCommand(wNotifyCode, wID, hwndCtl);
+ CompilerDlg.OnCommand(wNotifyCode, wID, hwndCtl);
+ LinkerDlg.OnCommand(wNotifyCode, wID, hwndCtl);
+ ZipDlg.OnCommand(wNotifyCode, wID, hwndCtl);
+ pProject->buildMakefile = true;
+ pProject->modified = true;
+ EndDlg(IDOK);
+ return TRUE;
+
+ case IDCANCEL:
+ EndDlg(IDCANCEL);
+ break;
+ }
+return 0;
+}
+
+BOOL COptionsDlg::EndDlg(int nResult){
+ GeneralDlg.EndDlg(0);
+ CompilerDlg.EndDlg(0);
+ LinkerDlg.EndDlg(0);
+ ZipDlg.EndDlg(0);
+ if (_hWnd){
+ BOOL result = ::EndDialog(_hWnd, nResult);
+ _hWnd = 0;
+ return result;
+ }
+return false;
+}
+
+
+/********************************************************************
+* Class: CGeneralDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CGeneralDlg::CGeneralDlg(){
+ pProject = NULL;
+ pMakefile = NULL;
+}
+
+CGeneralDlg::~CGeneralDlg(){
+}
+
+LRESULT CALLBACK CGeneralDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CGeneralDlg::OnInitDialog(HWND, LPARAM lInitParam){
+ /* Set pointers */
+ pProject = (CProject *) lInitParam;
+ if (pProject == NULL || &pProject->Makefile == NULL)
+ return TRUE;
+ pMakefile = &pProject->Makefile;
+
+ /* Get control handles */
+ hStatLib = GetItem(IDC_STATLIB);
+ hDll = GetItem(IDC_DLL);
+ hConsole = GetItem(IDC_CONSOLE);
+ hGuiExe = GetItem(IDC_GUIEXE);
+ hDbgSym = GetItem(IDC_DBGSYM);
+ hLangC = GetItem(IDC_LANGC);
+ hLangCpp = GetItem(IDC_LANGCPP);
+ hMkfName = GetItem(IDC_MKF_NAME);
+ hMkfDir = GetItem(IDC_MKF_DIR);
+ hUserMkf = GetItem(IDC_USER_MKF);
+ hTgtName = GetItem(IDC_TGT_NAME);
+ hTgtDir = GetItem(IDC_TGT_DIR);
+
+ /* Set buttons state */
+ switch(pMakefile->buildWhat){
+ case BUILD_STATLIB:
+ ::SendMessage(hStatLib, BM_SETCHECK, BST_CHECKED, 0);
+ break;
+ case BUILD_DLL:
+ ::SendMessage(hDll, BM_SETCHECK, BST_CHECKED, 0);
+ break;
+ case BUILD_EXE:
+ ::SendMessage(hConsole, BM_SETCHECK, BST_CHECKED, 0);
+ break;
+ case BUILD_GUIEXE:
+ ::SendMessage(hGuiExe, BM_SETCHECK, BST_CHECKED, 0);
+ break;
+ }
+ if (pMakefile->debug)
+ ::SendMessage(hDbgSym, BM_SETCHECK, BST_CHECKED, 0);
+
+ if (pMakefile->lang == LANGCPP)
+ ::SendMessage(hLangCpp, BM_SETCHECK, BST_CHECKED, 0);
+ else
+ ::SendMessage(hLangC, BM_SETCHECK, BST_CHECKED, 0);
+
+ /* Set text */
+ char name[64];
+ if (pMakefile->nFileOffset){
+ strcpy(name, &pMakefile->szFileName[pMakefile->nFileOffset]);
+ }else{
+ strcpy(name, "noname");
+ }
+
+ SetItemText(hMkfName, name);
+ SetItemText(hMkfDir, pMakefile->mkfDir);
+ SetItemText(hTgtName, pMakefile->target);
+ SetItemText(hTgtDir, pMakefile->tgtDir);
+return TRUE;
+}
+
+BOOL CGeneralDlg::OnCommand(WORD, WORD wID, HWND){
+ switch (wID){
+ case IDOK:{
+ /* Get text */
+ char name[64];
+ GetItemText(hMkfName, name, 64);
+ GetItemText(hMkfDir, pMakefile->mkfDir, MAX_PATH);
+ GetItemText(hTgtName, pMakefile->target, 64);
+ GetItemText(hTgtDir, pMakefile->tgtDir, MAX_PATH);
+
+ pMakefile->GetFullPath(pMakefile->szFileName, pProject->nFileOffset, name);
+ //@@TODO check if directories exist.
+
+ /* Get buttons state */
+ char * pExt = strrchr(pMakefile->target, '.');
+ if (!pExt){
+ int len = strlen(pMakefile->target);
+ if (!len){
+ strcpy(pMakefile->target, "noname");
+ len = strlen(pMakefile->target);
+ }
+ pExt = pMakefile->target + len;
+ }
+ if (BST_CHECKED == ::SendMessage(hStatLib, BM_GETCHECK, 0, 0)){
+ pMakefile->buildWhat = BUILD_STATLIB;
+ strcpy(pExt, ".a");
+ }else if (BST_CHECKED == ::SendMessage(hDll, BM_GETCHECK, 0, 0)){
+ pMakefile->buildWhat = BUILD_DLL;
+ strcpy(pExt, ".dll");
+ }else if (BST_CHECKED == ::SendMessage(hConsole, BM_GETCHECK, 0, 0)){
+ pMakefile->buildWhat = BUILD_EXE;
+ strcpy(pExt, ".exe");
+ }else if (BST_CHECKED == ::SendMessage(hGuiExe, BM_GETCHECK, 0, 0)){
+ pMakefile->buildWhat = BUILD_GUIEXE;
+ strcpy(pExt, ".exe");
+ }
+ pMakefile->debug =
+ (BST_CHECKED==::SendMessage(hDbgSym, BM_GETCHECK, 0, 0));
+
+ if (BST_CHECKED == ::SendMessage(hLangCpp, BM_GETCHECK, 0, 0)){
+ pMakefile->lang = LANGCPP;
+ strcpy(pMakefile->cc, "g++");
+ }else{
+ pMakefile->lang = LANGC;
+ strcpy(pMakefile->cc, "gcc");
+ }
+ }
+ return TRUE;
+
+ case IDCANCEL:
+ return FALSE;
+ }
+return FALSE;
+}
+
+
+/********************************************************************
+* Class: CCompilerDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CCompilerDlg::CCompilerDlg(){
+ pProject = NULL;
+ pMakefile = NULL;
+}
+
+CCompilerDlg::~CCompilerDlg(){
+}
+
+LRESULT CALLBACK CCompilerDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CCompilerDlg::OnInitDialog(HWND, LPARAM lInitParam){
+ // Set pointers.
+ pProject = (CProject *) lInitParam;
+ if (pProject == NULL || &pProject->Makefile == NULL)
+ return TRUE;
+ pMakefile = &pProject->Makefile;
+
+ hCppFlags = GetItem(IDC_CPPFLAGS);
+ hWarning = GetItem(IDC_WARNING);
+ hOptimiz = GetItem(IDC_OPTIMIZ);
+ hCFlags = GetItem(IDC_CFLAGS);
+ hIncDirs = GetItem(IDC_INCDIRS);
+
+ SetItemText(hCppFlags, pMakefile->cppFlags);
+ SetItemText(hWarning, pMakefile->warning);
+ SetItemText(hOptimiz, pMakefile->optimize);
+ SetItemText(hCFlags, pMakefile->cFlags);
+ SetItemText(hIncDirs, pMakefile->incDirs);
+return TRUE;
+}
+
+BOOL CCompilerDlg::OnCommand(WORD, WORD wID, HWND){
+ switch (wID){
+ case IDOK:
+ GetItemText(hCppFlags, pMakefile->cppFlags, 256);
+ GetItemText(hWarning, pMakefile->warning, 64);
+ GetItemText(hOptimiz, pMakefile->optimize, 64);
+ GetItemText(hCFlags, pMakefile->cFlags, 64);
+ GetItemText(hIncDirs, pMakefile->incDirs, 256);
+ return TRUE;
+
+ case IDCANCEL:
+ return FALSE;
+ }
+return FALSE;
+}
+
+
+/********************************************************************
+* Class: CLinkerDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CLinkerDlg::CLinkerDlg(){
+ pProject = NULL;
+ pMakefile = NULL;
+}
+
+CLinkerDlg::~CLinkerDlg(){
+}
+
+LRESULT CALLBACK CLinkerDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CLinkerDlg::OnInitDialog(HWND, LPARAM lInitParam){
+ // Set pointers.
+ pProject = (CProject *) lInitParam;
+ if (pProject == NULL || &pProject->Makefile == NULL)
+ return TRUE;
+ pMakefile = &pProject->Makefile;
+
+ hLdStrip = GetItem(IDC_LDSTRIP);
+ hLdOpts = GetItem(IDC_LDOPTS);
+ hLdLibs = GetItem(IDC_LDLIBS);
+ hLibsDirs = GetItem(IDC_LIBDIRS);
+
+ SetItemText(hLdStrip, pMakefile->ldStrip);
+ SetItemText(hLdOpts, pMakefile->ldOpts);
+ SetItemText(hLdLibs, pMakefile->ldLibs);
+ SetItemText(hLibsDirs, pMakefile->libDirs);
+return TRUE;
+}
+
+BOOL CLinkerDlg::OnCommand(WORD, WORD wID, HWND){
+ switch (wID){
+ case IDOK:
+ GetItemText(hLdStrip, pMakefile->ldStrip, 32);
+ GetItemText(hLdOpts, pMakefile->ldOpts, 64);
+ GetItemText(hLdLibs, pMakefile->ldLibs, 64);
+ GetItemText(hLibsDirs, pMakefile->libDirs, 256);
+ return TRUE;
+
+ case IDCANCEL:
+ return FALSE;
+ }
+return FALSE;
+}
+
+
+/********************************************************************
+* Class: CZipDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CZipDlg::CZipDlg(){
+ pProject = NULL;
+ pMakefile = NULL;
+}
+
+CZipDlg::~CZipDlg(){
+}
+
+LRESULT CALLBACK CZipDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+ switch(Message){
+ case WM_INITDIALOG:
+ return OnInitDialog((HWND) wParam, lParam);
+
+ case WM_COMMAND:
+ OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam);
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+BOOL CZipDlg::OnInitDialog(HWND, LPARAM lInitParam){
+ // Set pointers.
+ pProject = (CProject *) lInitParam;
+ if (pProject == NULL || &pProject->Makefile == NULL)
+ return TRUE;
+ pMakefile = &pProject->Makefile;
+
+ hZipDir = GetItem(IDC_ZIP_DIR);
+ hZipFlags = GetItem(IDC_ZIPFLAGS);
+ SetItemText(hZipDir, pProject->zipDir);
+ SetItemText(hZipFlags, pProject->zipFlags);
+return TRUE;
+}
+
+BOOL CZipDlg::OnCommand(WORD, WORD wID, HWND){
+ switch (wID){
+ case IDOK:
+ GetItemText(hZipDir, pProject->zipDir, MAX_PATH);
+ GetItemText(hZipFlags, pProject->zipFlags, 256);
+ return TRUE;
+
+ case IDCANCEL:
+ return FALSE;
+ }
+return FALSE;
+}
+
+
+/********************************************************************
+* Class: CNewModuleDlg.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CNewModuleDlg::CNewModuleDlg(){
+ pProject = NULL;
+}
+
+CNewModuleDlg::~CNewModuleDlg(){
+}
+
+LRESULT CALLBACK CNewModuleDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){
+
+ char fileName[64];
+ bool createHeader = true;
+ HWND wCreateHeader = GetItem(IDC_HEADER);
+
+ switch(Message){
+ case WM_INITDIALOG:
+ pProject = (CProject *) lParam;
+ if (createHeader)
+ ::SendMessage(wCreateHeader, BM_SETCHECK, BST_CHECKED, 0);
+ strcpy(fileName, "new.cpp");
+ ::SetDlgItemText(_hWnd, 301, fileName);
+ return TRUE;
+
+ case WM_COMMAND:
+ if (LOWORD(wParam) == IDCANCEL){
+ fileName[0] = 0;
+ EndDlg(IDCANCEL);
+ return FALSE;
+ }else if(LOWORD(wParam) == IDOK){
+ ::GetDlgItemText(_hWnd, 301, fileName, 64);
+ createHeader = BST_CHECKED ==
+ ::SendMessage(wCreateHeader, BM_GETCHECK, 0, 0);
+ pProject->NewModule(fileName, createHeader);
+ EndDlg(IDCANCEL);
+ return TRUE;
+ }
+ break;
+
+ case WM_CLOSE:
+ EndDlg(0);
+ break;
+ }
+return FALSE;
+}
+
+
+/********************************************************************
+* Class: CProject.
+*
+* Purpose: Project management.
+*
+* Revisions:
+*
+********************************************************************/
+//@@TODO close project Dlg's before closing Project.
+CProject::CProject(){
+ prjVer = 40;
+}
+
+CProject::~CProject(){
+}
+
+void CProject::Reset(){
+ szFileName[MAX_PATH - 1] = '\0'; // security.
+ szFileName[0] = '\0';
+ szDirBuffer[0] = '\0';
+ nFileOffset = 0;
+ nFileExtension = 0;
+
+ strcpy (zipDir, ".");
+ strcpy (zipFlags, "*.*");
+ numFiles = 0;
+ loaded = false;
+ modified = false;
+ buildMakefile = true;
+
+ compilerName[0] = '\0';
+
+ Makefile.Init();
+}
+
+bool CProject::NoProject(void){
+ if (!loaded){
+ MsgBox.DisplayWarning("No project loaded");
+ // Or directly show open project dlg.
+ return true;
+ }
+return false;
+}
+
+int CProject::CloseDecision(void){
+ if (loaded){
+ return MsgBox.Ask("Close current project ?", false);
+ }
+return IDNO;
+}
+
+bool CProject::SwitchCurrentDir(void){
+ // Switch to Project Directory
+ szDirBuffer[nFileOffset-1] = '\0';
+return ::SetCurrentDirectory(szDirBuffer);
+}
+
+bool CProject::RelativeToAbsolute(char * relativePath){
+ if (*szDirBuffer && nFileOffset){
+ if (relativePath[0] == '.' && relativePath[1] == '\\'
+ && relativePath[2] != '\0'){
+ szDirBuffer[nFileOffset-1] = '\\';
+ strcpy(&szDirBuffer[nFileOffset], &relativePath[2]);
+ return true;
+ }
+ }
+return false;
+}
+
+
+/********************************************************************
+* New Project.
+********************************************************************/
+bool CProject::New(char * fileName, WORD fileOffset){
+ // Load default values.
+ Reset();
+
+ // Copy project file's directory.
+ strcpy(szFileName, fileName);
+ nFileOffset = fileOffset;
+
+ strncpy(szDirBuffer, szFileName, (nFileOffset - 1));
+ szDirBuffer[nFileOffset-1] = '\0';
+ strcpy(winApp.projectDir, szDirBuffer);
+
+ // Makefile: Get target name.
+ nFileExtension = winApp.FileDlg.GetFileExtension();
+ strcpy(Makefile.target, &szFileName[nFileOffset]);
+ char * pExt = strrchr(Makefile.target, '.');
+ if (pExt){
+ *pExt='\0';
+ }
+ loaded = true;
+
+ AddFiles();
+
+ Makefile.GetFullPath(szFileName, nFileOffset, "makefile");
+
+ buildMakefile = true;
+ OptionsDlg();
+ SavePrjFile(IDYES);
+return true;
+}
+
+/********************************************************************
+* Open Project.
+********************************************************************/
+bool CProject::Open(char * fileName, WORD fileOffset){
+ // Initialize project tree view.
+ Reset();
+
+ // Copy project file's directory.
+ strcpy(szFileName, fileName);
+ nFileOffset = fileOffset;
+
+ strncpy(szDirBuffer, szFileName, (nFileOffset - 1));
+ szDirBuffer[nFileOffset-1] = '\0';
+ strcpy(winApp.projectDir, szDirBuffer);
+
+ // Load project file in a buffer.
+ if (!PrjFile.Load(szFileName)){
+ MsgBox.DisplayFatal("Can't load project file !");
+ //@@ should close inifile ?
+ return false;
+ }
+
+ char name[64];
+ *name = '\0';
+ // [Project] section
+ int signature = PrjFile.GetInt( "Signature", "Project" );
+ if (signature != prjVer){
+ MsgBox.DisplayFatal("Bad signature in the project file !");
+ return false;
+ }
+
+ numFiles = PrjFile.GetInt( "NumFiles" );
+ PrjFile.GetString(compilerName, "Compiler" );
+ buildMakefile = PrjFile.GetInt( "BuildMakefile" );
+
+ // [Archives] section
+ PrjFile.GetString(zipDir, "Directory", "Archives" );
+ PrjFile.GetString(zipFlags, "Flags");
+
+ // [Makefile] section
+ PrjFile.GetString(Makefile.make, "Make", "Makefile" );
+ PrjFile.GetString(Makefile.cc, "CC" );
+ PrjFile.GetString(Makefile.wres, "WRES" );
+ PrjFile.GetString(Makefile.test, "TEST" );
+ PrjFile.GetString(name, "Makefile" );
+ PrjFile.GetString(Makefile.mkfDir, "MakefileDir");
+ PrjFile.GetString(Makefile.target, "Target" );
+ PrjFile.GetString(Makefile.tgtDir, "TargetDir" );
+ Makefile.buildWhat = PrjFile.GetInt( "Build" );
+ Makefile.debug = PrjFile.GetInt( "Debug" );
+ Makefile.lang = PrjFile.GetInt( "Lang" );
+ PrjFile.GetString(Makefile.cppFlags, "CppFlags" );
+ PrjFile.GetString(Makefile.warning, "CcWarning");
+ PrjFile.GetString(Makefile.optimize, "CcOptimize");
+ PrjFile.GetString(Makefile.cFlags, "CcFlags" );
+ PrjFile.GetString(Makefile.incDirs, "IncDirs" );
+ PrjFile.GetString(Makefile.ldStrip, "LdStrip" );
+ PrjFile.GetString(Makefile.ldOpts, "LdOptions" );
+ PrjFile.GetString(Makefile.ldLibs, "LdLibraries");
+ PrjFile.GetString(Makefile.libDirs, "LdLibDirs" );
+
+ Makefile.GetFullPath(szFileName, nFileOffset, name);
+
+ if (numFiles){
+ CFileItem * srcFile;
+ // [FileXX] section
+ char fileNumber [8];
+ char fileSection [16];
+
+ for (int n=1; n<=numFiles; n++){
+ itoa(n, fileNumber, 10);
+ strcpy(fileSection, "File");
+ strcat(fileSection, fileNumber);
+
+ // SrcFile
+ srcFile = new CFileItem;
+ srcFile->isInProject = true;
+ PrjFile.GetString(srcFile->szFileName, "Name", fileSection);
+ CheckFile(srcFile);
+ ::GetFileType(srcFile);
+ srcFile->show = PrjFile.GetInt( "Show" );
+
+ if(!winApp.Manager.OpenFile(srcFile)){
+ delete srcFile;
+ return false;
+ }
+ }
+ }
+ loaded = true;
+return true;
+}
+
+int CProject::SavePrjFile(int decision){
+ if (!loaded || !modified)
+ return decision;
+ if (decision == IDNO || decision == IDCANCEL)
+ return decision;
+
+ /* Ask ? */
+ if (decision == IDASK){
+ decision = MsgBox.AskToSave(true); // Cancel button.
+ if (decision != IDYES)
+ return decision; // IDNO or IDCANCEL.
+ }
+
+ CProjectView * pProjectView = &winApp.Manager.ProjectView;
+ FILE * file;
+ CFileItem * srcFile;
+ int count = 0;
+
+ numFiles = pProjectView->Length();
+
+ file = fopen(szFileName, "w");
+ if (!file){
+ MsgBox.DisplayFatal("Can't save project file !");
+ return decision;
+ }
+
+ // [Project]
+ fprintf (file, "[Project]\nSignature = %d" , prjVer );
+ fprintf (file, "\nNumFiles = %d" , numFiles );
+ fprintf (file, "\nCompiler = %s" , compilerName );
+ fprintf (file, "\nBuildMakefile = %d" , buildMakefile );
+
+ // [Archives]
+ fprintf (file, "\n\n[Archives]\nDirectory = %s" , zipDir );
+ fprintf (file, "\nFlags = %s" , zipFlags );
+
+ // [Makefile]
+ fprintf (file, "\n\n[Makefile]\nMAKE = %s" , Makefile.make );
+ fprintf (file, "\nCC = %s" , Makefile.cc );
+ fprintf (file, "\nWRES = %s" , Makefile.wres );
+ fprintf (file, "\nTEST = %s" , Makefile.test );
+ fprintf (file, "\nMakefile = %s" , &Makefile.szFileName[Makefile.nFileOffset]);
+ fprintf (file, "\nMakefileDir = %s" , Makefile.mkfDir );
+ fprintf (file, "\nTarget = %s" , Makefile.target );
+ fprintf (file, "\nTargetDir = %s" , Makefile.tgtDir );
+ fprintf (file, "\nBuild = %d" , Makefile.buildWhat );
+ fprintf (file, "\nDebug = %d" , Makefile.debug );
+ fprintf (file, "\nLang = %d" , Makefile.lang );
+ fprintf (file, "\nCppFlags = %s" , Makefile.cppFlags );
+ fprintf (file, "\nCcWarning = %s" , Makefile.warning );
+ fprintf (file, "\nCcOptimize = %s" , Makefile.optimize );
+ fprintf (file, "\nCcFlags = %s" , Makefile.cFlags );
+ fprintf (file, "\nIncDirs = %s" , Makefile.incDirs );
+ fprintf (file, "\nLdStrip = %s" , Makefile.ldStrip );
+ fprintf (file, "\nLdOptions = %s" , Makefile.ldOpts );
+ fprintf (file, "\nLdLibraries = %s" , Makefile.ldLibs );
+ fprintf (file, "\nLdLibDirs = %s" , Makefile.libDirs );
+
+ /* [Filexx] */
+ srcFile = (CFileItem *) pProjectView->First();
+ while (srcFile){
+ count++;
+ fprintf (file, "\n\n[File%d" , count );
+ fprintf (file, "]\nName = %s" , srcFile->szFileName );
+ fprintf (file, "\nShow = %d" , 0 );
+ srcFile = (CFileItem *) pProjectView->Next();
+ }
+ fprintf (file, "\n");
+ fclose(file);
+ modified = false;
+return decision;
+}
+
+bool CProject::NewModule(char * name, bool createHeader){
+ if (NoProject())
+ return false;
+
+ SwitchCurrentDir();
+
+ CFileItem * srcFile = winApp.Manager.ProjectView.NewFile(name);
+ if (!srcFile){
+ MsgBox.DisplayWarning("Can't create file : %s", name);
+ return false;
+ }
+ if (createHeader && srcFile->type != H_FILE){
+ char header[64];
+ strcpy(header, name);
+ char ext[] = "h";
+ ChangeFileExt(header, ext);
+
+ if (!winApp.Manager.ProjectView.NewFile(header)){
+ MsgBox.DisplayWarning("Can't create file : %s", header);
+ return false;
+ }
+ }
+return true;
+}
+
+bool CProject::AddFiles(void){
+ if (NoProject())
+ return false;
+
+ CFileItem * srcFile;
+ char srcFiles[2048];
+ srcFiles [0] = 0;
+ WORD fileOffset;
+
+ // Show Open dialog.
+ if (!winApp.FileDlg.Open(&winApp, srcFiles, 2048, ADD_SRC_FILE))
+ return false; // canceled by user
+
+ // Check if srcFiles path includes projectDir.
+ int n = 0;
+ int maxlen = nFileOffset - 1;
+ while (n<maxlen){
+ // @@ shouldn't be case sensitive.
+ if (srcFiles[n] != szFileName[n])
+ break;
+ n++;
+ }
+
+ if (srcFiles[n] == '\\' || srcFiles[n] == '\0'){
+ // We are in the project, copy directory name.
+ n++;
+ char relativePath[MAX_PATH];
+ relativePath[0] = '.';
+ relativePath[1] = '\\';
+ int nn = 2;
+
+ fileOffset = winApp.FileDlg.GetFileOffset();
+ maxlen = fileOffset - 1;
+ while (n<maxlen){
+ relativePath[nn] = srcFiles[n];
+ n++;
+ nn++;
+ }
+ if (nn > 2){
+ relativePath[nn] = '\\';
+ nn++;
+ }
+ relativePath[nn] = '\0';
+
+ // Append each file name.
+ fileOffset = winApp.FileDlg.GetFileOffset();
+
+ while (fileOffset){
+ // Try to add each file to the project.
+ srcFile = new CFileItem;
+ strcpy(srcFile->szFileName, relativePath);
+
+ strcat(srcFile->szFileName, &srcFiles[fileOffset]);
+
+ CheckFile(srcFile);
+ ::GetFileType(srcFile);
+ srcFile->show = 0;
+ srcFile->isInProject = true;
+
+ if(!winApp.Manager.ProjectView.OpenFile(srcFile)){
+ delete srcFile;
+ return false;
+ }
+
+ fileOffset = winApp.FileDlg.GetNextFileOffset();
+ }
+ modified = true;
+ buildMakefile = true;
+ return true;
+ }
+ MsgBox.DisplayString("Out of the project");
+return false;
+}
+
+/********************************************************************
+* Dialogs.
+********************************************************************/
+bool CProject::OptionsDlg(void){
+/**/ if (NoProject())
+ return false;
+
+ _OptionsDlg.CreateModal(&winApp, IDD_OPTION, (LPARAM) this);
+return true;
+}
+
+bool CProject::NewModuleDlg(void){
+ if (NoProject())
+ return false;
+
+ _NewModuleDlg.CreateModal(&winApp, IDD_NEW_MODULE, (LPARAM) this);
+return true;
+}
+
+/********************************************************************
+* Project Commands.
+********************************************************************/
+void CProject::ZipSrcs(void){
+ if (NoProject() || winApp.Process.isRunning())
+ return;
+
+ // Switch to Project Directory
+ SwitchCurrentDir();
+
+ winApp.Report.Clear();
+
+ char fileName[64];
+ char date[16];
+ date[0] = 0;
+
+ // Archive name = zipDir\month+day+year+src.zip
+ GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, "MMddyyyy",
+ date, 16);
+
+ if (*zipDir == '\0')
+ strcpy (zipDir, ".");
+ strcpy (fileName, zipDir);
+ strcat (fileName, "\\");
+ strcat (fileName, date);
+ strcat (fileName, "src");
+ strcat (fileName, ".zip");
+
+ char msgBuf[128];
+ sprintf(msgBuf, "Create archive > %s", fileName);
+ winApp.Report.Append(msgBuf, LVOUT_NORMAL);
+
+ // Put the command line and the run flag in the command stack.
+ winApp.Process.AddTask(
+ "zip ",
+ OUTERR_PIPE,
+ LVOUT_NORMAL);
+
+ winApp.Process.CmdCat(fileName);
+ if (*zipFlags){
+ winApp.Process.CmdCat(" ");
+ winApp.Process.CmdCat(zipFlags);
+ }
+
+ winApp.Process.Run();
+}
+
+void CProject::Explore(HWND hwnd){
+ if (NoProject())
+ return;
+
+ if(ShellExecute(hwnd, "explore", szDirBuffer, NULL, NULL, SW_SHOWMAXIMIZED)
+ < (HINSTANCE) 32){
+ MsgBox.DisplayString("Can't launch Explorer");
+ return;
+ }
+}
+
+/********************************************************************
+* Compiler Commands.
+********************************************************************/
+void CProject::Build(void){
+ if (NoProject() || winApp.Process.isRunning())
+ return;
+
+ winApp.Report.Clear();
+ winApp.Report.Append("Invoking compiler...", LVOUT_NORMAL);
+
+ // Save modified files
+ winApp.Manager.ProjectView.SaveAll(IDYES); // Silent.
+
+ // Switch to Makefile Directory
+ Makefile.SwitchCurrentDir();
+
+ /* Build makefile ? */
+ if (buildMakefile){
+ winApp.Report.Append("Building makefile...", LVOUT_NORMAL);
+
+ // Fill buffers and initialize a new process.
+ Makefile.Build(&winApp.Manager.ProjectView, &winApp.Process);
+ buildMakefile = false;
+ modified = true;
+ }
+
+ // Put the command line and the run flag in the command stack.
+ winApp.Process.AddTask(
+ Makefile.make,
+ OUTERR_PIPE,
+ LVOUT_ERROR);
+
+ winApp.Process.CmdCat(" -f ");
+ winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]);
+ if (Makefile.debug)
+ winApp.Process.CmdCat(" debug");
+
+ winApp.Process.Run();
+}
+
+void CProject::RebuildAll(void){
+ if (NoProject() || winApp.Process.isRunning())
+ return;
+
+ // Switch to Makefile Directory
+ Makefile.SwitchCurrentDir();
+
+ winApp.Report.Clear();
+ winApp.Report.Append("Invoking compiler...", LVOUT_NORMAL);
+
+ // Save modified files
+ winApp.Manager.ProjectView.SaveAll(IDYES); // Silent.
+
+ // Build makefile.
+ Makefile.Build(&winApp.Manager.ProjectView, &winApp.Process);
+ buildMakefile = false;
+ modified = true;
+
+ // Make clean.
+ winApp.Process.AddTask(
+ Makefile.make,
+ OUTERR_PIPE,
+ LVOUT_ERROR);
+
+ winApp.Process.CmdCat(" -f ");
+ winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]);
+ winApp.Process.CmdCat(" clean");
+
+ // Build.
+ winApp.Process.AddTask(
+ Makefile.make,
+ OUTERR_PIPE,
+ LVOUT_ERROR);
+
+ winApp.Process.CmdCat(" -f ");
+ winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]);
+ if (Makefile.debug)
+ winApp.Process.CmdCat(" debug");
+
+ winApp.Process.Run();
+}
+
+void CProject::RunTarget(void){
+ if (NoProject() || winApp.Process.isRunning())
+ return;
+
+ if (Makefile.buildWhat == BUILD_STATLIB
+ || Makefile.buildWhat ==BUILD_DLL)
+ return;
+
+ winApp.Report.Clear();
+ winApp.Report.Append("Run target...", LVOUT_NORMAL);
+
+ // Put the command line and the run flag in the command stack.
+ winApp.Process.AddTask(szDirBuffer, NO_PIPE, STDOUT_NONE);
+ winApp.Process.CmdCat("\\");
+ if (Makefile.tgtDir[0] == '.'){
+ if (Makefile.tgtDir[1] == '.' && Makefile.tgtDir[2] == '\\'
+ && Makefile.tgtDir[3] != '\0'){
+ winApp.Process.CmdCat(&Makefile.tgtDir[3]);
+ }else{
+ // Invalid dir, try ".\target".
+ winApp.Process.CmdCat(".");
+ }
+ }
+ winApp.Process.CmdCat("\\");
+ winApp.Process.CmdCat(Makefile.target);
+
+ winApp.Process.Run();
+}
+
+void CProject::MakeClean(void){
+ if (NoProject() || winApp.Process.isRunning())
+ return;
+
+ // Switch to Makefile Directory
+ Makefile.SwitchCurrentDir();
+
+ winApp.Report.Clear();
+ winApp.Report.Append("Deleting objects...", LVOUT_NORMAL);
+
+ // Put the command line and the output flag in the command stack.
+ winApp.Process.AddTask(
+ Makefile.make,
+ OUTERR_PIPE,
+ LVOUT_ERROR);
+
+ winApp.Process.CmdCat(" -f ");
+ winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]);
+ winApp.Process.CmdCat(" clean");
+
+ winApp.Process.Run();
+}
+
+void CProject::BuildMakefile(void){
+ if (NoProject() || winApp.Process.isRunning())
+ return;
+
+ // Switch to Project Directory
+ Makefile.SwitchCurrentDir();
+
+ winApp.Report.Clear();
+ winApp.Report.Append("Building makefile...", LVOUT_NORMAL);
+
+ // Fill buffers and initialize a new process.
+ Makefile.Build(&winApp.Manager.ProjectView, &winApp.Process);
+ buildMakefile = false;
+ modified = true;
+ // Run the process.
+ winApp.Process.Run();
+}
+
+
+/********************************************************************
+* Class: CMakefile.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CMakefile::CMakefile(){
+ Init();
+}
+
+CMakefile::~CMakefile(){
+}
+
+void CMakefile::Init(void){
+ szFileName[MAX_PATH - 1] = '\0'; // security.
+ szFileName[0] = '\0';
+ nFileOffset = 0;
+ strcpy (mkfDir, ".");
+
+ strcpy (cc, "gcc");
+ strcpy (make, "make");
+ strcpy (wres, "windres");
+ strcpy (test, "gcc -v");
+
+ target[0] = '\0';
+ strcpy (tgtDir, ".");
+ buildWhat = BUILD_EXE;
+ debug = false;
+ lang = LANGC;
+
+ cppFlags[0] = '\0';
+ strcpy (warning, "-W -Wall -pedantic");
+ strcpy (optimize, "-O2");
+ cFlags[0] = '\0';
+ incDirs[0] = '\0';
+
+ strcpy (ldStrip, "-s");
+ ldOpts[0] = '\0';
+ ldLibs[0] = '\0';
+ libDirs[0] = '\0';
+ *arFlags = '\0';
+}
+
+void CMakefile::GetFullPath(char * prjFileName, WORD offset, char * name){
+ // Copy project directory and append makefile relative dir.
+ strncpy(szFileName, prjFileName, offset);
+ WORD len = AppendPath(szFileName, offset, mkfDir);
+ // Increment file offset.
+ if (len){
+ offset += len;
+ }else{
+ strcpy(mkfDir, ".");
+ }
+ // Append makefile name.
+ szFileName[offset-1] = '\\';
+ if (*name){
+ strcpy(&szFileName[offset], name);
+ }else{
+ strcpy(name, "makefile");
+ }
+ nFileOffset = offset;
+}
+
+bool CMakefile::SwitchCurrentDir(void){
+ // Switch to Makefile Directory.
+ if (nFileOffset < 2)
+ return false;
+ szFileName[nFileOffset-1] = '\0';
+ bool result = SetCurrentDirectory(szFileName);
+ szFileName[nFileOffset-1] = '\\';
+return result;
+}
+
+void CMakefile::Build(CProjectView * Tree, CProcess* /*Process*/){
+ SrcList2Buffers(Tree);
+ // Write the first part of the Makefile.
+ Write();
+
+ /* Invokes compiler to get dependencies with something like:
+ "gcc -MM file1.cpp file2.cpp ..." */
+
+ CTask * task = winApp.Process.AddTask(
+ depBuf,
+ OUTERR_PIPE,
+ STDOUT_FILE_APPEND);
+ strcpy(task->szFileName, szFileName);
+}
+
+void CMakefile::SrcList2Buffers(CProjectView * Tree){
+
+ // 1. Begin to fill each buffer.
+ strcpy(depBuf, cc);
+ if (*cppFlags != '\0'){
+ strcat(depBuf, " ");
+ strcat(depBuf, cppFlags);
+ }
+ strcat(depBuf, " -MM ");
+ if (*incDirs != '\0'){
+ strcat(depBuf, incDirs);
+ strcat(depBuf, " ");
+ }
+
+ strcpy(srcBuf, "\nSRCS\t=\\\n");
+ strcpy(objBuf, "\nOBJS\t=\\\n");
+ resBuf [0] = 0;
+
+ // 2. Parse the module list and retrieve sources files names.
+ CFileItem* srcFile;
+
+ if(!Tree->First())
+ return; // The list is empty, nothing to search.
+
+ do { srcFile = (CFileItem *) Tree->GetCurrent();
+
+ if (srcFile->type == C_FILE || srcFile->type == RC_FILE){
+ // Source files and objects buffers.
+ strcat (srcBuf, "\t");
+ strcat (srcBuf, &srcFile->szFileName[srcFile->nFileOffset]);
+ strcat (srcBuf, "\\\n");
+
+ // Change file extension.
+ char ext[] = "o";
+ strcpy(objFile, &srcFile->szFileName[srcFile->nFileOffset]);
+ ChangeFileExt(objFile, ext);
+ strcat (objBuf, "\t");
+ strcat (objBuf, objFile);
+ strcat (objBuf, "\\\n");
+
+ if (srcFile->type == C_FILE){
+ // Dependencies buffer.
+ strcat(depBuf, &srcFile->szFileName[srcFile->nFileOffset]);
+ strcat(depBuf, " ");
+ }else if (srcFile->type == RC_FILE){
+ // Resource buffer.
+ strcat (resBuf, objFile);
+ strcat (resBuf, ": ");
+ strcat (resBuf, &srcFile->szFileName[srcFile->nFileOffset]);
+ strcat (resBuf, "\n\n");
+ }
+ }
+ } while (Tree->Next());
+
+ int len = strlen(srcBuf);
+ srcBuf[len-2] = '\n';
+ srcBuf[len-1] = 0;
+
+ len = strlen(objBuf);
+ objBuf[len-2] = '\n';
+ objBuf[len-1] = 0;
+}
+
+void CMakefile::Write(void){
+ FILE * file;
+
+ file = fopen(szFileName, "w");
+ if (!file){
+ MsgBox.DisplayString("Can't open file :\r\n%s", szFileName);
+ return;
+ }
+
+ /* Signature */
+ fprintf (file, "# Generated automatically by Visual-MinGW.\n");
+ fprintf (file, "# http://visual-mingw.sourceforge.net/\n");
+
+ /* Standard defines */
+ fprintf (file, "\nCC = %s", cc);
+ fprintf (file, "\nWRES = %s", wres );
+ fprintf (file, "\nDLLWRAP = dllwrap" );
+ fprintf (file, "\nCPPFLAGS = %s", cppFlags );
+
+ if (buildWhat == BUILD_GUIEXE)
+ fprintf (file, "\nLDBASEFLAGS = -mwindows %s %s", ldOpts, ldLibs );
+ else
+ fprintf (file, "\nLDBASEFLAGS = %s %s", ldOpts, ldLibs );
+ fprintf (file, "\nINCDIRS = %s", incDirs );
+ fprintf (file, "\nOPTIMIZ = %s", optimize );
+ fprintf (file, "\nSTRIP = %s", ldStrip );
+ /* Debug symbols ? Language ? */
+ fprintf (file, "\n\nifeq ($(MAKECMDGOALS),debug)");
+ if (lang == LANGCPP){
+ fprintf (file, "\nCXXFLAGS = %s $(INCDIRS) -g %s", warning, cFlags);
+ fprintf (file, "\nLDFLAGS = $(LDBASEFLAGS)");
+ fprintf (file, "\nelse");
+ fprintf (file, "\nCXXFLAGS = %s $(INCDIRS) $(OPTIMIZ) %s", warning, cFlags);
+ fprintf (file, "\nLDFLAGS = $(STRIP) $(LDBASEFLAGS)");
+ fprintf (file, "\nendif");
+ }else{
+ fprintf (file, "\nCFLAGS = %s $(INCDIRS) -g %s", warning, cFlags);
+ fprintf (file, "\nLDFLAGS = $(LDBASEFLAGS)");
+ fprintf (file, "\nelse");
+ fprintf (file, "\nCFLAGS = %s $(INCDIRS) $(OPTIMIZ) %s", warning, cFlags);
+ fprintf (file, "\nLDFLAGS = $(STRIP) $(LDBASEFLAGS)");
+ fprintf (file, "\nendif");
+ }
+ /* Directories */
+ fprintf (file, "\n\nSRCDIR = %s", mkfDir );
+ fprintf (file, "\nBINDIR = %s", tgtDir );
+ fprintf (file, "\nLIBDIRS = %s", libDirs );
+ /* Rule to compile rc files */
+ fprintf (file, "\n\n%c.o : %c.rc\n\t$(WRES) $(CPPFLAGS) $< $@", '%', '%' );
+ /* List of objects */
+ fprintf (file, "\n%s", objBuf );
+ /* Target */
+ fprintf (file, "\nTARGET =\t$(BINDIR)\\%s" , target );
+ /* all, alldebug */
+ fprintf (file, "\n\n# Targets\n" );
+ fprintf (file, "all:\t$(TARGET)\n\ndebug:\t$(TARGET)\n\n" );
+ /* clean */
+ fprintf (file, "cleanobjs:\n\trm -f $(OBJS)\n\n" );
+ fprintf (file, "cleanbin:\n\trm -f $(TARGET)\n\n" );
+ fprintf (file, "clean:\tcleanobjs cleanbin\n\n" );
+ /* Dependencies */
+ fprintf (file, "# Dependency rules\n" );
+ /* Language */
+ if (buildWhat == BUILD_STATLIB){
+ fprintf (file, "$(TARGET): $(OBJS)\n\t$(AR) -ru $(BINDIR)\\%s", target);
+ fprintf (file, " $(OBJS) $(INCDIRS) $(LIBDIRS)\n\n%s", resBuf);
+ }else if (buildWhat == BUILD_DLL){
+ fprintf (file, "$(TARGET): $(OBJS)\n\t$(DLLWRAP) -o $@ $(OBJS) $(LDFLAGS)\n\n" );
+ }else if (lang == LANGCPP){
+ fprintf (file, "$(TARGET): $(OBJS)\n\t$(CXX) -o $(BINDIR)\\%s", target);
+ fprintf (file, " $(OBJS) $(INCDIRS) $(LIBDIRS) $(LDFLAGS)\n\n%s",resBuf);
+ }else{
+ fprintf (file, "$(TARGET): $(OBJS)\n\t$(CC) -o $(BINDIR)\\%s", target);
+ fprintf (file, " $(OBJS) $(INCDIRS) $(LIBDIRS) $(LDFLAGS)\n\n%s",resBuf);
+ }
+ fclose(file);
+}
+
+
+/********************************************************************
+* Class: CCompiler.
+*
+* Purpose:
+*
+* Revisions:
+*
+********************************************************************/
+CCompiler::CCompiler(){
+ make[0] = '\0';
+ cc[0] = '\0';
+ cFlags[0] = '\0';
+ ldFlags[0] = '\0';
+ wres[0] = '\0';
+ debug[0] = '\0';
+ test[0] = '\0';
+}
+
+CCompiler::~CCompiler(){
+}
+
+bool CCompiler::LoadData(char * fullpath){
+ Load(fullpath);
+ // [Common] section
+ GetString(make, "MAKE", "Common");
+ GetString(cc, "CC" );
+ GetString(cFlags, "CFLAGS" );
+ GetString(ldFlags, "LDFLAGS" );
+ GetString(wres, "WRES" );
+ GetString(debug, "DEBUG" );
+ GetString(test, "TEST" );
+return true;
+}
+
--- /dev/null
+/********************************************************************
+* Module: project.h. This is part of Visual-MinGW.
+*
+* License: Visual-MinGW is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+********************************************************************/
+#ifndef PROJECT_H
+#define PROJECT_H
+
+#include "winui.h"
+#include "main.h"
+#include "process.h"
+
+#define BUILD_STATLIB 0
+#define BUILD_DLL 1
+#define BUILD_EXE 2
+#define BUILD_GUIEXE 3
+#define LANGC 0
+#define LANGCPP 1
+
+class CProject;
+class CMakefile;
+
+bool CheckFile(CFileItem * file);
+
+class CGeneralDlg : public CDlgBase
+{
+ public:
+ CGeneralDlg();
+ virtual ~CGeneralDlg();
+
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+
+ protected:
+
+ private:
+ CProject *pProject;
+ CMakefile *pMakefile;
+ HWND hStatLib;
+ HWND hDll;
+ HWND hConsole;
+ HWND hGuiExe;
+ HWND hDbgSym;
+ HWND hLangC;
+ HWND hLangCpp;
+ HWND hMkfName;
+ HWND hMkfDir;
+ HWND hUserMkf;
+ HWND hTgtName;
+ HWND hTgtDir;
+};
+
+class CCompilerDlg : public CDlgBase
+{
+ public:
+ CCompilerDlg();
+ virtual ~CCompilerDlg();
+
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+
+ protected:
+
+ private:
+ CProject *pProject;
+ CMakefile *pMakefile;
+ HWND hCppFlags;
+ HWND hWarning;
+ HWND hOptimiz;
+ HWND hCFlags;
+ HWND hIncDirs;
+};
+
+class CZipDlg : public CDlgBase
+{
+ public:
+ CZipDlg();
+ virtual ~CZipDlg();
+
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+
+ protected:
+
+ private:
+ CProject *pProject;
+ CMakefile *pMakefile;
+ HWND hZipDir;
+ HWND hZipFlags;
+};
+
+class CLinkerDlg : public CDlgBase
+{
+ public:
+ CLinkerDlg();
+ virtual ~CLinkerDlg();
+
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+
+ protected:
+
+ private:
+ CProject *pProject;
+ CMakefile *pMakefile;
+ HWND hLdStrip;
+ HWND hLdOpts;
+ HWND hLdLibs;
+ HWND hLibsDirs;
+};
+
+class COptionsDlg : public CTabbedDlg
+{
+ public:
+ COptionsDlg();
+ virtual ~COptionsDlg();
+
+ BOOL EndDlg(int nResult);
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+ BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
+ BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
+
+ protected:
+
+ private:
+ CProject *pProject;
+ CMakefile *pMakefile;
+ CGeneralDlg GeneralDlg;
+ CCompilerDlg CompilerDlg;
+ CLinkerDlg LinkerDlg;
+ CZipDlg ZipDlg;
+};
+
+class CNewModuleDlg : public CDlgBase
+{
+ public:
+ CNewModuleDlg();
+ virtual ~CNewModuleDlg();
+
+ virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
+
+ protected:
+
+ private:
+ CProject *pProject;
+};
+
+class CCompiler : public CIniFile
+{
+ public:
+ CCompiler();
+ ~CCompiler();
+
+ bool LoadData(char * fullpath);
+
+ char make[64];
+
+ char cc[16];
+ char cFlags[64];
+ char ldFlags[64];
+ char wres[16];
+
+ char debug[16];
+ char test[16];
+
+ protected:
+
+ private:
+};
+
+class CMakefile
+{
+ public:
+ CMakefile();
+ ~CMakefile();
+
+ void Init(void);
+ bool SwitchCurrentDir(void);
+ void GetFullPath(char * prjFileName, WORD offset, char * name);
+ void Build(CProjectView * Tree, CProcess* Process);
+ void SrcList2Buffers(CProjectView * Tree);
+ void Write(void);
+
+ // File.
+ char szFileName[MAX_PATH];
+ WORD nFileOffset;
+ char mkfDir[MAX_PATH];
+
+ // Compiler dependent.
+ char cc[4];
+ char make[64];
+ char wres[16];
+ char test[16];
+
+ char target[64];
+ char tgtDir[MAX_PATH];
+ UINT buildWhat;
+ bool debug;
+ UINT lang;
+
+ // Compiler data.
+ char cppFlags[256];
+ char warning[64];
+ char optimize[64];
+ char cFlags[64];
+ char incDirs[256];
+
+ // Linker data.
+ char ldStrip[32];
+ char ldOpts[64];
+ char ldLibs[64];
+ char libDirs[256];
+
+ // Archiver.
+ char arFlags[64];
+
+ protected:
+
+ private:
+ // Buffers.
+ char objFile[64];
+ char srcBuf [1024];
+ char objBuf [1024];
+ char resBuf [1024];
+ char depBuf [256];
+};
+
+class CProject //: public CIniFile
+{
+ public:
+ CProject();
+ ~CProject();
+
+ bool NoProject(void);
+ int CloseDecision(void);
+ bool New(char * fileName, WORD fileOffset);
+ bool Open(char * fileName, WORD fileOffset);
+
+ bool RelativeToAbsolute(char * relativePath);
+ bool AddFiles(void);
+
+ bool OptionsDlg(void);
+ bool NewModuleDlg(void);
+ bool NewModule(char * srcFile, bool createHeader);
+
+ void ZipSrcs(void);
+ void Explore(HWND hwnd);
+
+ void Build(void);
+ void RebuildAll(void);
+ void RunTarget(void);
+ void MakeClean(void);
+ void BuildMakefile(void);
+
+ bool SwitchCurrentDir(void);
+
+ CMakefile Makefile;
+
+ /* May be private members */
+ int numFiles;
+ bool loaded;
+ bool modified;
+ bool buildMakefile;
+ int SavePrjFile(int decision);
+
+ char szFileName[MAX_PATH];
+ WORD nFileOffset;
+ WORD nFileExtension;
+ char szDirBuffer[MAX_PATH];
+
+ char zipDir[MAX_PATH];
+ char zipFlags[256];
+
+ char compilerName[64];
+
+ protected:
+
+ private:
+ void Reset();
+
+CIniFile PrjFile;
+ COptionsDlg _OptionsDlg;
+ CNewModuleDlg _NewModuleDlg;
+
+ int prjVer;
+};
+
+#endif
--- /dev/null
+/********************************************************************
+* Module: resource.h. This is part of Visual-MinGW.
+*
+* License: Visual-MinGW is covered by GNU General Public License,
+* Copyright (C) 2001 Manu B.
+* See license.htm for more details.
+*
+********************************************************************/
+#define APP_VERSION "0.43a"
+#define FULL_APP_VERSION "0.43 alpha"
+
+// Static control ----------------------------
+#define IDC_STATIC -1
+
+// Bitmaps ----------------------------------
+#define IDB_TOOLBAR 10
+#define IDB_TREEVIEW 11
+
+#define IDAPPLY 20
+
+// Preferences Dialog -----------------------
+#define IDD_PREFERENCES 100
+#define IDC_PREF_TABS 101
+
+#define IDD_ENVIRON 110
+#define IDC_SET_CCBIN 111
+#define IDC_CCBIN 112
+#define IDC_BROWSE_CC 113
+#define IDC_SET_CMDBIN 114
+#define IDC_CMDBIN 115
+#define IDC_BROWSE_CMD 116
+#define IDC_AUTOEXEC 117
+#define IDC_ENV_VIEW 118
+/*#define IDC_CC_INCDIR 101
+#define IDC_BROWSE 102*/
+
+// Find Dialog -------------------------------
+#define IDD_FIND 120
+#define IDC_FINDWHAT 121
+#define IDC_WHOLEWORD 122
+#define IDC_MATCHCASE 123
+#define IDC_REGEXP 124
+#define IDC_WRAP 125
+#define IDC_UNSLASH 126
+#define IDC_DIRECTIONUP 127
+#define IDC_DIRECTIONDOWN 128
+
+// Replace ----------------------------------
+#define IDD_REPLACE 130
+#define IDC_REPLACEWITH 131
+#define IDC_REPLACE 132
+#define IDC_REPLACEALL 133
+#define IDC_REPLACEINSEL 134
+
+// Find in files -------------------------------
+#define IDD_GREP 135
+#define IDC_GFILTER 136
+#define IDC_GDIR 137
+#define IDC_GBROWSE 139
+
+// New module ------------------------------
+#define IDD_NEW_MODULE 140
+#define IDC_HEADER 141
+
+// Options ----------------------------------
+#define IDD_OPTION 150
+#define IDC_OPTION_TABS 151
+#define IDC_HELP_BTN 152
+
+// General tab ---------------------------------
+#define IDD_GENERAL_PANE 160
+#define IDC_STATLIB 161
+#define IDC_DLL 162
+#define IDC_CONSOLE 163
+#define IDC_GUIEXE 164
+#define IDC_DBGSYM 165
+#define IDC_LANGC 166
+#define IDC_LANGCPP 167
+#define IDC_MKF_NAME 168
+#define IDC_MKF_DIR 169
+#define IDC_USER_MKF 170
+#define IDC_TGT_NAME 171
+#define IDC_TGT_DIR 172
+
+// Compiler tab -----------------------------
+#define IDD_COMPILER 180
+#define IDC_CPPFLAGS 181
+#define IDC_WARNING 182
+#define IDC_OPTIMIZ 183
+#define IDC_CFLAGS 184
+#define IDC_INCDIRS 185
+
+// Linker tab --------------------------------
+#define IDD_LINKER 190
+#define IDC_LDSTRIP 191
+#define IDC_LDOPTS 192
+#define IDC_LDLIBS 193
+#define IDC_LIBDIRS 194
+
+#define IDD_ZIP 200
+#define IDC_INFOZIP 201
+#define IDC_TAR_GZIP 202
+#define IDC_TAR_BZ2 203
+#define IDC_ZIP_TEST 204
+#define IDC_ZIP_DIR 205
+#define IDC_ZIPFLAGS 206
+// About ------------------------------------
+#define IDD_ABOUT 210
+
+#define IDD_COMMAND 220
+#define IDC_CMDLINE 221
+// Menu -------------------------------------
+#define ID_MENU 1000
+#define IDM_NEW 1001
+#define IDM_OPEN 1002
+//#define IDM_CLOSE 1003
+#define IDM_NEW_PROJECT 1004
+#define IDM_OPEN_PROJECT 1005
+#define IDM_SAVE_PROJECT 1006
+#define IDM_CLOSE_PROJECT 1007
+#define IDM_SAVE 1008