Index: trunk/classes/REPLACE.CMD
===================================================================
--- trunk/classes/REPLACE.CMD	(revision 3)
+++ trunk/classes/REPLACE.CMD	(revision 4)
@@ -4,4 +4,9 @@
 'replace H:\cwmm\classes\Res\dll\mmres_DE.dll d:\MMOS2\MMCLASS\bin\mmres_DE.dll'
 'replace H:\cwmm\classes\Res\dll\mmres_EN.dll d:\MMOS2\MMCLASS\bin\mmres_EN.dll'
+'replace H:\cwmm\mediafolder\mediafolder.dll d:\MMOS2\MEDIAFLD\BIN\MEDIAFLD.DLL'
+'replace H:\cwmm\mediafolder\res\obj\mediafolder_de.dll d:\MMOS2\MEDIAFLD\BIN\MFLDR_DE.DLL'
+'del d:\MMOS2\MEDIAFLD\BIN\mediafld.hlp'
+'copy H:\cwmm\mediafolder\help\mediafldr049.hlp d:\MMOS2\MEDIAFLD\BIN\mediafld.hlp'
+
 
 'replace H:\cwmm\classes\cwmm.dll J:\MMOS2\CWMM\CWMM.DLL'
Index: trunk/classes/bin/audioext.rx
===================================================================
--- trunk/classes/bin/audioext.rx	(revision 3)
+++ trunk/classes/bin/audioext.rx	(revision 4)
@@ -1,5 +1,5 @@
 /* rexx - Get the extension of audio types added using
    the multimedia setup object. For example *.FLA.
-   This script is called by M_MMAudio.
+   This script is called by M_MMAudio and mmfind.exe.
 */
 
@@ -8,4 +8,5 @@
 
 allExt=""
+waveaudio=""
 
 /* Get MMOS2 directory */
@@ -60,4 +61,5 @@
 	WHEN TRANSLATE(curExt)="FLA" THEN NOP
 	WHEN TRANSLATE(curExt)="FLAC" THEN NOP
+	WHEN TRANSLATE(curExt)="WAV" THEN NOP
 
 	OTHERWISE
@@ -81,4 +83,5 @@
 	END
 	a=a+1
+	IF a>mmini.0 THEN return
 END
 return
@@ -99,7 +102,7 @@
 			END
 			a=a+1
+			IF a>mmini.0 THEN return ""
 		END
 	END
 END
 return ""
-
Index: trunk/classes/bin/chktimid.rx
===================================================================
--- trunk/classes/bin/chktimid.rx	(revision 3)
+++ trunk/classes/bin/chktimid.rx	(revision 4)
@@ -61,4 +61,5 @@
 	END
 	a=a+1
+	IF a>mmini.0 THEN return 0
 END
 return 0
Index: trunk/classes/bin/imageadd.rx
===================================================================
--- trunk/classes/bin/imageadd.rx	(revision 3)
+++ trunk/classes/bin/imageadd.rx	(revision 4)
@@ -1,5 +1,5 @@
 /* rexx - Return additional image extensions the MMImage class
-   should handle.   
-   This script is called by M_MMImage.
+   should handle.
+   This script is called by M_MMImage and mmfind.exe.
 */
 
@@ -9,3 +9,2 @@
 EXIT
 
-
Index: trunk/classes/bin/imageext.rx
===================================================================
--- trunk/classes/bin/imageext.rx	(revision 3)
+++ trunk/classes/bin/imageext.rx	(revision 4)
@@ -1,4 +1,4 @@
 /* rexx - Return all image extensions we have a MM class for.   
-   This script is called by M_MMImage. After getting the extensions
+   This script is called by M_MMImage and mmfind.exe. After getting the extensions
    M_MMImage checks if there're any additional extensions handled by
    installed image IO procedures. If yes, these unhandled extensions
@@ -8,7 +8,6 @@
 
 
-allExt="_IM DIB GIF JPG VID PCX PCD TIF TGA BMP"
+allExt="*._IM,*.DIB,*.GIF,*.JPG,*.VID,*.PCX,*.PCD,*.TIF,*.TGA,*.BMP"
 return allExt
 EXIT
 
-
Index: trunk/classes/bin/mpegext.rx
===================================================================
--- trunk/classes/bin/mpegext.rx	(revision 4)
+++ trunk/classes/bin/mpegext.rx	(revision 4)
@@ -0,0 +1,112 @@
+/* rexx - Get the extension of MPEG types added using
+   the multimedia setup object. For example *.DAT.
+   This script is called by M_MMPG.
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+allExt=""
+waveaudio=""
+
+/* Get MMOS2 directory */
+mmos2Dir=STRIP(TRANSLATE(value("MMBASE",,"OS2ENVIRONMENT")," ",";"))
+if LEFT(mmos2Dir,1)='\' THEN
+	mmpm2Ini=mmos2Dir||'mmpm2.ini'
+else
+	mmpm2Ini=mmos2Dir||'\mmpm2.ini'
+
+if STREAM(mmpm2ini, "C", "Query exists")='' THEN DO
+	/* MMPM2.INI not found */
+	rc=""
+	exit ""
+END
+
+/* Read ini */
+a=0
+DO WHILE LINES(mmpm2ini)
+	a=a+1
+	mmini.a=STRIP(LINEIN(mmpm2ini))
+END
+mmini.0=a
+ret=STREAM(mmpm2ini, "C", "close")
+
+/* Find [DRIVERS] section */
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), "[DRIVERS]")=1 THEN DO
+		call parseDrivers
+		LEAVE
+	END
+END
+
+if waveaudio="" THEN DO
+	rc=""
+	exit ""
+END
+/*Now we have the wave device(s) */
+
+/* Get extensions from all devices */
+tempext=""
+DO b=1 to WORDS(waveaudio)
+	/* We may have several video devices */
+	/* We only want OpenMPEG by IBM */
+	IF POS("IBMMPEG", TRANSLATE(WORD(waveaudio, b))) >< 0  THEN
+		tempExt=tempExt||' '||parseWaveDevice(WORD(waveaudio, b))
+END
+
+/* Build string and remove known extensions */
+DO b=1 to WORDS(tempExt)
+	curExt=WORD(tempExt,b)
+	SELECT
+	WHEN TRANSLATE(curExt)="AVI" THEN NOP /* Already supported by a spezialized class */
+	WHEN TRANSLATE(curExt)="FLI" THEN NOP
+	WHEN TRANSLATE(curExt)="MOV" THEN NOP
+	WHEN TRANSLATE(curExt)="MPG" THEN NOP
+	WHEN TRANSLATE(curExt)="VBS" THEN NOP /* This one is also handled by MMMPG */
+
+
+	OTHERWISE
+		if allExt\='' THEN allExt=allExt||','
+		allExt=allExt||'*.'||STRIP(curExt)
+	END
+END
+
+return allExt
+EXIT
+
+/**************************************/
+
+parseDrivers:
+a=a+1
+DO WHILE LEFT(mmini.a,1)\='['
+	IF ABBREV(TRANSLATE(mmini.a),"DIGITALVIDEO")=1 THEN DO
+		thePos=POS("=",mmini.a)
+		if thePos=0 then return
+		waveaudio=TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",",") /* There may be several entries */
+		return
+	END
+	a=a+1
+	IF a>mmini.0 THEN return
+END
+return
+
+parseWavedevice:
+
+theDevice='['ARG(1)']'
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), TRANSLATE(theDevice))=1 THEN DO
+		/* Device section found */
+		a=a+1
+		DO WHILE LEFT(mmini.a,1)\='['
+			IF ABBREV(TRANSLATE(mmini.a),"EXTNAMES")=1 THEN DO
+				thePos=POS("=",mmini.a)
+				if thePos=0 then return
+				ext=SUBWORD(TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",","),2)
+				return ext
+			END
+			a=a+1
+			IF a>mmini.0 THEN return ""
+		END
+	END
+END
+return ""
Index: trunk/classes/bin/videoext.rx
===================================================================
--- trunk/classes/bin/videoext.rx	(revision 4)
+++ trunk/classes/bin/videoext.rx	(revision 4)
@@ -0,0 +1,110 @@
+/* rexx - Get the extension of video types added using
+   the multimedia setup object. For example *.QT.
+   This script is called by M_MMVideo.
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+allExt=""
+waveaudio=""
+
+/* Get MMOS2 directory */
+mmos2Dir=STRIP(TRANSLATE(value("MMBASE",,"OS2ENVIRONMENT")," ",";"))
+if LEFT(mmos2Dir,1)='\' THEN
+	mmpm2Ini=mmos2Dir||'mmpm2.ini'
+else
+	mmpm2Ini=mmos2Dir||'\mmpm2.ini'
+
+if STREAM(mmpm2ini, "C", "Query exists")='' THEN DO
+	/* MMPM2.INI not found */
+	rc=""
+	exit ""
+END
+
+/* Read ini */
+a=0
+DO WHILE LINES(mmpm2ini)
+	a=a+1
+	mmini.a=STRIP(LINEIN(mmpm2ini))
+END
+mmini.0=a
+ret=STREAM(mmpm2ini, "C", "close")
+
+/* Find [DRIVERS] section */
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), "[DRIVERS]")=1 THEN DO
+		call parseDrivers
+		LEAVE
+	END
+END
+
+if waveaudio="" THEN DO
+	rc=""
+	exit ""
+END
+/*Now we have the wave device(s) */
+
+/* Get extensions from all devices */
+tempext=""
+DO b=1 to WORDS(waveaudio)
+	/* We may have several video devices */
+	/* OpenMPEG by IBM is handled by it's own script called by M_MMPG */
+	IF POS("IBMMPEG", TRANSLATE(WORD(waveaudio, b))) = 0  THEN
+		tempExt=tempExt||' '||parseWaveDevice(WORD(waveaudio, b))
+END
+
+/* Build string and remove known extensions */
+DO b=1 to WORDS(tempExt)
+	curExt=WORD(tempExt,b)
+	SELECT
+	WHEN TRANSLATE(curExt)="AVI" THEN NOP /* Already supported by a spezialized class */
+	WHEN TRANSLATE(curExt)="FLI" THEN NOP
+	WHEN TRANSLATE(curExt)="MOV" THEN NOP
+	WHEN TRANSLATE(curExt)="MPG" THEN NOP
+
+	OTHERWISE
+		if allExt\='' THEN allExt=allExt||','
+		allExt=allExt||'*.'||STRIP(curExt)
+	END
+END
+return allExt
+EXIT
+
+/**************************************/
+
+parseDrivers:
+a=a+1
+DO WHILE LEFT(mmini.a,1)\='['
+	IF ABBREV(TRANSLATE(mmini.a),"DIGITALVIDEO")=1 THEN DO
+		thePos=POS("=",mmini.a)
+		if thePos=0 then return
+		waveaudio=TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",",") /* There may be several entries */
+		return
+	END
+	a=a+1
+	IF a>mmini.0 THEN return
+END
+return
+
+parseWavedevice:
+
+theDevice='['ARG(1)']'
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), TRANSLATE(theDevice))=1 THEN DO
+		/* Device section found */
+		a=a+1
+		DO WHILE LEFT(mmini.a,1)\='['
+			IF ABBREV(TRANSLATE(mmini.a),"EXTNAMES")=1 THEN DO
+				thePos=POS("=",mmini.a)
+				if thePos=0 then return
+				ext=SUBWORD(TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",","),2)
+				return ext
+			END
+			a=a+1
+			IF a>mmini.0 THEN return ""
+		END
+	END
+END
+return ""
+
Index: trunk/classes/c/c_audio/cwaudio.c
===================================================================
--- trunk/classes/c/c_audio/cwaudio.c	(revision 3)
+++ trunk/classes/c/c_audio/cwaudio.c	(revision 4)
@@ -70,5 +70,5 @@
 char chrHelpLibrary[CCHMAXPATH]={0};
 char chrInstallDir[CCHMAXPATH]={0};
-char chrMMAudioExt[200]={0};/* Array holding the extensions for wpclsQueryInstanceFilter() */
+char chrMMAudioExt[400]={0};/* Array holding the extensions for wpclsQueryInstanceFilter() */
 char resDLLPath[CCHMAXPATH]={0};
 
Index: trunk/classes/c/c_common/helper.c
===================================================================
--- trunk/classes/c/c_common/helper.c	(revision 3)
+++ trunk/classes/c/c_common/helper.c	(revision 4)
@@ -1,4 +1,4 @@
 /*
- * This file is (C) Chris Wohlgemuth 2001/2004
+ * This file is (C) Chris Wohlgemuth 2001-2005
  */
 /*
@@ -329,10 +329,18 @@
 }
 
+/* MMCLS_INI_FILE_NAME = "\\cwmm.ini" See ...\common.h */
 PSZ _queryMMClassIniFile(void)
 {
   static char iniName[CCHMAXPATH]= {0};
 
-  if(iniName[0]==0)
-    sprintf(iniName, "%s\\bin\\CWMM.INI", queryInstallDir());
+  if(iniName[0]==0) {
+    /* Default is INI file in users home dir */
+    if(SysQueryHomeDir(iniName, sizeof(iniName))) {
+      strlcat(iniName, MMCLS_INI_FILE_NAME, sizeof(iniName)); /* MMCLS_INI_FILE_NAME = "\\CWMM.INI" */
+      return iniName;
+    }
+
+    sprintf(iniName, "%s\\bin%s", queryInstallDir(), MMCLS_INI_FILE_NAME);
+  }
 
   return iniName;
Index: trunk/classes/c/c_image/cwimage.c
===================================================================
--- trunk/classes/c/c_image/cwimage.c	(revision 3)
+++ trunk/classes/c/c_image/cwimage.c	(revision 4)
@@ -1974,10 +1974,13 @@
           /* This extension is yet unknown */
           if(chrMMImageExt[0]==0) {
+            /* It's the first one */
             sprintf(chrMMImageExt,"*.%s", pmmFormatInfoArray->szDefaultFormatExt);
-            //   fFirstExt=FALSE;
           }
           else {
-            strncat(chrMMImageExt,",*.",sizeof(chrMMImageExt)-1-strlen(chrMMImageExt));
-            strncat(chrMMImageExt, pmmFormatInfoArray->szDefaultFormatExt, sizeof(chrMMImageExt)-1-strlen(chrMMImageExt));
+            /* Check if the extension is not already added (e.g. TIF has a lot of subformats) */
+            if(!strstr(chrMMImageExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+              strncat(chrMMImageExt,",*.",sizeof(chrMMImageExt)-1-strlen(chrMMImageExt));
+              strncat(chrMMImageExt, pmmFormatInfoArray->szDefaultFormatExt, sizeof(chrMMImageExt)-1-strlen(chrMMImageExt));
+            }
           }
           //          HlpWriteToTrapLog("Known Extension: %s\n", chrMMImageKnownExt);
Index: trunk/classes/c/c_video/cwmpg.c
===================================================================
--- trunk/classes/c/c_video/cwmpg.c	(revision 3)
+++ trunk/classes/c/c_video/cwmpg.c	(revision 4)
@@ -1,4 +1,4 @@
 /*
- * (C) Chris Wohlgemuth 2002-2004
+ * (C) Chris Wohlgemuth 2002-2005
  *
  */
@@ -41,6 +41,9 @@
 #include "helpid.h"
 #include "cwmpg.ih"
+#include "cwaudioinc.h" /* For REXX script name */
+#include "sys_funcs.h"
 
 extern char chrHelpLibrary[CCHMAXPATH];
+char chrMMMPGExt[400]={0};/* Array holding the extensions for wpclsQueryInstanceFilter() */
 
 HMODULE queryResModuleHandle(void);
@@ -48,5 +51,5 @@
 BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
 ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  CWMMDataFile *thisPtr, ULONG ulView);
-
+BOOL getStringFromRexxScript(PSZ rexxFile, char* chrResult, ULONG ulSize);
 
 /*
@@ -155,5 +158,6 @@
     M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsQueryInstanceFilter");
 
-    return "*.MPG,*.VBS";
+    /* This list is build in wpclsInitData() */
+    return chrMMMPGExt;
 }
 
@@ -189,4 +193,45 @@
 
 
+SOM_Scope void  SOMLINK cwmpgM_wpclsInitData(M_MMMPG *somSelf)
+{
+  static BOOL bGotMPEGExt=FALSE;
+
+    /* M_MMMPGData *somThis = M_MMMPGGetData(somSelf); */
+    M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsInitData");
+
+    /* 
+       Taken from the audio classes. I suspect the same is true for the video classes.
+       Anyway it wont hurt having this here.
+
+       Get extensions of additional audio procs. These extensions may be specified by
+       newly installed IO procs in MMPM2.INI or by using the Multimedia setup. For
+       example the MMIOMP3 procedure for reading MP3 files adds the MP3 extension this
+       way to the system. Extensions already handled by a specialized class will be
+       filtered in the called REXX script e.g. MP3 so only unknown extensions end up here.
+
+       Strangely enough wpclsQueryInstanceFilter() is called during wpclsInitData() so
+       we query the extensions here before calling the parent.
+
+       FIXME:
+       The check is only done once during initialization. This is a little annoyance for
+       the user because new extension specified in the settings will only be picked up
+       on next WPS start. 
+       */
+     if(!bGotMPEGExt)
+      {
+        /* REXX script: "mpegext.rx" */
+        getStringFromRexxScript(MMMPG_GETEXT_RX, chrMMMPGExt, sizeof(chrMMMPGExt));
+        /* Add our default extension *.MPG */
+        if(chrMMMPGExt[0]==0)
+          /* It's the first one */
+          strcpy(chrMMMPGExt,"*.MPG,*.VBS");
+        else 
+          strlcat(chrMMMPGExt, ",*.MPG,*.VBS", sizeof(chrMMMPGExt));
+        bGotMPEGExt=TRUE; 
+      }
+
+    M_MMMPG_parent_M_MMVideo_wpclsInitData(somSelf);
+}
+
 /*
  * SOM_Scope BOOL  SOMLINK cwmpgM_wpclsQueryDefaultHelp(M_CWMPG *somSelf, 
Index: trunk/classes/c/c_video/cwvideo.c
===================================================================
--- trunk/classes/c/c_video/cwvideo.c	(revision 3)
+++ trunk/classes/c/c_video/cwvideo.c	(revision 4)
@@ -1,4 +1,4 @@
 /*
- * (C) Chris Wohlgemuth 2002-2003
+ * (C) Chris Wohlgemuth 2002-2005
  *
  */
@@ -39,4 +39,5 @@
 #include <os2.h>
 #include "cwvideo.ih"
+#include "cwaudioinc.h" /* For REXX script name */
 //#include "cwmmres.h"
 //#include "mmres.h"
@@ -46,5 +47,7 @@
 BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
 ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  CWMMDataFile *thisPtr, ULONG ulView);
-
+BOOL getStringFromRexxScript(PSZ rexxFile, char* chrResult, ULONG ulSize);
+
+char chrMMVideoExt[400]={0};/* Array holding the extensions for wpclsQueryInstanceFilter() */
 
 /*
@@ -184,4 +187,37 @@
 
 
+SOM_Scope PSZ  SOMLINK cwvideoM_wpclsQueryInstanceType(M_MMVideo *somSelf)
+{
+  /*   static char chrTitle[40]={0}; */
+    /* M_MMVideoData *somThis = M_MMVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsQueryInstanceType");
+
+#if 0
+    /* The type probably shouldn't be translated to make changing files between languages
+       easier.*/
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_CWVIDEOTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"Digital video");
+#endif
+    return TYPE_DIGITALVIDEO;
+    /*  return (M_MMVideo_parent_M_CWMMDataFile_wpclsQueryInstanceType(somSelf)); */
+}
+
+SOM_Scope PSZ  SOMLINK cwvideoM_wpclsQueryInstanceFilter(M_MMVideo *somSelf)
+{
+    /* M_MMVideoData *somThis = M_MMVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsQueryInstanceFilter");
+
+    /* The list of additional extensions is built in wpclsInitData(). 
+
+       FIXME
+       This is a static list read in only once during startup.
+       Should probably be changed later on.
+       */
+    return chrMMVideoExt;
+
+    /* return (M_MMVideo_parent_M_CWMMDataFile_wpclsQueryInstanceFilter(somSelf)); */
+}
+
 /*
  * SOM_Scope PSZ  SOMLINK cwvideoM_wpclsQueryTitle(M_CWVideo *somSelf)
@@ -204,4 +240,39 @@
 }
 
+
+SOM_Scope void  SOMLINK cwvideoM_wpclsInitData(M_MMVideo *somSelf)
+{
+  static BOOL bGotVideoExt=FALSE;
+
+    /* M_MMVideoData *somThis = M_MMVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsInitData");
+
+    /* 
+       Taken from the audio classes. I suspect the same is true for the video classes.
+       Anyway it wont hurt having this here.
+
+       Get extensions of additional audio procs. These extensions may be specified by
+       newly installed IO procs in MMPM2.INI or by using the Multimedia setup. For
+       example the MMIOMP3 procedure for reading MP3 files adds the MP3 extension this
+       way to the system. Extensions already handled by a specialized class will be
+       filtered in the called REXX script e.g. MP3 so only unknown extensions end up here.
+
+       Strangely enough wpclsQueryInstanceFilter() is called during wpclsInitData() so
+       we query the extensions here before calling the parent.
+
+       FIXME:
+       The check is only done once during initialization. This is a little annoyance for
+       the user because new extension specified in the settings will only be picked up
+       on next WPS start. 
+       */
+     if(!bGotVideoExt)
+      {
+        /* REXX script: "videoext.rx" */
+        getStringFromRexxScript(MMVIDEO_GETEXT_RX, chrMMVideoExt, sizeof(chrMMVideoExt));
+        bGotVideoExt=TRUE; 
+      }
+
+    M_MMVideo_parent_M_CWMMDataFile_wpclsInitData(somSelf);
+}
 
 /*
Index: trunk/classes/help/tw/cwmm088.ipf
===================================================================
--- trunk/classes/help/tw/cwmm088.ipf	(revision 4)
+++ trunk/classes/help/tw/cwmm088.ipf	(revision 4)
@@ -0,0 +1,136 @@
+:userdoc.
+
+:docprof.
+
+:title.žÑ»¡
+
+:h1 res=010.MP3 Án­µÀÉ®×
+:p.
+³o¬O€@­Ó MP3 Án­µÀÉ®×¡CŠbŠwžË§¹ MMIOMP3¡]§K¶OªºŠhŽCÅé IO ³B²zŸ¹¡^«áŽN¥i¥HšÏ¥Î MMOS/2 šÓŒœ©ñ¡CMP3 ÀÉ®×¥]§tÀ£ÁY¹Lªº­µ°Tžê®Æ¡A¥B¬OšãŠ³¯}Ãa©ÊªºÀ£ÁYªk¡C
+:p.
+€Užü IO ³B²zŸ¹¡G
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+:h1 res=011.ID3 ŒÐÅÒ
+:p.
+§Q¥Î³o­Ó­¶­±šÓœs¿è ID3 ŒÐÅÒ¡C­Y¶µ¥ØÄæŠì¬OªÅªº¡Aªí¥Ü©|¥ŒŠ³ŒÐÅÒ¡C¥uŠ³«ö€U:hp2.ÀxŠs:ehp2. «ö¶s®É¡A·sžê°T€~·|³QÀxŠs¡C
+
+:p.
+¥i¥H«ü©w¥H€Uªºžê°T¡G
+:ul.
+:li.:hp2.Š±¥ØŠWºÙ¡Gehp2.
+.br
+Š±¥ØŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.ºt¥XªÌ¡Gehp2.
+.br
+ºt¥XªÌŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.±M¿è¡Gehp2.
+.br
+¥]§t³o­ÓŠ±¥Øªº±M¿è¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.µùžÑ¡Gehp2.
+.br
+¥ô·NªºµùžÑ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.Š~¥÷¡Gehp2.
+.br
+±M¿èµoŠæªºŠ~¥÷¡C
+
+:li.:hp2.Ãþ«¬¡Gehp2.
+.br
+¥»Š±¥Øªº­·®æÃþ«¬¡C
+
+:eul.
+
+:h1 res=013.ID3 Tag
+:p.
+³o€@­¶·|Åã¥Ü MP3 ÀÉ®×ªº ID3 ŒÐÅÒ¡CID3 ¬O€@­Ó¥i¥H±Nžê°T¥[šì MP3 €€ªºŒÐ·Ç¡A¹³¬OŠ±¥ØªºŒÐÃD©Î¬OŠ±¥Øºt¥XªÌ¡C
+:p.
+­Y¶µ¥ØÄæŠì¬OªÅªº¡Aªí¥Ü©|¥ŒŠ³ŒÐÅÒ¡C
+
+:p.
+:ul.
+:li.:hp2.Š±¥ØŠWºÙ¡Gehp2.
+.br
+Š±¥ØŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.ºt¥XªÌ¡Gehp2.
+.br
+ºt¥XªÌŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.±M¿è¡Gehp2.
+.br
+¥]§t³o­ÓŠ±¥Øªº±M¿è¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.µùžÑ¡Gehp2.
+.br
+¥ô·NªºµùžÑ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.Š~¥÷¡Gehp2.
+.br
+±M¿èµoŠæªºŠ~¥÷¡C
+
+:li.:hp2.Ãþ«¬¡Gehp2.
+.br
+¥»Š±¥Øªº­·®æÃþ«¬¡C
+
+:eul.
+
+:h1 res=012.Š±¥ØŠWºÙ
+:p.
+§Q¥Î³o€@­¶šÓœs¿èŠ±¥Øªºžê°T¡CÄæŠì€€ªº€º®e·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C³ošÇ·sªºžê°T¥uŠ³Šb«ö€U:hp2.ÀxŠs¡Gehp2.«ö¶s®É€~·|³QÀxŠs¡C
+:nt.
+©µŠùÄÝ©Ê¥u³Q OS/2 €äŽ©¡A¥BµLªk³QÀxŠsŠb¥úºÐ€€¡C­Y§A±NÀÉ®×œÆ»sšì¥úºÐ©Î¥t€@­Ó§@·~št²Î¡A³ošÇžê°T·|¿ò¥¢¡C
+:ent.
+:p.
+¥i¥H«ü©w¥H€Uªºžê°T¡AšC­ÓÄæŠìªºªø«×­­šî¬° 256 ­ÓŠr€ž¡C
+:ul.
+:li.:hp2.Š±¥ØŠWºÙ&colon.:ehp2.
+:p.Š±¥ØŠWºÙ¡C
+
+:li.:hp2.ºt¥XªÌ&colon.:ehp2.
+:p.ºt¥XªÌŠWºÙ¡C
+
+:li.:hp2.±M¿è&colon.:ehp2.
+:p.¥]§tŠ¹Š±¥Øªº±M¿è¡C
+
+:li.:hp2.µùžÑ&colon.:ehp2.
+:p.¥ô·NªºµùžÑ¡C
+
+:li.:hp2.Š~¥÷&colon.:ehp2.
+:p.±M¿èµoŠæªºŠ~¥÷¡C
+
+:li.:hp2.Ãþ«¬&colon.:ehp2.
+:p.¥»Š±¥Øªº­·®æÃþ«¬¡C
+
+:eul.
+
+:h1 res=020.Ogg ­µ°TÀÉ®×ªºžÑ»¡
+:p.
+³o¬O€@­Ó Ogg ­µ°TÀÉ®×¡CŠbŠwžË§¹ MMIOVORB¡]§K¶OªºŠhŽCÅé IO ³B²zŸ¹¡^«áŽN¥i¥HšÏ¥Î MMOS/2 šÓŒœ©ñ¡COgg ÀÉ®×¥]§tÃþŠü©ó MP3 ÀÉ®×ªºÀ£ÁY­µ°Tžê®Æ¡A¥B¬OšãŠ³¯}Ãa©ÊªºÀ£ÁYªk¡C
+:p.
+€Užü IO ³B²zŸ¹¡G
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+
+:h1 res=030.CD Š±¥ØªºžÑ»¡
+:p.
+³o¬O€@­Ó CD Án­µŠ±¥Øªºª«¥ó¡C­Y¥i¥H³s€Wºôžô¡A«h¥i¥H±q FreeDB ŠøªAŸ¹¬džßŠ±¥ØŠWºÙ€Îšä¥Lªºžê°T¡C§A¥²¶·«ü©w e-mail Šì§}€~¯àšÏ¥Î FreeDB¡AŠA§Q¥Î³]©w²ÕºA¥óšÓ°µ³]©w¡C
+:p.
+šÏ¥ÎªÌ°T®§·|ÀxŠsŠbŠwžË¥Ø¿ýªº cddb.ini ÀÉ®×€€¡C
+
+:h1 res=040.M3U Œœ©ñ²M³æªºžÑ»¡
+:p.
+³o¬O€@­Ó M3U Œœ©ñ²M³æªºª«¥ó¡CM3U Œœ©ñ²M³æ¬O€@­Ó€åŠrÀÉ®×¡A¥]§t­nŒœ©ñŠ±¥Øªºžô®|¡C³ošÇŒœ©ñ²M³æ¥i¥H³Q¥i²ŸŽÓªº MP3 Œœ©ñŸ¹©ÒšÏ¥Î¡CŠ³€@­Óœs¿èŸ¹¥i¥H§Q¥Î·Æ¹«ªº©ì©ñšÓ­×§ï M3U ÀÉ®×¡C
+
+:euserdoc.
Index: trunk/classes/help/tw/makefile
===================================================================
--- trunk/classes/help/tw/makefile	(revision 4)
+++ trunk/classes/help/tw/makefile	(revision 4)
@@ -0,0 +1,67 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 088
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ 
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		= 
+
+
+
+OBJECTS	= 
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc cwmm$(LANGUAGE).ipf	
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+taiwan:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-tw
+	-cd ..\CWAudio-$(VERSION)-tw && rm -r *
+	-cd ..\CWAudio-$(VERSION)-tw && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-tw\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-tw 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-tw
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-tw 	
+	-cp ./tw/Readme.tw ../CWAudio-$(VERSION)-tw 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-tw
+	-cp ./tw/cwaudio.ins ../CWAudio-$(VERSION)-tw
+	-cp ./tw/License ../CWAudio-$(VERSION)-tw
+	-cd ..\CWAudio-$(VERSION)-tw && lxlite *
+#	-cd ../CWAudio-$(VERSION)-tw && zip -r $(DISTNAME)-tw.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+
+distribution:
+	make
+	make taiwan
+	-make english
+
+
Index: trunk/classes/idl/idl_video/cwmpg.idl
===================================================================
--- trunk/classes/idl/idl_video/cwmpg.idl	(revision 3)
+++ trunk/classes/idl/idl_video/cwmpg.idl	(revision 4)
@@ -131,4 +131,5 @@
     wpclsQueryInstanceFilter    : override;   
     wpclsQueryIconData          : override;
+    wpclsInitData   	        : override;
     wpclsQueryDefaultHelp       : override; 
   };
Index: trunk/classes/idl/idl_video/cwvideo.idl
===================================================================
--- trunk/classes/idl/idl_video/cwvideo.idl	(revision 3)
+++ trunk/classes/idl/idl_video/cwvideo.idl	(revision 4)
@@ -130,6 +130,9 @@
      */
     wpclsCreateDefaultTemplates : override;
-    wpclsQueryTitle         	: override;   
-    wpclsQueryDefaultView  : override;   
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;
+    wpclsQueryTitle         	: override;
+    wpclsInitData   	        : override;   
+    wpclsQueryDefaultView       : override;   
     wpclsQueryIconData          : override;
   };
Index: trunk/classes/inc/common.h
===================================================================
--- trunk/classes/inc/common.h	(revision 3)
+++ trunk/classes/inc/common.h	(revision 4)
@@ -66,3 +66,5 @@
 #endif
 
+#define MMCLS_INI_FILE_NAME     "\\cwmm.ini"
+
 #endif
Index: trunk/classes/inc/cwaudioinc.h
===================================================================
--- trunk/classes/inc/cwaudioinc.h	(revision 3)
+++ trunk/classes/inc/cwaudioinc.h	(revision 4)
@@ -64,4 +64,5 @@
 #define TYPE_M3U             "M3U"
 #define TYPE_FLAC            "FLAC"
+#define TYPE_DIGITALVIDEO    "Digital Video"
 
 /* Setup strings for MMAudio (was CWAudio). These strings will
@@ -241,4 +242,7 @@
 #define CLASS_VOLUME_KEY   "volume"
 
+#define MMVIDEO_GETEXT_RX  "videoext.rx"
+#define MMMPG_GETEXT_RX    "mpegext.rx"
+
 #endif
 
Index: trunk/classes/inc/mmres.h
===================================================================
--- trunk/classes/inc/mmres.h	(revision 3)
+++ trunk/classes/inc/mmres.h	(revision 4)
@@ -335,3 +335,5 @@
 #define ID_MENUITEMMASTERVOLUME 5
 
-
+#define IDPB_MMFINDSTOP             809
+#define IDPB_MMFINDPAUSE            810
+#define IDPB_MMFINDPLAY             811
Index: trunk/classes/makefile
===================================================================
--- trunk/classes/makefile	(revision 3)
+++ trunk/classes/makefile	(revision 4)
@@ -18,8 +18,7 @@
 IDLDIR	=	./idl
 OBJDIR	=	./obj
-# Object files of common functions are going here
+
+# Object files of common functions (CW functions) are going here
 LIBDIR	=	./lib
-#Where the resource dlls are going 
-RESDLLDIR	=	./RES/dll
 
 
@@ -29,6 +28,9 @@
 #
 #######################################
+
+########### C compile #################
 COMPILE		=	$(CC) -I $(MOREINC) $(CFLAGS)  /Fo$@ $<
 
+########### SOM compile ###############
 #Audio classes
 AUD_SCCOMPILEC	=	sc -I $(IDLDIR)/idl_audio -I $(IDLDIR)/idl_mm -p -r -sc -d$(CDIR)/c_audio -maddstar -mnoint -S128000 -C128000  $<
@@ -114,8 +116,14 @@
 
 
+#######################################
+#
+# Define *.hlp files.
+#
+#######################################
 HLP_FILES	=	./Help/de/cwmm049.hlp \
 			./Help/en/cwmm.hlp \
 			./Help/nl/cwmm031.hlp \
-			./Help/it/cwmm039.hlp
+			./Help/it/cwmm039.hlp \
+			./Help/tw/cwmm088.hlp
 
 
@@ -125,7 +133,9 @@
 #
 #######################################
-MM_IHFILES	=	./include/cwmmdataf.ih ./include/cwmmdisk.ih ./include/mmfolder.ih
-
-IHFILES	=		./include/cwmp3.ih \
+MM_IHFILES	=	./include/cwmmdataf.ih \
+			./include/cwmmdisk.ih \
+			./include/mmfolder.ih
+
+IHFILES		=	./include/cwmp3.ih \
 			./include/cwogg.ih \
 			./include/cwaudio.ih \
@@ -168,5 +178,5 @@
 #
 #######################################
-all: cwmm.dll $(HLP_FILES) 
+all: cwmm.dll $(HLP_FILES) nlv
 	cd ./mm-progs && make
 
@@ -176,7 +186,7 @@
 cwmm.dll: $(MM_IHFILES) $(IHFILES) $(VID_IHFILES) $(IMG_IHFILES) \
 	$(ALL_OBJECTS)
-	@create_cwmm_def.CMD ./c/cwmm.def
-	$(CC) $(LDFLAGS) /L  /Fm$(basename $@)  /Fe$@ $(ALL_OBJECTS) $(LIBS) ./c/cwmm.def
-#Add icons to DLL
+	@create_cwmm_def.CMD $(OBJDIR)/cwmm.def
+	$(CC) $(LDFLAGS) /L  /Fm$(basename $@)  /Fe$@ $(ALL_OBJECTS) $(LIBS) $(OBJDIR)/cwmm.def
+#Add icons to DLL (no NLV stuff)
 	cd ./res && make
 	rc ./res/common_res/cwaudio.res cwmm.dll
@@ -185,4 +195,14 @@
 ###################################
 #
+#  Rules for generating the NLV
+#  ressources.
+#
+###################################
+nlv:
+	cd ./res && make
+	
+
+###################################
+#
 #  Rules for generating online help
 #
@@ -203,4 +223,8 @@
 ./Help/it/cwmm039.hlp:	./Help/it/cwmm039.ipf
 	cd ./Help/it && make
+
+# Traditional chinese (TW)
+./Help/tw/cwmm088.hlp:	./Help/tw/cwmm088.ipf
+	cd ./Help/tw && make
 
 ###################################
@@ -293,4 +317,5 @@
 	-cd ./Help/nl && make clean
 	-cd ./Help/it && make clean
+	-cd ./Help/tw && make clean
 	-cd ./res && make clean
 	-cd ./mm-progs && make clean
@@ -305,4 +330,5 @@
 	-cd ./Help/nl && make cleaner
 	-cd ./Help/it && make cleaner
+	-cd ./Help/tw && make cleaner
 	-cd ./res && make cleaner
 	-cd ./mm-progs && make cleaner
Index: trunk/classes/mm-progs/MMPlayer/def.tpl
===================================================================
--- trunk/classes/mm-progs/MMPlayer/def.tpl	(revision 4)
+++ trunk/classes/mm-progs/MMPlayer/def.tpl	(revision 4)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM-Program for audio file playing
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2003
+
+[AUTHOR]
+(c) C. Wohlgemuth
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME MMPLAYER WINDOWAPI
+
+[BUILDMACHINE]
+My ;-)
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/MMPlayer/license.txt
===================================================================
--- trunk/classes/mm-progs/MMPlayer/license.txt	(revision 4)
+++ trunk/classes/mm-progs/MMPlayer/license.txt	(revision 4)
@@ -0,0 +1,21 @@
+/*
+ * 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, 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; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
Index: trunk/classes/mm-progs/MMPlayer/makefile
===================================================================
--- trunk/classes/mm-progs/MMPlayer/makefile	(revision 3)
+++ trunk/classes/mm-progs/MMPlayer/makefile	(revision 4)
@@ -2,17 +2,10 @@
 
 include ../../../make.inc
+include ../mmprog.inc
 
-CC           = gcc
-LIB_DIR      = $d:/emx/lib 
-#CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
-#CPPFLAGS     = -O -Zomf -Zcrtdll -Zmtd -s
-CPPFLAGS     = -O -Wall -Zomf -Zmt -Zsys -s
-INC		= ../include -I ../../../classes/inc -I ../../../common_functions/include
-DEFS         = 
-PROGS        =  
-ODIR		= .
-CPPDIR	= .
-LIBDIR	=	../lib
-OBJECTS	=	$(LIBDIR)/message.obj $(LIBDIR)/helper.obj $(LIBDIR)/menu_funcs.obj $(LIBDIR)/sys_funcs.obj
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/menu_funcs.obj \
+		$(LIBDIR)/sys_funcs.obj
 OBJS2		=	 customprocs.obj playaudio.obj display.obj
 
@@ -20,13 +13,9 @@
 all:	mmplayer.exe
 
-$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c 
-	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
 
-%.obj:	%.c
-	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
-
-mmplayer.exe:	mmplayer.c $(OBJECTS) $(OBJS2) makefile
+mmplayer.exe:	mmplayer.c $(OBJECTS) $(OBJS2) makefile def.tpl
+	cmd /C $(TOOLDIR)\create_MMPROG_def.cmd mmplayer.def
 #Use this command to link dynamicaly
-	gcc $(CPPFLAGS) -I$(INC) mmplayer.c $(OBJECTS) $(OBJS2) -los2me mmplayer.def
+	$(CC) $(CPPFLAGS) -I$(INC) mmplayer.c $(OBJECTS) $(OBJS2) -los2me mmplayer.def
 	rc mmplayer.rc mmplayer.exe
 
Index: trunk/classes/mm-progs/MMPlayer/mmplayer.DEF
===================================================================
--- trunk/classes/mm-progs/MMPlayer/mmplayer.DEF	(revision 3)
+++ trunk/classes/mm-progs/MMPlayer/mmplayer.DEF	(revision 4)
@@ -1,7 +1,11 @@
-; DEF-file for mmplayer.exe. This is a PM program which 
-; play audio files.
 ;
-;                    (C) Chris Wohlgemuth 2003
-
+; MMPLAYER: PM-Program for audio file playing
+;
+;
+;    (c) C. Wohlgemuth 2003-2005
+;
+;
+; Created 14 Aug 2005 21:15:29
+;
 ;/*
 ; * This program is free software; you can redistribute it and/or modify
@@ -26,8 +30,4 @@
 ; */
 NAME MMPLAYER WINDOWAPI
-DESCRIPTION '$@#(c) Chris Wohlgemuth :V0.2.7 (17.08.2003)#@PM-Program for audio file playing'
+DESCRIPTION '$@#(c) C. Wohlgemuth 2005:0.2        #@##1## 14/08/05 21:15:29        My ;-)     ::::9::@@PM-Program for audio file playing V0.2.9'
 STACKSIZE    1638400
-
-
-
-
Index: trunk/classes/mm-progs/MMPlayer/playaudio.c
===================================================================
--- trunk/classes/mm-progs/MMPlayer/playaudio.c	(revision 3)
+++ trunk/classes/mm-progs/MMPlayer/playaudio.c	(revision 4)
@@ -294,2 +294,4 @@
   }
 }
+
+
Index: trunk/classes/mm-progs/audioconverter/audconv.DEF
===================================================================
--- trunk/classes/mm-progs/audioconverter/audconv.DEF	(revision 3)
+++ trunk/classes/mm-progs/audioconverter/audconv.DEF	(revision 4)
@@ -1,7 +1,11 @@
-; DEF-file for audconv.exe. This is a PM program which 
-; shows a dialog box and converts audio files to waves.
 ;
-;                    (C) Chris Wohlgemuth 2001
-
+; AUDCONV: PM-Program for audio file converting
+;
+;
+;    (c) C. Wohlgemuth 2001-2006
+;
+;
+; Created 12 Feb 2006 19:46:31
+;
 ;/*
 ; * This program is free software; you can redistribute it and/or modify
@@ -25,9 +29,5 @@
 ; * http://www.geocities.com/SiliconValley/Sector/5785/
 ; */
-
-NAME audconv WINDOWAPI
-DESCRIPTION '$@#(c) Chris Wohlgemuth :V0.2.7 (17.08.2003)#@PM-Program for audio file converting'
-
-
-
-
+NAME AUDCONV WINDOWAPI
+DESCRIPTION '$@#(c) C. Wohlgemuth 2006:0.2        #@##1## 12/02/06 19:46:31        My ;-)     ::::9::@@PM-Program for audio file converting V0.2.9'
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/audioconverter/def.tpl
===================================================================
--- trunk/classes/mm-progs/audioconverter/def.tpl	(revision 4)
+++ trunk/classes/mm-progs/audioconverter/def.tpl	(revision 4)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM-Program for audio file converting
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001
+
+[AUTHOR]
+(c) C. Wohlgemuth
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME AUDCONV WINDOWAPI
+
+[BUILDMACHINE]
+My ;-)
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/audioconverter/license.txt
===================================================================
--- trunk/classes/mm-progs/audioconverter/license.txt	(revision 4)
+++ trunk/classes/mm-progs/audioconverter/license.txt	(revision 4)
@@ -0,0 +1,21 @@
+/*
+ * 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, 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; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
Index: trunk/classes/mm-progs/audioconverter/makefile
===================================================================
--- trunk/classes/mm-progs/audioconverter/makefile	(revision 3)
+++ trunk/classes/mm-progs/audioconverter/makefile	(revision 4)
@@ -3,31 +3,26 @@
 include ../../../make.inc
 
-CC           = gcc
-LIB_DIR      = $d:/emx/lib 
-#CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
-#CPPFLAGS     = -O -Zomf -Zcrtdll -s
-CPPFLAGS     = -O -Wall -Zomf -Zmt -Zsys -s
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/progbars.obj \
+		$(LIBDIR)/sys_funcs.obj
 
-INC		= ../include -I ../../../classes/inc -I ../../../common_functions/include
-DEFS         = 
-PROGS        =  
-ODIR		= .
-CPPDIR	= .
-LIBDIR	=	../lib
-OBJECTS	=	$(LIBDIR)/message.obj $(LIBDIR)/helper.obj $(LIBDIR)/progbars.obj $(LIBDIR)/sys_funcs.obj
+include ../mmprog.inc
 
 
 all:	audconv.exe
 
-$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c
-	gcc -c -o$@ -Zomf -I$(INC) $<  
 
-audconv.exe:	audconv.c $(OBJECTS)
-	gcc $(CPPFLAGS) -I$(INC) audconv.c $(OBJECTS) -los2me audconv.def
+audconv.exe:	audconv.c $(OBJECTS) makefile def.tpl
+	cmd /C $(TOOLDIR)\create_MMPROG_def.cmd audconv.def
+	$(CC) $(CPPFLAGS) -I$(INC) audconv.c $(OBJECTS) -los2me audconv.def
 
 
 clean:
 	-rm *.exe
+	-rm *.dll
 	-rm *.obj
+	-rm *.res
+	-rm *.ini
 
 cleaner:
@@ -38,4 +33,2 @@
 distribution:
 	-cp *.exe ../../dist/bin
-	
-
Index: trunk/classes/mm-progs/create_mmprog_def.CMD
===================================================================
--- trunk/classes/mm-progs/create_mmprog_def.CMD	(revision 4)
+++ trunk/classes/mm-progs/create_mmprog_def.CMD	(revision 4)
@@ -0,0 +1,196 @@
+/*                                                         */
+/* Create DEF file for a MM helper program from a template */
+/*                                                         */
+/*         (c) Chris Wohlgemuth 2005                       */
+/*                                                         */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+DEBUG=0
+
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+/* License file to be added to the DEF file */
+licenseFile=DIRECTORY()||'\'||license.txt
+
+/* Template file */
+templateFile=ARG(2)
+IF arg(2)="" THEN
+	templateFile=DIRECTORY()||'\'||def.tpl
+
+/* Get the version of the classes */
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion="0.0.0"
+
+/* The stem holding all the information we get from the template file */
+fileData.=''
+
+
+call getTemplateData templateFile
+/* Index */
+call assignTemplateVars
+
+IF DEBUG=1 THEN DO
+	DO a=1 to filedata.0
+		SAY fileData.a.sectionname":"
+		SAY fileData.a
+	END
+END
+
+/* Specify save defaults */
+IF fileData.buildmachine="" THEN
+	fileData.buildmachine="Default"
+fileData.buildmachine.desc="Build machine: "
+
+IF fileData.author="" THEN
+	fileData.author="                      "
+fileData.author.desc="Author: "
+IF fileData.name='' THEN
+	fileData.name=""
+
+IF DEBUG=1 THEN DO
+	SAY ""
+	SAY "License file: "||licensefile
+	SAY "DEF-file: "||deffile
+	SAY "Version: "||theversion
+	SAY "Template data: "
+	DO a=1 to fileData.0
+		SAY " "||fileData.a.desc||": "||fileData.a
+	END
+END
+
+'@type NUL > 'deffile
+
+/* Write header */
+call lineout deffile, ';'
+call lineout deffile, '; '||WORD(fileData.name,2)||": "fileData.description
+call lineout deffile, ';'
+
+/* Write copyright */
+call lineout deffile, ';'
+IF fileData.copyright><"" THEN
+	call lineout deffile, ';    '||fileData.copyright||"-"WORD(DATE(),3)
+ELSE
+	call lineout deffile, ';    '||fileData.author||" "WORD(DATE(),3)
+call lineout deffile, ';'
+/* Write creation date */
+call lineout deffile, ';'
+call lineout deffile, '; Created '||DATE()||" "||TIME()
+call lineout deffile, ';'
+
+/* Write license */
+DO WHILE LINES(licenseFile)
+	theLine=LINEIN(licenseFile)
+        IF LENGTH(theLine) >0 THEN DO
+		IF substr(theLine,1,1) >< ';' THEN
+			theLine=';'||theLine
+	END
+	ELSE
+	   theLine=theLine||';'
+	call LINEOUT deffile, theLine
+END
+call stream licenseFile, "C", "close"
+
+/* Now write the NAME data */
+call lineout deffile, fileData.name
+
+/* Description with bldlevel info */
+timeData=OVERLAY(DATE("E")||" "||TIME("N"), "                       ")
+versionData=OVERLAY( LEFT(theVersion,3),"           ")
+def="DESCRIPTION '$@#"||fileData.author||" "
+def=def||WORD(DATE(),3)||":"||versionData||"#@##1## "||timeData
+def=def||"  "||SUBSTR(fileData.buildmachine,1,11)||"::::"||WORD(TRANSLATE(theVersion," ", "."),3)
+def=def||"::@@"||fileData.description||" V"||theVersion||"'"
+call lineout deffile, def
+
+/* Additional info we may have */
+call  lineout deffile, fileData.other
+
+call stream deffile, "C", "close"
+
+SAY "New DEF file created for V"||theVersion||"."
+exit
+
+/************************************************************/
+/* Assign the symbols specified by the sections list the position value
+   they have in the list of sections. By doing this the symbols may be used
+   as indexes in the filedata. stem*/
+assignTemplateVars: procedure expose (fileData.sections)
+	DO a=1 to WORDS(fileData.sections)
+		call VALUE WORD(fileData.sections,a),a
+	END
+return
+
+/************ Parse the template file ***********************/
+getTemplateData: procedure expose fileData.
+	theFile=arg(1)
+
+	fileData.=''
+	fileContents.=''
+
+	fileContents.0=0
+	/* Read in the file for easier processing */
+	DO WHILE LINES(theFile)
+		fileContents.0=fileContents.0+1
+		b=fileContents.0
+		fileContents.b=LINEIN(theFile)
+	END
+	call stream theFile, "C", "close"
+
+	DO b=1 to fileContents.0
+		theLine=fileContents.b
+		fileContents.current=b
+		section = Strip(Translate(word(theline,1)))
+		select
+	    		when (Left(section,1) = '#') | section = '' then
+			do
+			/* Jump comments and empty lines */
+			end;
+		WHEN LEFT(section,1)="[" THEN DO
+			call parseSection
+			b=fileContents.current
+		END
+		OTHERWISE
+			nop			
+		END
+
+	END
+	fileData.0=WORDS(fileData.sections)
+	DROP fileContents.
+return
+
+parseSection: procedure expose fileData. fileContents.
+	b=fileContents.current
+	/* Add this section to the list of sections */
+	filedata.sections=filedata.sections||" "||SPACE(TRANSLATE(fileContents.b, "  ", "[]"))
+	index=WORDS(fileData.sections)
+	fileData.index=""
+	fileData.index.sectionname=SPACE(TRANSLATE(fileContents.b, "  ", "[]"))
+	/* Parse this section */
+	b=b+1
+	DO a=b to fileContents.0
+		theLine=fileContents.a
+		fileContents.current=a
+		section = Strip(Translate(word(theline,1)))
+		select
+	    		when (Left(section,1) = '#') | section = '' then
+			do
+			/* Jump comments and empty lines */
+			end;
+		WHEN LEFT(section,1)="[" THEN DO
+			/* New section jump back after correcting the index */
+			fileContents.current=fileContents.current-1
+			return
+		END
+		OTHERWISE
+			IF fileData.index <>"" THEN fileData.index=fileData.index||'0d'x||'0a'x
+			fileData.index=fileData.index||theLine			
+		END
+
+	END
+
+return
+/***********************************************/
Index: trunk/classes/mm-progs/imageconverter/def.tpl
===================================================================
--- trunk/classes/mm-progs/imageconverter/def.tpl	(revision 4)
+++ trunk/classes/mm-progs/imageconverter/def.tpl	(revision 4)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM-Program for image file converting
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002
+
+[AUTHOR]
+(c) C. Wohlgemuth
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME IMGCONV WINDOWAPI
+
+[BUILDMACHINE]
+My ;-)
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/imageconverter/imgconv.DEF
===================================================================
--- trunk/classes/mm-progs/imageconverter/imgconv.DEF	(revision 3)
+++ trunk/classes/mm-progs/imageconverter/imgconv.DEF	(revision 4)
@@ -1,7 +1,11 @@
-; DEF-file for imgconv.exe. This is a PM program which 
-; shows a dialog box and converts image files.
 ;
-;                    (C) Chris Wohlgemuth 2002
-
+; IMGCONV: PM-Program for image file converting
+;
+;
+;    (c) C. Wohlgemuth 2002-2006
+;
+;
+; Created 12 Feb 2006 19:48:25
+;
 ;/*
 ; * This program is free software; you can redistribute it and/or modify
@@ -25,9 +29,5 @@
 ; * http://www.geocities.com/SiliconValley/Sector/5785/
 ; */
-NAME imgconv WINDOWAPI
-DESCRIPTION '$@#(c) Chris Wohlgemuth :V0.2.7 (17.08.2003)#@PM-Program for image file converting'
+NAME IMGCONV WINDOWAPI
+DESCRIPTION '$@#(c) C. Wohlgemuth 2006:0.2        #@##1## 12/02/06 19:48:25        My ;-)     ::::9::@@PM-Program for image file converting V0.2.9'
 STACKSIZE    1638400
-
-
-
-
Index: trunk/classes/mm-progs/imageconverter/license.txt
===================================================================
--- trunk/classes/mm-progs/imageconverter/license.txt	(revision 4)
+++ trunk/classes/mm-progs/imageconverter/license.txt	(revision 4)
@@ -0,0 +1,21 @@
+/*
+ * 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, 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; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
Index: trunk/classes/mm-progs/imageconverter/makefile
===================================================================
--- trunk/classes/mm-progs/imageconverter/makefile	(revision 3)
+++ trunk/classes/mm-progs/imageconverter/makefile	(revision 4)
@@ -2,31 +2,25 @@
 
 include ../../../make.inc
+include ../mmprog.inc
 
-CC           = gcc
-LIB_DIR      = $d:/emx/lib 
-#CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
-#CPPFLAGS     = -O -Zomf -Zcrtdll -Zmtd -s
-CPPFLAGS     = -O -Wall -Zomf -Zmt -Zsys -s
-INC		= ../include -I ../../../classes/inc -I ../../../common_functions/include
-DEFS         = 
-PROGS        =  
-ODIR		= .
-CPPDIR	= .
-LIBDIR	=	../lib
-OBJECTS	=	$(LIBDIR)/message.obj $(LIBDIR)/helper.obj $(LIBDIR)/progbars.obj $(LIBDIR)/sys_funcs.obj
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/progbars.obj \
+		$(LIBDIR)/sys_funcs.obj
 
 all:	imgconv.exe
 
-$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c
-	gcc -c -o$@ -Zomf -I$(INC) $<  
 
 imgconv.exe:	imgconv.c $(OBJECTS)
+	cmd /C $(TOOLDIR)\create_MMPROG_def.cmd imgconv.def
 #Use this command to link dynamicaly
-#	gcc $(CPPFLAGS) -I$(INC) imgconv.c $(OBJECTS) -Zmtd -los2me imgconv.def
-	gcc $(CPPFLAGS) -I$(INC) imgconv.c $(OBJECTS) -los2me imgconv.def
+	$(CC) $(CPPFLAGS) -I$(INC) imgconv.c $(OBJECTS) -los2me imgconv.def
 
 clean:
 	-rm *.exe
+	-rm *.dll
 	-rm *.obj
+	-rm *.res
+	-rm *.ini
 
 cleaner:
@@ -34,5 +28,4 @@
 	-rm *.flc
 
+
 distribution:
-	
-
Index: trunk/classes/mm-progs/include/mmprogs_defaults.h
===================================================================
--- trunk/classes/mm-progs/include/mmprogs_defaults.h	(revision 3)
+++ trunk/classes/mm-progs/include/mmprogs_defaults.h	(revision 4)
@@ -29,5 +29,5 @@
 /************************************/
 /* General */
-#define INI_FILE_NAME     "\\cwmm.ini"
+#define MMCLS_INI_FILE_NAME     "\\cwmm.ini"
 #define INI_WINDOWPOS_KEY "windowpos"    /* Key for storing window position */
 
Index: trunk/classes/mm-progs/master_volume/def.tpl
===================================================================
--- trunk/classes/mm-progs/master_volume/def.tpl	(revision 4)
+++ trunk/classes/mm-progs/master_volume/def.tpl	(revision 4)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+Master volume applet
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001
+
+[AUTHOR]
+(c) C. Wohlgemuth
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME VOLUME WINDOWAPI
+
+[BUILDMACHINE]
+My ;-)
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/master_volume/license.txt
===================================================================
--- trunk/classes/mm-progs/master_volume/license.txt	(revision 4)
+++ trunk/classes/mm-progs/master_volume/license.txt	(revision 4)
@@ -0,0 +1,21 @@
+/*
+ * 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, 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; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
Index: trunk/classes/mm-progs/master_volume/makefile
===================================================================
--- trunk/classes/mm-progs/master_volume/makefile	(revision 3)
+++ trunk/classes/mm-progs/master_volume/makefile	(revision 4)
@@ -2,21 +2,11 @@
 
 include ../../../make.inc
+include ../mmprog.inc
 
-CC           = gcc
-LIB_DIR      = $d:/emx/lib 
-#CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
-#CPPFLAGS     = -O -Zomf -Zcrtdll -s
-CPPFLAGS     = -O -Wall -Zomf -Zsys -s
-
-ICCFLAGS	= /Ss
-INC		= ../include -I ../../../common_functions/include -I ../../../classes/inc
-DEFS         = 
-PROGS        =  
-ODIR		= .
-CPPDIR	= .
 ICONDIR =	..\res\Icons
-LIBDIR	=	../lib
-OBJECTS	=	$(LIBDIR)/message.obj $(LIBDIR)/helper.obj $(LIBDIR)/progbars.obj $(LIBDIR)/sys_funcs.obj
-#OBJDIR	=	../obj
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/progbars.obj \
+		$(LIBDIR)/sys_funcs.obj
 #OBJECTS	=	$(OBJDIR)/message.obj $(OBJDIR)/helper.obj $(OBJDIR)/progbars.obj \
 			$(OBJDIR)/sys_funcs.obj
@@ -24,9 +14,8 @@
 all:	volume.exe
 
-$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c
-	gcc -c -o$@ -Zomf -I$(INC) $<  
 
-volume.exe:	volume.c $(OBJECTS)
-	gcc $(CPPFLAGS) -I$(INC) volume.c $(OBJECTS) -Zmt -los2me volume.def
+volume.exe:	volume.c $(OBJECTS) makefile def.tpl
+	cmd /C $(TOOLDIR)\create_MMPROG_def.cmd volume.def
+	$(CC) $(CPPFLAGS) -I$(INC) volume.c $(OBJECTS) -Zmt -los2me volume.def
 	rc -I $(INC) volume.rc volume.exe
 
Index: trunk/classes/mm-progs/master_volume/volume.DEF
===================================================================
--- trunk/classes/mm-progs/master_volume/volume.DEF	(revision 3)
+++ trunk/classes/mm-progs/master_volume/volume.DEF	(revision 4)
@@ -1,7 +1,11 @@
-; DEF-file for volume.exe. This is a PM program which 
-; shows a dialog box for setting the masteraudio.
 ;
-;                    (C) Chris Wohlgemuth 2001
-
+; VOLUME: Master volume applet
+;
+;
+;    (c) C. Wohlgemuth 2001-2006
+;
+;
+; Created 12 Feb 2006 19:56:10
+;
 ;/*
 ; * This program is free software; you can redistribute it and/or modify
@@ -25,10 +29,5 @@
 ; * http://www.geocities.com/SiliconValley/Sector/5785/
 ; */
-
 NAME VOLUME WINDOWAPI
-DESCRIPTION '$@#(c) Chris Wohlgemuth :V0.2.7 (17.08.2003)#@Master volume applet'
-;EXPORTS         decodeStatusDialogProc
-
-
-
-
+DESCRIPTION '$@#(c) C. Wohlgemuth 2006:0.2        #@##1## 12/02/06 19:56:10        My ;-)     ::::9::@@Master volume applet V0.2.9'
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/mmfind/___create_mmprog_def.CMD
===================================================================
--- trunk/classes/mm-progs/mmfind/___create_mmprog_def.CMD	(revision 4)
+++ trunk/classes/mm-progs/mmfind/___create_mmprog_def.CMD	(revision 4)
@@ -0,0 +1,196 @@
+/*                                                         */
+/* Create DEF file for a MM helper program from a template */
+/*                                                         */
+/*         (c) Chris Wohlgemuth 2005                       */
+/*                                                         */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+DEBUG=0
+
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+/* License file to be added to the DEF file */
+licenseFile=DIRECTORY()||'\'||license.txt
+
+/* Template file */
+templateFile=ARG(2)
+IF arg(2)="" THEN
+	templateFile=DIRECTORY()||'\'||def.tpl
+
+/* Get the version of the classes */
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion="0.0.0"
+
+/* The stem holding all the information we get from the template file */
+fileData.=''
+
+
+call getTemplateData templateFile
+/* Index */
+call assignTemplateVars
+
+IF DEBUG=1 THEN DO
+	DO a=1 to filedata.0
+		SAY fileData.a.sectionname":"
+		SAY fileData.a
+	END
+END
+
+/* Specify save defaults */
+IF fileData.buildmachine="" THEN
+	fileData.buildmachine="Default"
+fileData.buildmachine.desc="Build machine: "
+
+IF fileData.author="" THEN
+	fileData.author="                      "
+fileData.author.desc="Author: "
+IF fileData.name='' THEN
+	fileData.name=""
+
+IF DEBUG=1 THEN DO
+	SAY ""
+	SAY "License file: "||licensefile
+	SAY "DEF-file: "||deffile
+	SAY "Version: "||theversion
+	SAY "Template data: "
+	DO a=1 to fileData.0
+		SAY " "||fileData.a.desc||": "||fileData.a
+	END
+END
+
+'@type NUL > 'deffile
+
+/* Write header */
+call lineout deffile, ';'
+call lineout deffile, '; '||WORD(fileData.name,2)||": "fileData.description
+call lineout deffile, ';'
+
+/* Write copyright */
+call lineout deffile, ';'
+IF fileData.copyright><"" THEN
+	call lineout deffile, ';    '||fileData.copyright||"-"WORD(DATE(),3)
+ELSE
+	call lineout deffile, ';    '||fileData.author||" "WORD(DATE(),3)
+call lineout deffile, ';'
+/* Write creation date */
+call lineout deffile, ';'
+call lineout deffile, '; Created '||DATE()||" "||TIME()
+call lineout deffile, ';'
+
+/* Write license */
+DO WHILE LINES(licenseFile)
+	theLine=LINEIN(licenseFile)
+        IF LENGTH(theLine) >0 THEN DO
+		IF substr(theLine,1,1) >< ';' THEN
+			theLine=';'||theLine
+	END
+	ELSE
+	   theLine=theLine||';'
+	call LINEOUT deffile, theLine
+END
+call stream licenseFile, "C", "close"
+
+/* Now write the NAME data */
+call lineout deffile, fileData.name
+
+/* Description with bldlevel info */
+timeData=OVERLAY(DATE("E")||" "||TIME("N"), "                       ")
+versionData=OVERLAY( LEFT(theVersion,3),"           ")
+def="DESCRIPTION '$@#"||fileData.author||" "
+def=def||WORD(DATE(),3)||":"||versionData||"#@##1## "||timeData
+def=def||"  "||SUBSTR(fileData.buildmachine,1,11)||"::::"||WORD(TRANSLATE(theVersion," ", "."),3)
+def=def||"::@@"||fileData.description||" V"||theVersion||"'"
+call lineout deffile, def
+
+/* Additional info we may have */
+call  lineout deffile, fileData.other
+
+call stream deffile, "C", "close"
+
+SAY "New DEF file created for V"||theVersion||"."
+exit
+
+/************************************************************/
+/* Assign the symbols specified by the sections list the position value
+   they have in the list of sections. By doing this the symbols may be used
+   as indexes in the filedata. stem*/
+assignTemplateVars: procedure expose (fileData.sections)
+	DO a=1 to WORDS(fileData.sections)
+		call VALUE WORD(fileData.sections,a),a
+	END
+return
+
+/************ Parse the template file ***********************/
+getTemplateData: procedure expose fileData.
+	theFile=arg(1)
+
+	fileData.=''
+	fileContents.=''
+
+	fileContents.0=0
+	/* Read in the file for easier processing */
+	DO WHILE LINES(theFile)
+		fileContents.0=fileContents.0+1
+		b=fileContents.0
+		fileContents.b=LINEIN(theFile)
+	END
+	call stream theFile, "C", "close"
+
+	DO b=1 to fileContents.0
+		theLine=fileContents.b
+		fileContents.current=b
+		section = Strip(Translate(word(theline,1)))
+		select
+	    		when (Left(section,1) = '#') | section = '' then
+			do
+			/* Jump comments and empty lines */
+			end;
+		WHEN LEFT(section,1)="[" THEN DO
+			call parseSection
+			b=fileContents.current
+		END
+		OTHERWISE
+			nop			
+		END
+
+	END
+	fileData.0=WORDS(fileData.sections)
+	DROP fileContents.
+return
+
+parseSection: procedure expose fileData. fileContents.
+	b=fileContents.current
+	/* Add this section to the list of sections */
+	filedata.sections=filedata.sections||" "||SPACE(TRANSLATE(fileContents.b, "  ", "[]"))
+	index=WORDS(fileData.sections)
+	fileData.index=""
+	fileData.index.sectionname=SPACE(TRANSLATE(fileContents.b, "  ", "[]"))
+	/* Parse this section */
+	b=b+1
+	DO a=b to fileContents.0
+		theLine=fileContents.a
+		fileContents.current=a
+		section = Strip(Translate(word(theline,1)))
+		select
+	    		when (Left(section,1) = '#') | section = '' then
+			do
+			/* Jump comments and empty lines */
+			end;
+		WHEN LEFT(section,1)="[" THEN DO
+			/* New section jump back after correcting the index */
+			fileContents.current=fileContents.current-1
+			return
+		END
+		OTHERWISE
+			IF fileData.index <>"" THEN fileData.index=fileData.index||'0d'x||'0a'x
+			fileData.index=fileData.index||theLine			
+		END
+
+	END
+
+return
+/***********************************************/
Index: trunk/classes/mm-progs/mmfind/_mmfind.DEF
===================================================================
--- trunk/classes/mm-progs/mmfind/_mmfind.DEF	(revision 4)
+++ trunk/classes/mm-progs/mmfind/_mmfind.DEF	(revision 4)
@@ -0,0 +1,31 @@
+; DEF-file for mmfind.exe. This is a PM program to 
+; search any MM file.
+;
+;                    (C) Chris Wohlgemuth 2004
+
+;/*
+; * 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, 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; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+;/*
+; * If you need another license for your project/product contact me at
+; * 
+; * http://www.os2world.com/cdwriting
+; * http://www.geocities.com/SiliconValley/Sector/5785/
+; */
+NAME MMFIND WINDOWAPI
+DESCRIPTION '$@#(c) Chris Wohlgemuth :V0.2.8 (17.08.2003)#@PM-Program for MM file searching'
+STACKSIZE    1638400
+
+
Index: trunk/classes/mm-progs/mmfind/def.tpl
===================================================================
--- trunk/classes/mm-progs/mmfind/def.tpl	(revision 4)
+++ trunk/classes/mm-progs/mmfind/def.tpl	(revision 4)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM-Program for MM file searching
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2004
+
+[AUTHOR]
+(c) C. Wohlgemuth
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME MMFIND WINDOWAPI
+
+[BUILDMACHINE]
+My ;-)
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/mmfind/image.c
===================================================================
--- trunk/classes/mm-progs/mmfind/image.c	(revision 3)
+++ trunk/classes/mm-progs/mmfind/image.c	(revision 4)
@@ -92,7 +92,4 @@
 }
 
-
-
-
 MRESULT EXPENTRY bmpPreviewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
 {
@@ -116,4 +113,5 @@
 
 
+#if 0
 /*
   Load an image file using IO-Procs
@@ -378,2 +376,3 @@
     return(hbm);
 }
+#endif
Index: trunk/classes/mm-progs/mmfind/license.txt
===================================================================
--- trunk/classes/mm-progs/mmfind/license.txt	(revision 4)
+++ trunk/classes/mm-progs/mmfind/license.txt	(revision 4)
@@ -0,0 +1,21 @@
+/*
+ * 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, 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; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
Index: trunk/classes/mm-progs/mmfind/makefile
===================================================================
--- trunk/classes/mm-progs/mmfind/makefile	(revision 3)
+++ trunk/classes/mm-progs/mmfind/makefile	(revision 4)
@@ -2,35 +2,24 @@
 
 include ../../../make.inc
+include ../mmprog.inc
 
-CC           = gcc
-LIB_DIR      = $d:/emx/lib 
-#CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
-#CPPFLAGS     = -O -Zomf -Zcrtdll -Zmtd -s
-CPPFLAGS     = -O -Wall -Zomf -Zmt -Zsys -s
-INC		= ../include -I ../../../classes/inc -I ../../../common_functions/include
-DEFS         = 
-PROGS        =  
-ODIR		= .
-CPPDIR	= .
-LIBDIR	=	../lib
-OBJECTS	=	$(LIBDIR)/helper.obj $(LIBDIR)/message.obj $(LIBDIR)/sys_funcs.obj
-# $(LIBDIR)/menu_funcs.obj 
-OBJS2		=	image.obj	 
-#customprocs.obj playaudio.obj display.obj
+LIBOBJECTS	=	$(LIBDIR)/helper.obj \
+			$(LIBDIR)/message.obj \
+			$(LIBDIR)/sys_funcs.obj \
+			$(LIBDIR)/window_funcs.obj \
+			$(LIBDIR)/img_funcs.obj \
+			$(LIBDIR)/ini_funcs.obj
+
+
+OBJECTS		=	image.obj	 
 
 
 all:	mmfind.exe
 
-$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c 
-	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
-
-%.obj:	%.c
-	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
-
-mmfind.exe:	mmfind.c $(OBJECTS) $(OBJS2) makefile
+mmfind.exe:	mmfind.c $(LIBOBJECTS) $(OBJECTS) makefile mmfind.rc def.tpl
 #Use this command to link dynamicaly
-	gcc $(CPPFLAGS) -I$(INC) mmfind.c $(OBJECTS) $(OBJS2) -los2me mmfind.def
-#	rc mmfind.rc mmfind.exe
-
+	cmd /C $(TOOLDIR)\create_MMPROG_def.cmd mmfind.def
+	gcc $(CPPFLAGS) -I$(INC) mmfind.c $(LIBOBJECTS) $(OBJECTS) -los2me mmfind.def
+	rc mmfind.rc mmfind.exe
 
 clean:
@@ -45,4 +34,4 @@
 	-rm *.flc
 
+
 distribution:
-	
Index: trunk/classes/mm-progs/mmfind/mmfind.DEF
===================================================================
--- trunk/classes/mm-progs/mmfind/mmfind.DEF	(revision 3)
+++ trunk/classes/mm-progs/mmfind/mmfind.DEF	(revision 4)
@@ -1,7 +1,11 @@
-; DEF-file for mmfind.exe. This is a PM program to 
-; search any MM file.
 ;
-;                    (C) Chris Wohlgemuth 2004
-
+; MMFIND: PM-Program for MM file searching
+;
+;
+;    (c) C. Wohlgemuth 2004-2005
+;
+;
+; Created 15 Aug 2005 22:58:57
+;
 ;/*
 ; * This program is free software; you can redistribute it and/or modify
@@ -26,6 +30,4 @@
 ; */
 NAME MMFIND WINDOWAPI
-DESCRIPTION '$@#(c) Chris Wohlgemuth :V0.2.8 (17.08.2003)#@PM-Program for MM file searching'
+DESCRIPTION '$@#(c) C. Wohlgemuth 2005:0.2        #@##1## 15/08/05 22:58:57        My ;-)     ::::9::@@PM-Program for MM file searching V0.2.9'
 STACKSIZE    1638400
-
-
Index: trunk/classes/mm-progs/mmfind/mmfind.c
===================================================================
--- trunk/classes/mm-progs/mmfind/mmfind.c	(revision 3)
+++ trunk/classes/mm-progs/mmfind/mmfind.c	(revision 4)
@@ -1,4 +1,4 @@
 /*
- * mmplayer.c (C) Chris Wohlgemuth 2004
+ * mmfind.c (C) Chris Wohlgemuth 2004-2005
  *
  */
@@ -37,5 +37,7 @@
 #define INCL_GPI
 #define INCL_PM
-
+#define INCL_REXXSAA
+
+/* OS/2 and compiler includes */
 #include <os2.h>
 #include <sys\types.h>
@@ -45,54 +47,36 @@
 #include <stdlib.h>
 #include "os2me.h"
-#include "common.h"
-#include "mmres.h"
-#include "mmprogs_defaults.h"
+/* CW toolkit includes */
 #include "sys_funcs.h"
 #include "message_funcs.h"
-
-#ifndef OPEN_DEFAULT 
-/*  Open views for the wpOpen() method */
-
-      #define OPEN_UNKNOWN      -1
-      #define OPEN_DEFAULT       0
-      #define OPEN_CONTENTS      1
-      #define OPEN_SETTINGS      2
-      #define OPEN_HELP          3
-      #define OPEN_RUNNING       4
-      #define OPEN_PROMPTDLG     5
-      #define OPEN_PALETTE       121                                   /*SPLIT*/
-      #define OPEN_USER          0x6500
-#endif
-
-#define TIMERID_SELECTION 1
-
+#include "window_funcs.h"
+#include "img_funcs.h"
+#include "ini_funcs.h"
+/* Program includes */
+#include "common.h"
+#include "mmres.h"                 /* Ressource IDs */
+#include "mmprogs_defaults.h"
 //#define DEBUG
-#ifdef DEBUG
-void HlpWriteToTrapLog(const char* chrFormat, ...);
-#endif
-
-BOOL IniSaveWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
-BOOL IniRestoreWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
-int IniRestoreInt(char * iniFile, char* chrApp, char *chrKey, int defaultInt);
-BOOL IniSaveInt(char * iniFile, char* chrApp, char *chrKey, int theInt);
-BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
-void freeResHandle();
-HMODULE queryResModuleHandle(char *chrExePath);
-BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
-MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
-SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
-void pmUsage();
-ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
-                  char* title, ULONG ulTitleID, LONG lSizeTitle,
-                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
-
-HBITMAP loadBitmap ( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2);
-VOID DrawBitmap ( HWND hwnd );
-MRESULT EXPENTRY bmpPreviewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
-void showImageControls(HWND hwnd, BOOL bShow);
-
-char logName[]="mmfind.log";
+#include "mmfind.h"                /* mmfind specific defines */
+
+char logName[]="mmfind.log"; /* To keep some (unused) helpers in helper.c happy */
 
 char chrIniFile[CCHMAXPATH];
+char chrInstallDir[CCHMAXPATH];
+
+char chrLastAudioDir[CCHMAXPATH];
+char chrLastVideoDir[CCHMAXPATH];
+char chrLastImageDir[CCHMAXPATH];
+
+/***** For previewing audio tracks *****/
+char chrSourceName[CCHMAXPATH]; /* The audio file to be played */
+BOOL bIsMidi=FALSE;             /* No MIDI support atm */
+BOOL bIsPlaying=FALSE;          /* TRUE if currently playing */
+BOOL bPaused=FALSE;             
+ULONG ulPos;
+ULONG ulTotalLength;
+HWND hwndPlayer;                /* HWND of the player object window used for async coommunication */
+
+/***************************************/
 
 #define NUMPARAMS  1
@@ -105,32 +89,126 @@
 HMODULE RESSOURCEHANDLE=0;
 
-#define numMediaType 3
-#define MT_AUDIO 0
-#define MT_IMAGE 1
-#define MT_VIDEO 2
-#define MT_UNKNOWN 100
-
-char chrMediaFileTypes[numMediaType][100]= {"Audio","Image","Video"};
-char chrMediaFileExt[numMediaType][300]= {"*.AIF;*.AU;*.FLA;*.FLAC;*.IFF;*.MID;*.MP3;*.OGG;*.SND;*.VOC;*.WAV;*._AU",
+char chrMediaFileTypes[NUMMEDIATYPES][100];
+
+char chrMediaFileExt[NUMMEDIATYPES][EXT_STRING_LENGTH]= {"*.AIF;*.AU;*.FLA;*.FLAC;*.IFF;*.MID;*.MP3;*.OGG;*.SND;*.VOC;*.WAV;*._AU",
+                                          /* The image extensions are queried using the imageext.rx and imageadd.rx scripts */
                                           "*.BMP;*.DIB;*.GIF;*.JPG;*.PCX;*.PNG;*.PCD;*.TIF;*.TGA;*.VID;*._IM",
                                           "*.AVI;*.MPG;*.FLI;*.FLC;*.MOV;*.QT;*.VBS"};
+/* Additional audio extensions to be queried during runtime */
+char chrAdditionalExt[200];
+/* This holds the template used when building the audio information text */
+char audioText[255];
+
 int iMediaType=MT_AUDIO;
 
-char audioText[1000]={"Play time:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits per sample:\t%d\n\nChannels:\t%d"};
-
-HAB globalHab;
-
-/* BMP info for preview */
+/* BMP stuff for preview */
 BITMAPINFOHEADER2 bmpInfoHeader2;
 HBITMAP hBitmap;
 
+/* HBITMAP for the play control buttons */
+HBITMAP hbmPlay;
+HBITMAP hbmStop;
+
 FILEDLG fd = { 0 };
 
-void loadStrings(void)
-{
-
-}
-
-void showVideoControls(HWND hwnd, BOOL bShow)
+static void _loadButtonBmps()
+{
+  HPS hps;
+  HMODULE hResource;
+
+  hResource=NULLHANDLE;
+  hps=WinGetPS(HWND_DESKTOP);
+
+  /* Play */  
+  hbmPlay=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
+
+  /* Stop */
+  hbmStop=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
+
+  WinReleasePS(hps);
+}
+
+static void changeButtons(HWND hwnd)
+{
+  HWND hwndTemp;
+  BTNCDATA btCtrl;
+  WNDPARAMS wndParams;
+  ULONG ulStyle;
+
+  if(hbmPlay) {
+    hwndTemp=WinWindowFromID(hwnd, IDPB_MMFINDPLAY);
+
+    /* Change Style to bitmap */
+    ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE);
+    ulStyle|=(BS_BITMAP);
+    ulStyle&=~BS_TEXT;
+    
+    if(WinSetWindowULong(hwndTemp, QWL_STYLE, ulStyle)) {
+      memset(&btCtrl, 0, sizeof(btCtrl));
+      btCtrl.cb=sizeof(btCtrl);
+      btCtrl.hImage=hbmPlay;
+      memset(&wndParams, 0, sizeof(wndParams));
+      wndParams.fsStatus=WPM_CTLDATA;
+      wndParams.cbCtlData=btCtrl.cb;
+      wndParams.pCtlData=&btCtrl;
+      WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS,
+                 MPFROMP(&wndParams),0);
+    }
+  }
+
+  if(hbmStop) {
+    hwndTemp=WinWindowFromID(hwnd, IDPB_MMFINDSTOP);
+    /* Change Style to bitmap */
+    ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE);
+    ulStyle|=(BS_BITMAP);
+    ulStyle&=~BS_TEXT;
+    
+    if(WinSetWindowULong(hwndTemp, QWL_STYLE, ulStyle)) {
+      memset(&btCtrl, 0, sizeof(btCtrl));
+      btCtrl.cb=sizeof(btCtrl);
+      btCtrl.hImage=hbmStop;
+      memset(&wndParams, 0, sizeof(wndParams));
+      wndParams.fsStatus=WPM_CTLDATA;
+      wndParams.cbCtlData=btCtrl.cb;
+      wndParams.pCtlData=&btCtrl;
+      WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS,
+                 MPFROMP(&wndParams),0);
+    }
+  }
+}
+
+static char* translateChars(char * chrString, char chrFrom, char chrTo)
+{
+  char *chr=chrString;
+
+  if(chrTo == '\0' || chrFrom=='\0'|| chrString==NULLHANDLE)
+    return NULLHANDLE;
+
+  while(*chr)
+    {
+      if(*chr==chrFrom)
+        *chr=chrTo;
+
+      chr++;
+    }
+  return chrString;
+}
+
+static void loadStringsFromResourceDLL(HMODULE hResMod)
+{
+  if(!MsgGetMessage(audioText, IDSTR_AUDIOINFOTEXT, sizeof(audioText), hResMod,HWND_DESKTOP))
+    strcpy(audioText, TEXT_INFOTEXT);
+  if(!MsgGetMessage(chrMediaFileTypes[MT_AUDIO], IDSTR_TYPEAUDIO, 
+                 sizeof(chrMediaFileTypes[MT_AUDIO]), hResMod, HWND_DESKTOP))
+    strcpy(chrMediaFileTypes[MT_AUDIO], TEXT_TYPEAUDIO);
+  if(!MsgGetMessage(chrMediaFileTypes[MT_IMAGE], IDSTR_TYPEIMAGE, 
+                 sizeof(chrMediaFileTypes[MT_IMAGE]), hResMod, HWND_DESKTOP))
+    strcpy(chrMediaFileTypes[MT_AUDIO], TEXT_TYPEIMAGE);
+  if(!MsgGetMessage(chrMediaFileTypes[MT_VIDEO], IDSTR_TYPEVIDEO, 
+                 sizeof(chrMediaFileTypes[MT_VIDEO]), hResMod, HWND_DESKTOP))
+    strcpy(chrMediaFileTypes[MT_VIDEO], TEXT_TYPEVIDEO);
+}
+
+static void showVideoControls(HWND hwnd, BOOL bShow)
 {
   /* Preview area */
@@ -140,4 +218,12 @@
 }
 
+
+static void enableAudioPlayControls(HWND hwnd, BOOL bEnable)
+{
+    WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE), bEnable);
+    WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDPLAY), bEnable);
+    WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDSTOP), bEnable);
+}
+
 void showAudioControls(HWND hwnd, BOOL bShow)
 {
@@ -146,8 +232,253 @@
   /* Group box */
   WinShowWindow(WinWindowFromID(hwnd, IDGB_AUDIOINFO), bShow);
-}
-
-
-ULONG mmIdentifyFile(char* chrFile)
+  /* Playcontrols */
+  WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDPLAY), bShow);
+  WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDSTOP), bShow);
+  WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE), bShow);
+  if(bShow) {
+    WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE));
+    WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDPLAY));
+    WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDSTOP));
+    enableAudioPlayControls(hwnd, FALSE);
+  }
+}
+
+BOOL pauseAudioFile(HWND hwndNotify)
+{
+#if 0
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  iWavePriv=ulPid;
+
+  if(bPaused) {
+    sprintf(chrCommand,"RESUME wave%d wait", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=FALSE;
+    showPlayTimeDisplay( hwndFrame, TRUE);
+  }
+  else {
+    sprintf(chrCommand,"PAUSE wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=TRUE;
+  }
+#endif
+  return TRUE;
+}
+
+BOOL stopAudioFile(HWND hwndNotify)
+{
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  if(bIsPlaying) {
+    sprintf(chrCommand,"stop wave%ld wait", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    
+    sprintf(chrCommand,"close wave%ld wait", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+#if 0    
+    _resetDisplay(hwndFrame);
+    showPlayTimeDisplay( hwndFrame, TRUE);
+    WinStopTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY);
+#endif
+    bIsPlaying=FALSE;
+    bPaused=FALSE;  
+  }
+
+  return TRUE;
+}
+
+ULONG playAudioFile(HWND hwndFrame)
+{
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30];
+  char retMsg[20];
+  ULONG rc;
+  int iTime2;
+  HWND hwndNotify;
+
+  hwndNotify=hwndFrame;//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
+
+  if(bPaused)
+    {
+      pauseAudioFile(hwndFrame);
+      return 1;
+    }
+
+  ulPos=0;
+
+  stopAudioFile(hwndFrame);
+
+  if(bIsMidi)
+    strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice));
+  else
+    strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
+
+  /* Start audio file */  
+  sprintf(chrCommand,"open \"%s\"  type %s alias wave%ld SHAREABLE wait", chrSourceName, chrDevice, hwndNotify);
+
+
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
+    return 0;
+  
+  /* Set time format */
+  sprintf(chrCommand,"SET wave%ld TIME FORMAT MILLISECONDS wait", hwndNotify);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%ld wait", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }      
+
+#if 0
+  sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  /* Get wave length in ms */
+  iTime2=0;
+  sprintf(chrCommand,"STATUS wave%ld LENGTH WAIT", hwndNotify);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    iTime2=atoi(retMsg);
+    sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
+            0, 0,
+            iTime2/1000/60,(iTime2/1000)%60);
+  }
+  ulTotalLength=iTime2;
+
+#if 0
+  /* Set volume */
+  sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld wait", hwndFrame, ulVolume);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  sprintf(chrCommand,"play wave%ld FROM 0", hwndNotify);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%ld", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+#if 0
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY, PLAYTIMER_DELAY);
+#endif
+
+  bIsPlaying=TRUE;
+
+  return 1;
+}
+
+static MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+
+        HWND hwndFrame=HWNDFROMMP(mp2);
+        switch(LONGFROMMP(mp1))
+          {
+          case PLAY_FILE:
+            playAudioFile(hwndFrame);
+            break;
+          case STOP_TRACK:
+            stopAudioFile(hwndFrame);
+            break;
+          case PAUSE_TRACK:
+            pauseAudioFile(hwndFrame);
+            break;
+          default:
+            break;
+          }
+        return (MRESULT)0;
+      }
+    case WM_CLOSE:
+
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/* Every folder has one running play thread to handle play commands */
+void _Optlink playThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  HWND hwndNotify=(HWND)arg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      HWND hwndPlayObject;
+      hwndPlayObject=WinCreateWindow(HWND_OBJECT,WC_STATIC,"MMAudioPlayObj",
+                                     0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
+      if(hwndPlayObject) {
+        WinSubclassWindow(hwndPlayObject,&playObjectProc);
+        /* Window created. */
+        WinPostMsg(hwndNotify, WM_APPTERMINATENOTIFY, MPFROMSHORT(MMAUDIO_PLAYER_CREATED),
+                   MPFROMHWND(hwndPlayObject));
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+          WinDispatchMsg(hab,&qmsg);
+
+        WinDestroyWindow(hwndPlayObject);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+
+void MMAudioPlayFile(HWND hwndPlayer, HWND hwndNotify, char* chrFile)
+{
+  WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(PLAY_FILE), MPFROMHWND(hwndNotify));
+}
+
+void MMAudioStop(HWND hwndPlayer, HWND hwndNotify)
+{
+  WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(STOP_TRACK), MPFROMHWND(hwndNotify));
+}
+
+void MMAudioPause(HWND hwndPlayer, HWND hwndNotify)
+{
+  WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(PAUSE_TRACK), MPFROMHWND(hwndNotify));
+}
+
+BOOL MMAudioOpenPlayer(HWND hwndNotify)
+{
+  if(-1==_beginthread(playThreadFunc,NULL,8192*16, (void*)hwndNotify))
+    return FALSE; /* Error occured */
+
+  return TRUE;
+}
+
+void MMAudioClosePlayer(HWND hwndPlayer)
+{
+  WinSendMsg(hwndPlayer, WM_QUIT, 0, 0);
+  return;
+}
+
+static ULONG mmIdentifyFile(char* chrFile)
 {
   MMIOINFO mmioInfo={0};
@@ -155,5 +486,4 @@
   FOURCC fourCC;
 
-  //  SysWriteToTrapLog("%s\n", chrFile);
   if(MMIO_SUCCESS!=mmioIdentifyFile(chrFile, &mmioInfo, &mmFormatInfo, &fourCC, 0,0))
     {
@@ -178,4 +508,16 @@
 }
 
+static PSZ queryExeDir(const char *chrEXE)
+{
+  if(chrInstallDir[0]==0)
+    {
+      char * chr;
+      strlcpy(chrInstallDir, chrEXE, sizeof(chrInstallDir));
+      if((chr=strrchr(chrInstallDir, '\\'))!=NULLHANDLE)
+        *chr='\0';
+    }
+  return chrInstallDir;
+}
+
 
 MRESULT findFileDlgProc(HWND hwnd, ULONG  msg, MPARAM mp1, MPARAM mp2)
@@ -187,4 +529,6 @@
       {
         int a;
+        SWCNTRL swctl;
+        PID pid;
 
         /* Set dialog font */
@@ -195,5 +539,5 @@
         }
         /* Fill combo box with media types (audio, image, video) */
-        for(a=0;a<numMediaType;a++) 
+        for(a=0;a<NUMMEDIATYPES;a++) 
           WinSendMsg(WinWindowFromID(hwnd, IDCB_TYPEOFFILE), LM_INSERTITEM, MRFROMSHORT(LIT_SORTASCENDING), 
                      MPFROMP(chrMediaFileTypes[a]));
@@ -202,5 +546,35 @@
         /* Subclass preview area */
         WinSubclassWindow(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), bmpPreviewProc);
+
+        /* Add switch entry */
+        memset(&swctl,0,sizeof(swctl));
+        WinQueryWindowProcess(hwnd,&pid,NULL);
+        swctl.hwnd=hwnd;
+        swctl.uchVisibility=SWL_VISIBLE;
+        swctl.idProcess=pid;
+        swctl.bProgType=PROG_DEFAULT;
+        swctl.fbJump=SWL_JUMPABLE;
+        WinAddSwitchEntry(&swctl);
+
+        /* Add bitmap to play control buttons */
+        changeButtons(hwnd);
+
+        /* Start an audio player thread */
+        MMAudioOpenPlayer(hwnd);
         break;
+      }
+    case WM_APPTERMINATENOTIFY:
+      {
+        /* Posted from player object window */
+        switch(SHORT1FROMMP(mp1))
+          {
+          case MMAUDIO_PLAYER_CREATED:
+            /* Player object window */
+            hwndPlayer=HWNDFROMMP(mp2);
+            break;
+          default:
+            break;
+          }
+        return MRFALSE;
       }
     case WM_CONTROL:
@@ -215,5 +589,5 @@
                 WinQueryWindowText(HWNDFROMMP(mp2), sizeof(chrText), chrText);
                 /* Find Index */
-                for(a=0; a<numMediaType;a++) {
+                for(a=0; a<NUMMEDIATYPES;a++) {
                   if(!stricmp(chrMediaFileTypes[a], chrText))
                     break;
@@ -234,5 +608,5 @@
                     showVideoControls(hwnd, FALSE);
                     showImageControls(hwnd, TRUE);
-                      iMediaType=MT_IMAGE;
+                    iMediaType=MT_IMAGE;
                     break;
                   case 2:
@@ -249,5 +623,4 @@
                 WinSendMsg(WinWindowFromID(hwnd, 258), WM_CHAR,
                            MPFROM2SHORT(KC_VIRTUALKEY , 0), MPFROM2SHORT(0, VK_NEWLINE));
-
               }
             break;
@@ -256,5 +629,5 @@
             {
               if(SHORT2FROMMP(mp1)==EN_CHANGE)
-                WinStartTimer(globalHab, hwnd, TIMERID_SELECTION, 100);
+                WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, TIMERID_SELECTION, 100);
               break;
             }
@@ -272,9 +645,23 @@
             char chrFullName[CCHMAXPATH*2];
 
-            WinStopTimer(globalHab, hwnd, TIMERID_SELECTION);
+            WinStopTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, TIMERID_SELECTION);
             WinQueryWindowText(WinWindowFromID(hwnd, 258), sizeof(chrName), chrName);
             strcpy(chrFullName, fd.szFullFile);
+            switch(iMediaType)
+              {
+              case MT_AUDIO:
+                strlcpy(chrLastAudioDir, fd.szFullFile, sizeof(chrLastAudioDir));
+                break;
+              case MT_IMAGE:
+                strlcpy(chrLastImageDir, fd.szFullFile, sizeof(chrLastImageDir));
+                break;
+              case MT_VIDEO:
+                strlcpy(chrLastImageDir, fd.szFullFile, sizeof(chrLastImageDir));
+                break;
+              default:
+                break;
+              }
             strcat(chrFullName, chrName);
-
+            strlcpy(chrSourceName, chrFullName, sizeof(chrSourceName));
             switch(iMediaType)
               {
@@ -289,4 +676,6 @@
                   ULONG ulPlaySecs;
 
+                  MMAudioStop(hwndPlayer, hwnd);
+
                   memset(&mmio,0, sizeof(mmio));
                   mmio.ulFlags=MMIO_READ;
@@ -304,15 +693,15 @@
                   if(rc!=MMIO_SUCCESS) {
                     WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), "");
+                    enableAudioPlayControls(hwnd, FALSE);
                     break;
                   }
 
                   ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000;
-                  sprintf(text, audioText,
-                          ulPlaySecs/60, ulPlaySecs%60,
+                  sprintf(text, audioText,  ulPlaySecs/60, ulPlaySecs%60,
                           mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec,
                           mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample,
                           mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels);
                   WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), text);
-                  
+                  enableAudioPlayControls(hwnd, TRUE);
                   break;
                 }
@@ -320,10 +709,12 @@
                 if(hBitmap) {
                   HBITMAP hBitmapTemp;
-                  hBitmapTemp=loadBitmap (chrFullName, &bmpInfoHeader2);            
+                  //                  hBitmapTemp=loadBitmap (chrFullName, &bmpInfoHeader2);
+                  hBitmapTemp=ImgLoadImageFileAndHeader(chrFullName, &bmpInfoHeader2);
                   GpiDeleteBitmap(hBitmap);
                   hBitmap=hBitmapTemp;
                 }
                 else
-                  hBitmap=loadBitmap (chrFullName, &bmpInfoHeader2);
+                  hBitmap=ImgLoadImageFileAndHeader(chrFullName, &bmpInfoHeader2);
+                  //                  hBitmap=loadBitmap (chrFullName, &bmpInfoHeader2);
                 /* Force redraw of preview area */
                 WinInvalidateRect(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), NULLHANDLE, FALSE);
@@ -342,7 +733,27 @@
       switch(SHORT1FROMMP(mp1))
         {
+        case IDPB_MMFINDPLAY:
+          {
+          MMAudioPlayFile(hwndPlayer, hwnd, NULLHANDLE);
+          return MRFALSE;
+          }
+        case IDPB_MMFINDSTOP:
+          {
+          MMAudioStop(hwndPlayer, hwnd);
+          return MRFALSE;
+          }
+        case IDPB_MMFINDPAUSE:
+          {
+          MMAudioPause(hwndPlayer, hwnd);
+          return MRFALSE;
+          }
         case IDPB_NEWFILE: /* New */
           {
             HOBJECT hObject;
+
+            MMAudioStop(hwndPlayer, hwnd);
+            MMAudioClosePlayer(hwndPlayer);
+
+            /* Open the MM templates folder */
             if((hObject=WinQueryObject("<MMPM2_MMTEMPLATEFOLDER>"))!=NULLHANDLE) {
               WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
@@ -350,9 +761,13 @@
             }
             else
-              showMessageBox2(hwnd, IDSTR_NOMMTEMPLATEFLDRTITLE, IDSTR_NOMMTEMPLATEFLDR, RESSOURCEHANDLE, MB_MOVEABLE|MB_OK);
-
+              MsgShowMessageBox(hwnd, IDSTR_NOMMTEMPLATEFLDRTITLE, IDSTR_NOMMTEMPLATEFLDR,
+                                RESSOURCEHANDLE, MB_MOVEABLE|MB_OK);
             return MRFALSE;
           }
         default:
+          //          MMAudioStop(hwndPlayer, hwnd);
+          stopAudioFile(hwnd);
+          MMAudioClosePlayer(hwndPlayer);
+          // DosSleep(1000);
           break;
         }
@@ -363,4 +778,156 @@
 }
 
+BOOL getStringFromRexxScript(PSZ pszBinDir, PSZ rexxFile, char* chrResult, ULONG ulSize)
+{
+
+  RXSTRING arg[1];                    /* argument string for REXX  */
+  RXSTRING rexxretval;                /* return value from REXX    */
+  APIRET   rc;                        /* return code from REXX     */
+  SHORT    rexxrc = 0;                /* return code from function */
+  char theScript[CCHMAXPATH];  
+  /* By setting the strlength of the output RXSTRING to zero, we   */
+  /* force the interpreter to allocate memory and return it to us. */
+  /* We could provide a buffer for the interpreter to use instead. */
+  rexxretval.strlength = 0L;          /* initialize return to empty*/
+    
+  sprintf(theScript, "%s\\%s", pszBinDir, rexxFile);
+
+  /* Here we call the interpreter.  We don't really need to use    */
+  /* all the casts in this call; they just help illustrate         */
+  /* the data types used.                                          */
+  rc=RexxStart((LONG)       0,             /* number of arguments   */
+               (PRXSTRING)  &arg,          /* array of arguments    */
+               (PSZ)        theScript,     /* name of REXX file     */
+               (PRXSTRING)  0,             /* No INSTORE used       */
+               (PSZ)        "CWRXX",       /* Command env. name     */
+               (LONG)       RXSUBROUTINE,  /* Code for how invoked  */
+               (PRXSYSEXIT) 0,             /* No EXITs on this call */
+               (PSHORT)     &rexxrc,       /* Rexx program output   */
+               (PRXSTRING)  &rexxretval ); /* Rexx program output   */
+#if 0
+  if(rc) {
+    sprintf(text,"Error in the Rexx skript %s\n\n Get more information with 'help REX%04d'.\n", 
+            tPt->rexxSkript, rc*-1);
+    WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_OK|MB_MOVEABLE|MB_ERROR);
+  }
+#endif
+  if(!rc) {
+    if(ulSize>rexxretval.strlength) {
+      strncpy(chrResult, rexxretval.strptr, rexxretval.strlength);
+      chrResult[rexxretval.strlength]=0;
+    }
+    else
+      strncpy(chrResult, rexxretval.strptr, ulSize);
+    chrResult[ulSize-1]=0;
+  }
+  if(rexxretval.strptr)
+    DosFreeMem(rexxretval.strptr);          /* Release storage given to us by REXX.  */      
+  if(!rc)
+    return TRUE;
+  else
+    return FALSE;
+}
+/*
+  This function checks the installed image IO procs and adds extensions which are not yet handled
+  to the list of known extensions.
+ */
+static BOOL getMissingExtFromImageIOProc(char *chrMMImageKnownExt, ULONG ulSize)
+{
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    void * memPtr;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG lNumIOProcs;
+
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+    
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_IMAGE;
+    mmFormatInfo.ulFlags|=MMIO_CANREADTRANSLATED;/* Read !!!*/    
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+    
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         * Error - mmioQueryFormatCount failed.
+         */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    memPtr=pmmFormatInfoArray;
+    if( pmmFormatInfoArray == NULL )
+      {
+        /*
+         * Could not allocate enough memory for mmFormatInfo array.
+         */
+        return FALSE;
+      }
+    
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+    
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    for ( index = 0; index <lNumIOProcs; index++ )
+      {
+        /* Now scan the whole image proc array */
+        if(!strstr(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+          /* This extension is yet unknown */
+          if(chrMMImageKnownExt[0]==0) {
+            /* It's the first one */
+            sprintf(chrMMImageKnownExt,"*.%s", pmmFormatInfoArray->szDefaultFormatExt);
+          }
+          else {
+            /* Check if the extension is not already added (e.g. TIF has a lot of subformats) */
+            if(!strstr(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+              strlcat(chrMMImageKnownExt,";*.", ulSize);
+              strlcat(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt, ulSize);
+            }
+          }
+        }  
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */        
+        pmmFormatInfoArray++;
+      }
+    free(memPtr);
+    return FALSE;
+}
+
+
 int main (int argc, char *argv[])
 {
@@ -370,9 +937,6 @@
   short a;
 
-  //  FILEDLG fd = { 0 };
-
   /* Create a copy of the args */
   /* argv[0]: progname
-   * argv[1]: audio file
    */
 
@@ -394,33 +958,78 @@
       }
       else {
-        HWND hwndDlg;
+        HWND hwndDlg;       
 
         /* Get our ressource dll */  
         RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+        /* Load NLV strings */
+        loadStringsFromResourceDLL(RESSOURCEHANDLE);
+
         /* Get data from INI file */
         HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
 
-        globalHab=WinQueryAnchorBlock(HWND_DESKTOP);
-
+        /* Get additional audio extensions from mmpm2.ini */
+        getStringFromRexxScript(queryExeDir(argv[0]), "audioext.rx",
+                                chrAdditionalExt, sizeof(chrAdditionalExt));
+        if(strlen(chrAdditionalExt)!=0) {
+          translateChars(chrAdditionalExt, ',', ';');
+          strlcat(chrMediaFileExt[MT_AUDIO], ";", sizeof(chrMediaFileExt[MT_AUDIO]));
+          strlcat(chrMediaFileExt[MT_AUDIO], chrAdditionalExt, sizeof(chrMediaFileExt[MT_AUDIO]));
+        }
+
+        /* Get image extensions */
+        getStringFromRexxScript(queryExeDir(argv[0]), "imageext.rx",
+                                chrMediaFileExt[MT_IMAGE], sizeof(chrMediaFileExt[MT_IMAGE]));
+        if(strlen(chrMediaFileExt[MT_IMAGE])!=0)
+          translateChars(chrMediaFileExt[MT_IMAGE], ',', ';');
+        /* Get additional image extensions supplied by the user in imageadd.rx */
+        chrAdditionalExt[0]=0;
+        getStringFromRexxScript(queryExeDir(argv[0]), "imageadd.rx",
+                                chrAdditionalExt, sizeof(chrAdditionalExt));
+        if(strlen(chrAdditionalExt)!=0) {
+          translateChars(chrAdditionalExt, ',', ';');
+          strlcat(chrMediaFileExt[MT_IMAGE], ";", sizeof(chrMediaFileExt[MT_IMAGE]));
+          strlcat(chrMediaFileExt[MT_IMAGE], chrAdditionalExt, sizeof(chrMediaFileExt[MT_IMAGE]));
+        }
+        /* Get extensions handled by installed IO procs */
+        getMissingExtFromImageIOProc(chrMediaFileExt[MT_IMAGE], sizeof(chrMediaFileExt[MT_IMAGE]));
+
+#if 0
+        sprintf(chrInstallDir, "%d!%s!", strlen(chrMediaFileExt[MT_IMAGE]), chrMediaFileExt[MT_IMAGE]);
+        WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrInstallDir, chrMediaFileExt[MT_IMAGE], 1234, MB_OK);
+#endif
+
+        /* Restore recent visited directories */
+        PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastaudiodir", "", chrLastAudioDir, sizeof(chrLastAudioDir));
+        PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastvideodir", "", chrLastVideoDir, sizeof(chrLastVideoDir));
+        PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastimagedir", "", chrLastImageDir, sizeof(chrLastImageDir));
+
+        _loadButtonBmps();
         fd.cbSize = sizeof( fd );
         /* It's an centered 'Open'-dialog */
         fd.fl = FDS_OPEN_DIALOG|FDS_CENTER | FDS_CUSTOM;
-        /* Title: "Search CDRecord/2" */
-        //getMessage(text,IDSTR_FDLGSEARCHCDRDAOTITLE,sizeof(text), hSettingsResource,hwnd);
-        /* Set the title of the file dialog */
-        //fd.pszTitle = text;
-        //        fd.pszTitle = "Find file";
-        /* Only show *.wav files */
-        sprintf(fd.szFullFile,"%s","*.wav");
         fd.hMod=RESSOURCEHANDLE;
         fd.usDlgId=IDDLG_MMFIND;
         fd.pfnDlgProc=findFileDlgProc;
-        //SysWriteToTrapLog("%x\n", fd.hMod);
+
+
+        switch(iMediaType)
+          {
+          case MT_AUDIO:
+            strlcpy(fd.szFullFile, chrLastAudioDir, sizeof(fd.szFullFile));
+            break;
+          case MT_IMAGE:
+            strlcpy(fd.szFullFile, chrLastImageDir, sizeof(fd.szFullFile));
+            break;
+          case MT_VIDEO:
+            strlcpy(fd.szFullFile, chrLastVideoDir, sizeof(fd.szFullFile));
+            break;
+          default:
+            break;
+          }
+
         if( (hwndDlg=WinFileDlg( HWND_DESKTOP, HWND_DESKTOP, &fd )) != NULLHANDLE )
           {
-            /* Set dialog font to WarpSans for Warp 4 and above */
             if(hBitmap)
-              GpiDeleteBitmap(hBitmap);
-  
+              GpiDeleteBitmap(hBitmap);  
             if( fd.lReturn == DID_OK )
               {
@@ -437,12 +1046,9 @@
                     {
                       HOBJECT hObject;
-                      char *chr;
+
+                      /* Open the audio file in the editor */
                       if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
-                        WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
-                      if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
-                        *chr=0;
-                        if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
-                          WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
-                      }
+                        WinOpenObject(hObject, ID_MENU_EDITOR, TRUE);
+                      // WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
                       break;
                     }
@@ -452,5 +1058,7 @@
                       char *chr;
                       if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
-                        WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
+                        WinOpenObject(hObject, ID_MENU_PLAYER /* OPEN_DEFAULT */, TRUE);
+#if 0
+                      /* Open folder */
                       if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
                         *chr=0;
@@ -458,4 +1066,5 @@
                           WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
                       }
+#endif
                       break;
                     }
@@ -464,6 +1073,4 @@
                       HOBJECT hObject;
                       char *chr;
-                      //if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
-                      // WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
                       if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
                         *chr=0;
@@ -475,6 +1082,10 @@
                   }/* switch()*/
               }/* DID_OK */
-          }
-        //        freeResHandle();
+            /* Save the last visited directories */
+            PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastaudiodir", chrLastAudioDir);
+            PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastvideodir", chrLastVideoDir);
+            PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastimagedir", chrLastImageDir);
+          }
+        freeResHandle();
       }
       WinDestroyMsgQueue(hmq);
Index: trunk/classes/mm-progs/mmfind/mmfind.h
===================================================================
--- trunk/classes/mm-progs/mmfind/mmfind.h	(revision 4)
+++ trunk/classes/mm-progs/mmfind/mmfind.h	(revision 4)
@@ -0,0 +1,60 @@
+/* Bitmap IDs for the play controls */
+#define IDBMP_PLAY 1
+#define IDBMP_STOP 2
+
+/* Fallbacks if strings can't be loaded */
+#define TEXT_TYPEAUDIO "Audio"
+#define TEXT_TYPEIMAGE "Image"
+#define TEXT_TYPEVIDEO "Video"
+#define TEXT_INFOTEXT  "Play time:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits per sample:\t%d\n\nChannels:\t%d"
+/* Max. length of the string holding all our extensions */
+#define EXT_STRING_LENGTH 300
+
+/* Media types we support for searching */
+#define NUMMEDIATYPES 3
+#define MT_AUDIO 0
+#define MT_IMAGE 1
+#define MT_VIDEO 2
+#define MT_UNKNOWN 100
+
+#define MMAUDIO_PLAYER_CREATED 0x0001
+#define PLAY_FILE   0x0001
+#define STOP_TRACK   0x0002
+#define PAUSE_TRACK   0x0003
+
+#ifndef OPEN_DEFAULT 
+/*  Open views for the wpOpen() method */
+      #define OPEN_UNKNOWN      -1
+      #define OPEN_DEFAULT       0
+      #define OPEN_CONTENTS      1
+      #define OPEN_SETTINGS      2
+      #define OPEN_HELP          3
+      #define OPEN_RUNNING       4
+      #define OPEN_PROMPTDLG     5
+      #define OPEN_PALETTE       121                                   /*SPLIT*/
+      #define OPEN_USER          0x6500
+#endif
+
+/* Timer IDs */
+#define TIMERID_SELECTION 1
+#define IDTIMER_PLAY      2
+
+/* Defines used for audio playing */
+#define MMAUDIO_PLAYER_CREATED 0x0001
+#define PLAY_FILE   0x0001
+#define STOP_TRACK   0x0002
+#define PAUSE_TRACK   0x0003
+
+/* Function prototypes */
+#ifdef DEBUG
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+#endif
+
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
+void freeResHandle();
+HMODULE queryResModuleHandle(char *chrExePath);
+void pmUsage();
+VOID DrawBitmap ( HWND hwnd );
+void showImageControls(HWND hwnd, BOOL bShow);
+
+MRESULT EXPENTRY bmpPreviewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
Index: trunk/classes/mm-progs/mmfind/mmfind.rc
===================================================================
--- trunk/classes/mm-progs/mmfind/mmfind.rc	(revision 3)
+++ trunk/classes/mm-progs/mmfind/mmfind.rc	(revision 4)
@@ -2,4 +2,6 @@
    #include <os2.h>
 #endif
+#include "mmfind.h"
 
-rcinclude mmfind.dlg
+BITMAP IDBMP_PLAY  "./bmp/play.bmp"
+BITMAP IDBMP_STOP  "./bmp/stop.bmp"
Index: trunk/classes/mm-progs/mmprog.inc
===================================================================
--- trunk/classes/mm-progs/mmprog.inc	(revision 4)
+++ trunk/classes/mm-progs/mmprog.inc	(revision 4)
@@ -0,0 +1,24 @@
+# MM-prog specific makefile include
+
+CC           	=	 gcc
+CPPFLAGS     	=	 -O -Wall -Zomf -Zmt -Zsys -s
+#CPPFLAGS     	= -O -Zomf -Zcrtdll -Zmtd -s
+
+INC		= ../include -I ../../../classes/inc -I $(COMMONSRC)/include
+LIB_DIR      	= $d:/emx/lib 
+TOOLDIR		=	 .\..
+LIBDIR		=	 ../lib
+DEFS         	= 
+PROGS        	=  
+ODIR		=
+CPPDIR		=
+
+$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c 
+	$(CC) -c -Wall -o$@ -Zomf -I$(INC) $<  
+
+%.obj:	%.c
+	$(CC) -c -Wall -o$@ -Zomf -I$(INC) $<  
+
+
+#distribution:
+	
Index: trunk/classes/mm-progs/volume/classvolume.DEF
===================================================================
--- trunk/classes/mm-progs/volume/classvolume.DEF	(revision 3)
+++ trunk/classes/mm-progs/volume/classvolume.DEF	(revision 4)
@@ -1,7 +1,11 @@
-; DEF-file for classvol.exe. This is a PM program which 
-; controls the volume of playing audio objects.
 ;
-;                    (C) Chris Wohlgemuth 2003
-
+; CLASSVOL: PM-Program for volume control
+;
+;
+;    (c) Chris Wohlgemuth 2003-2005
+;
+;
+; Created 14 Aug 2005 21:06:17
+;
 ;/*
 ; * This program is free software; you can redistribute it and/or modify
@@ -26,8 +30,4 @@
 ; */
 NAME CLASSVOL WINDOWAPI
-DESCRIPTION '$@#(c) Chris Wohlgemuth :V0.2.7 (17.08.2003) ()#@PM-Program for volume control'
+DESCRIPTION '$@#(c) C. Wohlgemuth 2005:0.2        #@##1## 14/08/05 21:06:17        My ;-)     ::::9::@@PM-Program for volume control V0.2.9'
 STACKSIZE    1638400
-
-
-
-
Index: trunk/classes/mm-progs/volume/def.tpl
===================================================================
--- trunk/classes/mm-progs/volume/def.tpl	(revision 4)
+++ trunk/classes/mm-progs/volume/def.tpl	(revision 4)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM-Program for volume control
+
+[COPYRIGHT]
+(c) Chris Wohlgemuth 2003
+
+[AUTHOR]
+(c) C. Wohlgemuth
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME CLASSVOL WINDOWAPI
+
+[BUILDMACHINE]
+My ;-)
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: trunk/classes/mm-progs/volume/license.txt
===================================================================
--- trunk/classes/mm-progs/volume/license.txt	(revision 4)
+++ trunk/classes/mm-progs/volume/license.txt	(revision 4)
@@ -0,0 +1,21 @@
+/*
+ * 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, 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; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
Index: trunk/classes/mm-progs/volume/makefile
===================================================================
--- trunk/classes/mm-progs/volume/makefile	(revision 3)
+++ trunk/classes/mm-progs/volume/makefile	(revision 4)
@@ -3,39 +3,29 @@
 include ../../../make.inc
 
-CC           = gcc
-LIB_DIR      = $d:/emx/lib 
-#CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
-#CPPFLAGS     = -O -Zomf -Zcrtdll -Zmtd -s
-CPPFLAGS     = -O -Wall -Zomf -Zmt -Zsys -s
-INC		= ../include -I ../../../classes/inc -I ../../../common_functions/include
-DEFS         = 
-PROGS        =  
-ODIR		= .
-CPPDIR	= .
-LIBDIR	=	../lib
-OBJECTS	=	$(LIBDIR)/message.obj $(LIBDIR)/helper.obj $(LIBDIR)/menu_funcs.obj $(LIBDIR)/sys_funcs.obj
-OBJS2		=	 customprocs.obj
-# display.obj
+# MM-progs specific makefile include
+include ../mmprog.inc
 
+OBJECTS		=	$(LIBDIR)/message.obj \
+			$(LIBDIR)/helper.obj \
+			$(LIBDIR)/menu_funcs.obj \
+			$(LIBDIR)/sys_funcs.obj
+OBJS2		=	customprocs.obj
 
 all:	classvol.exe
 
-$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c 
-	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
-
-%.obj:	%.c
-	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
-
-classvol.exe:	classvol.c $(OBJECTS) $(OBJS2) makefile
+classvol.exe:	classvol.c $(OBJECTS) $(OBJS2) makefile def.tpl
+	cmd /C $(TOOLDIR)\create_MMPROG_def.cmd classvolume.def
 #Use this command to link dynamicaly
-	gcc $(CPPFLAGS) -I$(INC) classvol.c $(OBJECTS) $(OBJS2) -los2me classvolume.def
+	$(CC) $(CPPFLAGS) -I$(INC) classvol.c $(OBJECTS) $(OBJS2) -los2me classvolume.def
 	rc classvolume.rc classvol.exe
 
 
+	
 clean:
 	-rm *.exe
+	-rm *.dll
 	-rm *.obj
+	-rm *.res
 	-rm *.ini
-	-rm *.res
 
 cleaner:
@@ -43,5 +33,4 @@
 	-rm *.flc
 
+
 distribution:
-	
-
Index: trunk/classes/res/common_res/Readme.txt
===================================================================
--- trunk/classes/res/common_res/Readme.txt	(revision 4)
+++ trunk/classes/res/common_res/Readme.txt	(revision 4)
@@ -0,0 +1,3 @@
+These ressources are bound to the class DLL. They
+contain the icons for the objects but no language
+dependend strings.
Index: trunk/classes/res/de/cwaudio_de.rc
===================================================================
--- trunk/classes/res/de/cwaudio_de.rc	(revision 3)
+++ trunk/classes/res/de/cwaudio_de.rc	(revision 4)
@@ -69,6 +69,6 @@
 STRINGTABLE 
 BEGIN
-ID_WAVEINFOPAGENAME "~Audio Information"
-ID_ID3TAGSPAGENAME  "~ID3 Tags"
+ID_WAVEINFOPAGENAME "~Audio-Information"
+ID_ID3TAGSPAGENAME  "~ID3-Tags"
 ID_TRACKNAMEPAGENAME "~Trackname"
 IDSTR_TRACKNAME      "Trackname"
Index: trunk/classes/res/de/cwimage_de.rc
===================================================================
--- trunk/classes/res/de/cwimage_de.rc	(revision 3)
+++ trunk/classes/res/de/cwimage_de.rc	(revision 4)
@@ -26,5 +26,5 @@
 IDSTR_CWIMAGETITLE  "Digitales Bild"
 
-IDSTR_IMAGEINFOPAGENAME "~Bild Information"
+IDSTR_IMAGEINFOPAGENAME "~Bild-Information"
 IDSTR_SPRINTFPIXEL	"%d Pixel"
 IDSTR_SPRINTFBIT       "%d Bit"
Index: trunk/classes/res/de/makefile
===================================================================
--- trunk/classes/res/de/makefile	(revision 3)
+++ trunk/classes/res/de/makefile	(revision 4)
@@ -4,5 +4,5 @@
 include ../../../build.inc
 
-LANGUAGE	=	_DE
+LANGUAGE	=	_de
 
 CC           = icc
@@ -27,4 +27,5 @@
 		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
 		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
 #		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
 
Index: trunk/classes/res/de/mmfind_de.dlg
===================================================================
--- trunk/classes/res/de/mmfind_de.dlg	(revision 3)
+++ trunk/classes/res/de/mmfind_de.dlg	(revision 4)
@@ -37,7 +37,11 @@
         CTEXT           "Keine Vorschau verfgbar", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
                         DT_WORDBREAK | NOT WS_VISIBLE
-        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT 
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
                         WS_VISIBLE
         GROUPBOX        "Audio-Information", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
         DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
         PUSHBUTTON      "~Neu...", IDPB_NEWFILE, 46, 2, 40, 12
Index: trunk/classes/res/de/mmfind_de.rc
===================================================================
--- trunk/classes/res/de/mmfind_de.rc	(revision 3)
+++ trunk/classes/res/de/mmfind_de.rc	(revision 4)
@@ -8,5 +8,5 @@
 IDSTR_TYPEIMAGE       "Bilddatei"
 IDSTR_TYPEVIDEO       "Videodatei"
-IDSTR_AUDIOINFOTEXT   "Spielzeit:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits pro Sample:\t%d\n\nKanle:\t%d"
+IDSTR_AUDIOINFOTEXT   "Spielzeit:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits pro Sample:\t%d\x0a\x0aKanle:\t\t%d"
 IDSTR_NOMMTEMPLATEFLDRTITLE "Fehler bei Dateierstellung"
 IDSTR_NOMMTEMPLATEFLDR "Multimedia-Schablonenordner kann nicht gefunden werden. Mglicherweise ist die Objekt-ID <MMPM2_MMTEMPLATEFOLDER> verloren gegangen."
Index: trunk/classes/res/en/mmfind_en.dlg
===================================================================
--- trunk/classes/res/en/mmfind_en.dlg	(revision 3)
+++ trunk/classes/res/en/mmfind_en.dlg	(revision 4)
@@ -37,7 +37,11 @@
         CTEXT           "No preview available", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
                         DT_WORDBREAK | NOT WS_VISIBLE
-        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT 
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
                         WS_VISIBLE
         GROUPBOX        "Audio info", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
         DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
         PUSHBUTTON      "~New...", IDPB_NEWFILE, 46, 2, 40, 12
Index: trunk/classes/res/en/mmfind_en.rc
===================================================================
--- trunk/classes/res/en/mmfind_en.rc	(revision 3)
+++ trunk/classes/res/en/mmfind_en.rc	(revision 4)
@@ -8,5 +8,5 @@
 IDSTR_TYPEIMAGE       "Image"
 IDSTR_TYPEVIDEO       "Video"
-IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits per sample:\t%d\n\nChannels:\t%d"
+IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits per sample:\t%d\x0a\x0aChannels:\t%d"
 IDSTR_NOMMTEMPLATEFLDRTITLE "Error during file creation"
 IDSTR_NOMMTEMPLATEFLDR "Multimedia template folder can't be found. It may has lost the object ID <MMPM2_MMTEMPLATEFOLDER>."
Index: trunk/classes/res/it/mmfind_it.dlg
===================================================================
--- trunk/classes/res/it/mmfind_it.dlg	(revision 3)
+++ trunk/classes/res/it/mmfind_it.dlg	(revision 4)
@@ -38,7 +38,11 @@
         CTEXT           "Anteprima non disponibile", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33,
                         DT_WORDBREAK | NOT WS_VISIBLE
-        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT
                         WS_VISIBLE
         GROUPBOX        "Informazioni audio", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
         DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
         PUSHBUTTON      "~Nuovo", IDPB_NEWFILE, 46, 2, 40, 12
Index: trunk/classes/res/it/mmfind_it.rc
===================================================================
--- trunk/classes/res/it/mmfind_it.rc	(revision 3)
+++ trunk/classes/res/it/mmfind_it.rc	(revision 4)
@@ -8,5 +8,5 @@
 IDSTR_TYPEIMAGE       "Immagine"
 IDSTR_TYPEVIDEO       "Video"
-IDSTR_AUDIOINFOTEXT   "Tempo trascorso:\t%02d:%02d\n\nFrequenza campionamento:\t%d\n\nBit per campione:\t%d\n\nCanali:\t%d"
+IDSTR_AUDIOINFOTEXT   "Tempo trascorso:\t%02d:%02d\x0a\x0aFrequenza campionamento:\t%d\x0a\x0aBit per campione:\t%d\x0a\x0aCanali:\t%d"
 IDSTR_NOMMTEMPLATEFLDRTITLE "Errore durante la creazione del file"
 IDSTR_NOMMTEMPLATEFLDR "Impossibile trovare il modello per la cartella multimedia. Potrebbe essersi persa la ID oggetto <MMPM2_MMTEMPLATEFOLDER>."
Index: trunk/classes/res/makefile
===================================================================
--- trunk/classes/res/makefile	(revision 3)
+++ trunk/classes/res/makefile	(revision 4)
@@ -3,14 +3,12 @@
 include ../../make.inc
 
-INC		= ../include
 CURDIR		= .
 
 .PHONY:		clean cleaner clean_nlv
 
-all:	nlv
-	cd ./common_res && make
+all:	nlv common_res
 
 nlv:
-	@echo "[35;1;mCreating laguage files.[0;m"
+	@echo "[35;1;mCreating laguage resources.[0;m"
 	@for i in $(LANGUAGES); \
 	do \
@@ -18,4 +16,7 @@
 		cd $(CURDIR)/$$i && make LANGUAGE=_$$i && cd .. ; \
 	done
+
+common_res:
+	cd ./common_res && make
 
 clean_nlv:
Index: trunk/classes/res/nl/mmfind_nl.dlg
===================================================================
--- trunk/classes/res/nl/mmfind_nl.dlg	(revision 3)
+++ trunk/classes/res/nl/mmfind_nl.dlg	(revision 4)
@@ -37,7 +37,11 @@
         CTEXT           "No preview available", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
                         DT_WORDBREAK | NOT WS_VISIBLE
-        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT 
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
                         WS_VISIBLE
         GROUPBOX        "Audio info", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
         DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
         PUSHBUTTON      "~New...", IDPB_NEWFILE, 46, 2, 40, 12
Index: trunk/classes/res/nl/mmfind_nl.rc
===================================================================
--- trunk/classes/res/nl/mmfind_nl.rc	(revision 3)
+++ trunk/classes/res/nl/mmfind_nl.rc	(revision 4)
@@ -8,5 +8,5 @@
 IDSTR_TYPEIMAGE       "Image"
 IDSTR_TYPEVIDEO       "Video"
-IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits per sample:\t%d\n\nChannels:\t%d"
+IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits per sample:\t%d\x0a\x0aChannels:\t%d"
 IDSTR_NOMMTEMPLATEFLDRTITLE "Error during file creation"
 IDSTR_NOMMTEMPLATEFLDR "Multimedia template folder can't be found. It may has lost the object ID <MMPM2_MMTEMPLATEFOLDER>."
Index: trunk/classes/res/tw/audioconv_tw.dlg
===================================================================
--- trunk/classes/res/tw/audioconv_tw.dlg	(revision 4)
+++ trunk/classes/res/tw/audioconv_tw.dlg	(revision 4)
@@ -0,0 +1,38 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "ÂàŽ«­µ°TÀÉ®×", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE, 
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "ÀÉŠW¡G", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "¡H Án¹D", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 131, 
+                        98, 8
+        LTEXT           "(CD: 2 Án¹D)", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "Œœ©ñ®É¶¡¡G¡H", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "ÂàŽ«Šš¡G", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+
+        LTEXT           "¥ØŒÐÀÉŠW¡G", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_RIGHT | 
+                        ES_MARGIN
+        PUSHBUTTON      "ÂsÄý(~B)...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "ÂàŽ«(~C)", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "Ãö©ó(~A)", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "Ãö³¬(~L)", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: trunk/classes/res/tw/audioconv_tw.rc
===================================================================
--- trunk/classes/res/tw/audioconv_tw.rc	(revision 4)
+++ trunk/classes/res/tw/audioconv_tw.rc	(revision 4)
@@ -0,0 +1,20 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE 
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "%d Án¹D"
+IDSTR_CONVERTSAMPLERATE  "%d Hz"
+IDSTR_CONVERTPLAYTIME    "%d:%02d €ÀªºŒœ©ñ®É¶¡"
+IDSTR_CONVERTDIALOGERROR "µLªkÅªšú¹ïžÜ®ØŒÒª©¡IœÐÀË¬d§AªºŠwžË¡C"
+IDSTR_CONVERTNOSPACETITLE   "ÂàŽ«Šš wave"
+IDSTR_CONVERTNOSPACETEXT   "šSŠ³š¬°÷ªºªÅ¶¡šÓžÑœXÀÉ®×¡CœÐ¿ïŸÜŠÜ€ÖŠ³ %d MB ªº¥ŒšÏ¥ÎªÅ¶¡ºÏºÐ¡C"
+IDSTR_INSTALLERRORTITLE  "ŠwžË°ÝÃD"
+IDSTR_AUDIOBROWSETITLE   "­µ°TÀÉ®×ŠWºÙ"
+
+END
+
+
Index: trunk/classes/res/tw/audioplayer_tw.dlg
===================================================================
--- trunk/classes/res/tw/audioplayer_tw.dlg	(revision 4)
+++ trunk/classes/res/tw/audioplayer_tw.dlg	(revision 4)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­µ°TŒœ©ñŸ¹", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "°±€î(~S)", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "ŒÈ°±(~P)", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "Œœ©ñ(~L)", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "­µ¶qºb", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "­µ¶q", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: trunk/classes/res/tw/audioplayer_tw.rc
===================================================================
--- trunk/classes/res/tw/audioplayer_tw.rc	(revision 4)
+++ trunk/classes/res/tw/audioplayer_tw.rc	(revision 4)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "žg¹L®É¶¡(~E)"   ,          ID_MENUITEMELAPSED
+	MENUITEM "³ÑŸl®É¶¡(~R)" ,          ID_MENUITEMREMAINING
+	MENUITEM "Š±¥Øžê°T(~T)" ,       ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "¥D­µ¶q(~V)"
+END
+
Index: trunk/classes/res/tw/classvolume_tw.dlg
===================================================================
--- trunk/classes/res/tw/classvolume_tw.dlg	(revision 4)
+++ trunk/classes/res/tw/classvolume_tw.dlg	(revision 4)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­µ¶q", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: trunk/classes/res/tw/cwaudio_tw.dlg
===================================================================
--- trunk/classes/res/tw/cwaudio_tw.dlg	(revision 4)
+++ trunk/classes/res/tw/cwaudio_tw.dlg	(revision 4)
@@ -0,0 +1,76 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "ÀxŠs(~S)", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "šú®ø(~C)", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "žÑ»¡(~H)", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "ID3 Tags", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "ŠWºÙ¡G", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "ºt¥XªÌ¡G", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "±M¿è¡G", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "µùžÑ¡G", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Š~¥÷¡G", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Ãþ«¬¡G", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "Án­µžê°T", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           "šúŒË³t«×¡G", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "šúŒË€j€p(Bits)¡G", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Œœ©ñ®É¶¡¡G", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Án¹D¡G", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Œv¹³žê°T", IDGB_IMAGEINFO, 6, 4, 154, 78, 
+                        NOT WS_GROUP
+        LTEXT           "Œe«×¡G", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "°ª«×¡G", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "²`«×¡G", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "¿é€J URL ŠÜŠê¬yŠøªAŸ¹¡G", IDST_URLTEXT, 12, 
+                        37, 143, 8
+    END
+END
+
Index: trunk/classes/res/tw/cwaudio_tw.rc
===================================================================
--- trunk/classes/res/tw/cwaudio_tw.rc	(revision 4)
+++ trunk/classes/res/tw/cwaudio_tw.rc	(revision 4)
@@ -0,0 +1,130 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "­µ¶q(~V)",ID_MENU_VOLUME       
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "¶}©l(~S)",ID_MENU_START       
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "°±€î(~S)", ID_MENU_STOP       
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "ŒÈ°±(~P)", ID_MENU_PAUSE       
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "Ä~Äò(~R)", ID_MENU_RESUME       
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "­µ°Tœs¿èŸ¹(~A)", ID_MENU_EDITOR       
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "Œœ©ñŸ¹(~P)", ID_MENU_PLAYER       
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "ÂàŽ«Šš(~C)",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (RIFF WAVE Digital Audio)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM "¥¿±`¹Ï°O", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "Œœ©ñ²M³æœs¿èŸ¹(~E)", ID_MENU_M3UEDITOR       
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "Œœ©ñŠ¹²MŸ¹(~P)", ID_MENU_M3UPLAYER       
+END
+
+
+STRINGTABLE 
+BEGIN
+ID_WAVEINFOPAGENAME "­µ°Tžê°T(~A)"
+ID_ID3TAGSPAGENAME  "~ID3 Tags"
+ID_TRACKNAMEPAGENAME "Š±¥ØŠWºÙ(~T)"
+IDSTR_TRACKNAME      "Š±¥ØŠWºÙ"
+
+IDSTR_PLAYTIME      "Œœ©ñ®É¶¡"
+IDSTR_SAMPLERATE    "šúŒË³t«×"
+IDSTR_CHANNELS      "Án¹D"
+IDSTR_BPS           "ŒË¥»€j€p(Bits"
+
+;IDSTR_BITRATE       "Bitrate"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "ŒÐÃD"
+IDSTR_ARTIST        "ºt¥XªÌ"
+IDSTR_ALBUM         "Âà¿è"
+IDSTR_YEAR          "Š~¥÷"
+IDSTR_COMMENT       "µùžÑ"
+IDSTR_GENRE         "Ãþ«¬"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "MMData file"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Digital Audio"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "Light table"
+
+IDSTR_ICONSIZEMENU    "Icon ~size"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Starting track..."
+IDSTR_AUDIOSCANNING     "Scanning Audiofile..."
+IDSTR_AUDIOSTREAMTITLE  "Audio-Stream"
+IDSTR_STREAMURLPAGENAME "~URL-Setting"
+IDSTR_CDTRACKTITLE      "CD-Track"
+IDSTR_M3UTITLE          "M3U playlist"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Audio player"
+IDSTR_AUDEDITORTITLE       "Audio editor"
+IDSTR_M3UEDITORTITLE       "Playlist editor"
+IDSTR_TRACKPAUSED          " (paused)"
+;Used for window list
+IDSTR_VOLUMETITLE       "Volume"
+
+END
+
+
Index: trunk/classes/res/tw/cwimage_tw.rc
===================================================================
--- trunk/classes/res/tw/cwimage_tw.rc	(revision 4)
+++ trunk/classes/res/tw/cwimage_tw.rc	(revision 4)
@@ -0,0 +1,50 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "¬Û€ùœs¿èŸ¹(~E)", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "ÂàŽ«Šš(~C)"
+
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digital image"
+
+IDSTR_IMAGEINFOPAGENAME "Œv¹³žê°T(~I)"
+IDSTR_SPRINTFPIXEL	"%d ¹³¯À"
+IDSTR_SPRINTFBIT       "%d Bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "µLªk§äšìŠ¹Œv¹³ªº¿é€J¡þ¿é¥Xµ{§Ç¡C"
+IDSTR_OPENFILEERRORTITLE "ÀÉ®×¿ù»~"
+IDSTR_OPENFILEERROR      "µLªk¶}±ÒÀÉ®×¡C"
+IDSTR_NOMEMERROR         "µLªkšÏ¥Î°OŸÐÅé"
+IDSTR_IMGIOPROCCRASH     "¶}±ÒŒv¹³®Éµo¥Í€º³¡¿ù»~¡C¥²¶·­«·s±Ò°Ê®à­±©Îšt²Î¥i¯à€£Ã­©w¡I€£·|Ãö³¬¥¿Šb°õŠæªºÀ³¥Îµ{Š¡¡C"
+
+IDSTR_IMAGEDETAIL_WIDTH   "Œe«×"
+IDSTR_IMAGEDETAIL_HEIGHT  "°ª«×"
+IDSTR_IMAGEDETAIL_DEPTH   "²`«×"
+IDSTR_IMAGEDETAIL_FORMAT  "®æŠ¡"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Œv¹³ÀËµøŸ¹"
+IDSTR_MENU_IMAGEINFO        "Œv¹³žê°T¡G %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
+
+
Index: trunk/classes/res/tw/cwvideo_tw.rc
===================================================================
--- trunk/classes/res/tw/cwvideo_tw.rc	(revision 4)
+++ trunk/classes/res/tw/cwvideo_tw.rc	(revision 4)
@@ -0,0 +1,13 @@
+
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "ŒÆŠìµø°T"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE       "µø°TŒœ©ñŸ¹"
+
+END
+
Index: trunk/classes/res/tw/imageconv_tw.dlg
===================================================================
--- trunk/classes/res/tw/imageconv_tw.dlg	(revision 4)
+++ trunk/classes/res/tw/imageconv_tw.dlg	(revision 4)
@@ -0,0 +1,29 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "ÂàŽ«ŒÆŠìŒv¹³", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "ÀÉŠW¡G", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "ÂàŽ«Šš", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "¥ØŒÐÀÉŠW¡G", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "ø°Äý(~B)...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "ÂàŽ«(~C)", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "Ãö©ó(~A)", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "Ãö³¬(~L)", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: trunk/classes/res/tw/imageconv_tw.rc
===================================================================
--- trunk/classes/res/tw/imageconv_tw.rc	(revision 4)
+++ trunk/classes/res/tw/imageconv_tw.rc	(revision 4)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Œv¹³ÀÉŠWºÙ"
+END
+
Index: trunk/classes/res/tw/makefile
===================================================================
--- trunk/classes/res/tw/makefile	(revision 4)
+++ trunk/classes/res/tw/makefile	(revision 4)
@@ -0,0 +1,51 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_tw
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         = 
+
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll mmres$(LANGUAGE).def
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc 
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm *.*~
+	-rm *.flc
+	-rm *.res
+	-rm *.obj
+
+
+	
+
Index: trunk/classes/res/tw/mmfind_tw.dlg
===================================================================
--- trunk/classes/res/tw/mmfind_tw.dlg	(revision 4)
+++ trunk/classes/res/tw/mmfind_tw.dlg	(revision 4)
@@ -0,0 +1,55 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Find Multimedia File", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Open filename", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Drive", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restrict files to", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<All Files>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Directory", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "File", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Read-Only", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Type of file", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Preview", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "No preview available", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Audio info", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~New...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Apply", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Cancel", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Help", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: trunk/classes/res/tw/mmfind_tw.rc
===================================================================
--- trunk/classes/res/tw/mmfind_tw.rc	(revision 4)
+++ trunk/classes/res/tw/mmfind_tw.rc	(revision 4)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Image"
+IDSTR_TYPEVIDEO       "Video"
+IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits per sample:\t%d\x0a\x0aChannels:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Error during file creation"
+IDSTR_NOMMTEMPLATEFLDR "Multimedia template folder can't be found. It may has lost the object ID <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: trunk/classes/res/tw/mmres_tw.DEF
===================================================================
--- trunk/classes/res/tw/mmres_tw.DEF	(revision 4)
+++ trunk/classes/res/tw/mmres_tw.DEF	(revision 4)
@@ -0,0 +1,27 @@
+; mediafolderres.DEF: DEF-file for mmres_tw.dll
+;
+;                    (C) Chris Wohlgemuth 2003
+;/*
+; * 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, 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; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+
+LIBRARY MMRES_TW INITGLOBAL
+DESCRIPTION '$@#(c) Ming-Lung Cheng:0.2 (12.02.06) (mmres_tw.DLL)#@##1## 13.03.2002 18:17:00      My ;-)  ::::1::@@Resource-DLL'
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA SINGLE SHARED DISCARDABLE
+EXPORTS  
+        queryLanguage
+
Index: trunk/classes/res/tw/mmres_tw.c
===================================================================
--- trunk/classes/res/tw/mmres_tw.c	(revision 4)
+++ trunk/classes/res/tw/mmres_tw.c	(revision 4)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * 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, 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; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Taiwan";
+}
+
Index: trunk/classes/res/tw/mmres_tw.rc
===================================================================
--- trunk/classes/res/tw/mmres_tw.rc	(revision 4)
+++ trunk/classes/res/tw/mmres_tw.rc	(revision 4)
@@ -0,0 +1,34 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_tw.rc"
+rcinclude "volume_tw.dlg"
+
+rcinclude "audioconv_tw.rc"
+rcinclude "audioconv_tw.dlg"
+
+rcinclude "imageconv_tw.rc"
+rcinclude "imageconv_tw.dlg"
+
+rcinclude "audioplayer_tw.rc"
+rcinclude "audioplayer_tw.dlg"
+
+rcinclude "classvolume_tw.dlg"
+
+rcinclude "cwaudio_tw.rc"
+rcinclude "cwaudio_tw.dlg"
+
+rcinclude "cwimage_tw.rc"
+rcinclude "cwvideo_tw.rc"
+
Index: trunk/classes/res/tw/volume_tw.dlg
===================================================================
--- trunk/classes/res/tw/volume_tw.dlg	(revision 4)
+++ trunk/classes/res/tw/volume_tw.dlg	(revision 4)
@@ -0,0 +1,21 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­µ¶q", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "­µ¶q(~V)", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "ÀR­µ(~M)", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
+
Index: trunk/classes/res/tw/volume_tw.rc
===================================================================
--- trunk/classes/res/tw/volume_tw.rc	(revision 4)
+++ trunk/classes/res/tw/volume_tw.rc	(revision 4)
@@ -0,0 +1,11 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "ÁôÂÃŒÐÃDŠC(~H)",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "žõ¥X(~X)",    IDM_ITEMEXIT
+END
+
