GUI формы- редактор для текстовых файлов

Обсуждение программ nnCron и nnCron LITE

GUI формы- редактор для текстовых файлов

Postby AlikasS » Wed, 28 Nov 2007, 17:49

TEXT-EDITOR
например:
S" nncron.ini" TEXT-EDITOR или
TEXT-EDITOR: "nncron.ini" - откроет это файл для редактирования,
если файла такого нет, откроет путь к файлу, как текст для редактирования
собственно, можно изначально подсовывать не путь к файлу, а текст для редактирования
TEXT-EDITOR: "текст для редактирования"
Code: Select all
MODULE: redaktortexts

\ Качаем, подключаем в nncron.ini
\ http://nncron-plugins.narod.ru/plugins/for-gui/forguiplugins.zip

: daterelize+ S"  (2008.07.01 04:11 UTC)" S+ ;
C" WIN2OEM" FIND NIP 0=
[IF]
    : WIN2OEM ( a u -- a u ) 2DUP SWAP DUP CharToOemBuffA DROP ;
[THEN]

C" OEM2WIN" FIND NIP 0=
[IF]
   : OEM2WIN ( a u -- a u ) 2DUP SWAP DUP OemToCharBuffA DROP ;
[THEN]

USER RECODE_BUFFER_Y

CLASS: ~MultiTextWinEdit <SUPER FrameWindow

Edit OBJ edInput :init a v 10 20 pos 275 175 size
vStyle @
ES_WANTRETURN OR ES_MULTILINE WS_VSCROLL OR OR WS_HSCROLL OR ES_AUTOVSCROLL OR ES_AUTOHSCROLL OR
vStyle ! tabstop
vExStyle  @  WS_EX_ACCEPTFILES XOR vExStyle  ! 
;

Button OBJ bt<> :init a v 3 201 pos 7 10 size S" <" text tabstop ;

Button OBJ btOpen :init a v 10 201 pos 30 10 size S" Open" text tabstop ;
Button OBJ btSave :init a v 40 201 pos 30 10 size S" Save" text tabstop ;
Button OBJ btSaveas :init a v 70 201 pos 30 10 size S" Save as" text tabstop ;
Button OBJ btCancel :init a v 100 201 pos 30 10 size S" Exit" text tabstop ;

Button OBJ btCLS :init a v 135 201 pos 30 10 size S" Clear" text tabstop ;
Button OBJ btWIN2OEM :init a v 165 201 pos 30 10 size S" Win2Oem" text tabstop ;
Button OBJ btOEM2WIN :init a v 195 201 pos 30 10 size S" Oem2Win" text tabstop ;
Button OBJ btSec :init a v 225 201 pos 30 10 size S" txt>txt'" text tabstop ;
Button OBJ btDeSec :init a v 255 201 pos 30 10 size S" txt'>txt" text tabstop ;

ProgressBar  OBJ bbars :init a v 10 213 pos 275 4 size ;
: test-progress
bbars Show
    10 0 DO  bbars StepIt 70 PAUSE LOOP
bbars Hide
;

OpenDialog OBJ od1
FILTER: AllFilter
NAME" All files (*.*)"      EXT" *.*"
NAME" Forth & nncron files" EXT" *.f;*.spf;*.tab;nncron.ini"
NAME" Text files"           EXT" *.txt"
NAME" INI files"           EXT" *.ini"
NAME" Log files"           EXT" *.log"
NAME" Bat, Cmd files (*.bat,*.cmd)"             EXT" *.bat;*.cmd"
;FILTER

SaveDialog OBJ od2 FILTER: AllFilter2 NAME" All files (*.*)"      EXT" *.*" ;FILTER

Static OBJ stCap :init a v 10 3 pos 280 15 size ;

var temp2
: 5sPause 50 PAUSE ;

M: <>Click
temp2 @
IF
btOpen Show 5sPause
btSave Show 5sPause
btSaveas Show 5sPause
btCancel Show 5sPause
btCLS Show 5sPause
btWIN2OEM Show 5sPause
btOEM2WIN Show 5sPause
btSec Show 5sPause
btDeSec Show 5sPause
S" <" bt<>  SetText
0 temp2 !
ELSE
btDeSec Hide 5sPause
btSec Hide 5sPause
btOEM2WIN Hide 5sPause
btWIN2OEM Hide 5sPause
btCLS Hide 5sPause
btCancel Hide 5sPause
btSaveas Hide 5sPause
btSave Hide 5sPause
btOpen Hide 5sPause
S" >" bt<>  SetText
1 temp2 !
THEN
;

var a
var u

M: albtdisab
bt<> Disable
btOpen Disable
btSave Disable
btSaveas Disable
btCancel Disable
btCLS Disable
btWIN2OEM Disable
btOEM2WIN Disable
btSec Disable
btDeSec Disable
;

M: albtenab
bt<> Enable
btOpen Enable
btSave Enable
btSaveas Enable
btCancel Enable
btCLS Enable
btWIN2OEM Enable
btOEM2WIN Enable
btSec Enable
btDeSec Enable
;

M: OpenClick
albtdisab
AllFilter od1 SetFilter
od1 Execute
IF
test-progress
   od1 FileName
2DUP
FILE edInput  SetText
stCap SetText
THEN
albtenab
;

M: edInputred
0x000000 0x0000FF edInput Set-color
;

M: edInputredstop
edInput ColorOFF
;

M: SaveasClick
albtdisab
AllFilter2 od2 SetFilter
od2 Execute
IF
   od2 FileName
2DUP
   2DUP EXIST?
   IF
      edInputred
      QUERY: "файл существует, перезаписать?"
      IF
      test-progress
      edInput GetText 2SWAP FWRITE
      stCap SetText
      ELSE
      2DROP 2DROP
      THEN
      edInputredstop
   ELSE
      test-progress
      edInput GetText 2SWAP FWRITE
      stCap SetText
   THEN
THEN
albtenab
;

M: SaveClick
albtdisab
stCap GetText
IF DROP
   stCap GetText EXIST?
   IF
test-progress
      edInput GetText stCap GetText  FWRITE
   ELSE
      SaveasClick
   THEN
ELSE DROP
   SaveasClick
THEN
albtenab
;

var temp


M: btWIN2OEMClick
albtdisab test-progress
edInput GetText S>ZALLOC RECODE_BUFFER_Y !
RECODE_BUFFER_Y @ ASCIIZ> WIN2OEM edInput SetText
albtenab
;

M: btOEM2WINClick
albtdisab test-progress
edInput GetText S>ZALLOC RECODE_BUFFER_Y !
RECODE_BUFFER_Y @ ASCIIZ> OEM2WIN edInput SetText
albtenab
;

M: btSecClick
albtdisab test-progress
edInput GetText S>ZALLOC RECODE_BUFFER_Y !
RECODE_BUFFER_Y @ ASCIIZ> EncP edInput SetText
albtenab
;

M: btDeSecClick
albtdisab test-progress
edInput GetText S>ZALLOC RECODE_BUFFER_Y !
RECODE_BUFFER_Y @ ASCIIZ> DecP edInput SetText
albtenab
;

M: exit_then_input_diff
\ temp @ IF ELSE EXIT THEN
albtdisab
stCap GetText EXIST?
IF
   edInput GetText stCap GetText FILE COMPARE 0=
   IF \ строки равны
   ELSE
      \ строки не равны, т.е. содержание файла и окна разное
      \ вывести вопрос и сохранить при утверд.ответе
      edInputred
      QUERY: "есть не сохраненные изменения, сохранить?"
      IF
       test-progress
      edInput GetText stCap GetText  FWRITE
      THEN
      edInputredstop
   THEN
ELSE \ такого файла нет
   edInput GetText
   IF \ есть текст в окне
   DROP
      edInputred
      QUERY: "есть не сохраненные изменения, сохранить?"
      IF
      SaveasClick
      THEN
      edInputredstop
   ELSE
   DROP
   THEN
THEN
 albtenab
;

M: btCancelClick exit_then_input_diff 1 ModalResult! ;

M: btCLSClick
albtdisab edInputred
QUERY: "очистить?"
IF
test-progress
S" " edInput SetText
THEN
edInputredstop
albtenab
;

VM: OnExit exit_then_input_diff 2 ModalResult! ;
M: SetCap stCap SetText ;
M: SetDef edInput SetText ;

M: Create
Create
AutoCreate

bbars Hide
['] <>Click bt<> OnClick !
['] btCancelClick btCancel OnClick !
['] btCLSClick btCLS OnClick !
['] OpenClick btOpen OnClick !
['] SaveasClick btSaveas OnClick !
['] SaveClick btSave OnClick !
['] btWIN2OEMClick btWIN2OEM OnClick !
['] btOEM2WINClick btOEM2WIN OnClick !
['] btDeSecClick btDeSec OnClick !
['] btSecClick btSec OnClick !
;
;CLASS

VARIABLE bm_idt
VARIABLE bmicon_idt
200 CONSTANT MIN_0
201 CONSTANT MIN_1
202 CONSTANT MIN_2
203 CONSTANT MIN_3

: make-BMMenu-popup ( -- h )
   POPUPMENU
\ MENUSEPARATOR
   S" Open" MIN_0 MENUITEM
\ MENUSEPARATOR
   S" About" MIN_1 MENUITEM
\ MENUSEPARATOR
   S"  www" MIN_2 MENUITEM
\ MENUSEPARATOR
\    S"  WinSpy" MIN_3 MENUITEM
     S"  Exit" MIN_3 MENUITEM
\ MENUSEPARATOR
   END-MENU
;
: def-item-action S" Text Editor" daterelize+  MsgBox ;

\ задаем действия для каждого пункта меню
: start-BMMenu-item ( id --   )
   CASE
   MIN_0 OF bm_idt @ ->CLASS ~MultiTextWinEdit OpenClick ENDOF
   MIN_1 OF def-item-action ENDOF
   MIN_2 OF MSG: "http://www.nncron.ru" ENDOF
   MIN_3 OF bm_idt @ ->CLASS ~MultiTextWinEdit btCancelClick TRAY-REFRESH ENDOF
\   MIN_4 OF winspy ENDOF
   ENDCASE
;

: BMMenu
  bmicon_idt @ ->CLASS TrayIcon hWnd @ SetForegroundWindow DROP
  make-BMMenu-popup >R

  \ делаем один из пунктов меню "дефолтным" (будет
  \ выполняться по двойному клику на иконке в тpее)
  0 MIN_1 R@ SetMenuDefaultItem DROP
  0 bmicon_idt @ ->CLASS TrayIcon hWnd @ CalcMenuYX
  ( TPM_RETURNCMD) 256 R@ TrackPopupMenuEx
  ?DUP IF start-BMMenu-item THEN
  R> DestroyMenu DROP
;

: WIN-INPUT-TEXT-MULTI2 ( a2 u2 a1 u1 -- 0 | 1 )
{ \ w -- }
~MultiTextWinEdit NEW DUP TO w bm_idt !
   w ->CLASS ~MultiTextWinEdit vStyle @
   w ->CLASS ~MultiTextWinEdit vStyle !

    \ создаем иконку в трее (IDI_WARNING)
S" Text Editor" daterelize+  32513 0 LoadIconA ADD-TI bmicon_idt !

   ['] BMMenu bmicon_idt @ ->CLASS TrayIcon OnRB !
   ['] BMMenu bmicon_idt @ ->CLASS TrayIcon OnLB !
   ['] def-item-action bmicon_idt @ ->CLASS TrayIcon On2LB !

   0 w ->CLASS ~MultiTextWinEdit Create
   300 230 w ->CLASS ~MultiTextWinEdit Center
S" TEdi" daterelize+    w ->CLASS ~MultiTextWinEdit SetText
   w ->CLASS ~MultiTextWinEdit SetCap
   w ->CLASS ~MultiTextWinEdit SetDef
   w ->CLASS ~MultiTextWinEdit ShowModal \ эта штука дропается в следующих словах, можно использовать как тест ошибка/удача

    \ удаляем иконку из трея
    bmicon_idt @ DEL-TI
TRAY-REFRESH
   w DELETE
;

\ S" nncron.ini" TEXT-EDITOR или
\ TEXT-EDITOR: "nncron.ini" - откроет это файл для редактирования,
\ если файла такого нет, откроет путь к файлу, как текст для редактирования
\ собственно, можно изначально подсовывать не путь к файлу, а текст для редактирования
\ TEXT-EDITOR: "текст для редактирования"
EXPORT

: TEXT-EDITOR ( a u -- )
2DUP EXIST? 0= IF S" " ELSE 2DUP FILE 2SWAP THEN
\ S" Text Editor" daterelize+
WIN-INPUT-TEXT-MULTI2 DROP
;

: TEXT-EDITOR: eval-string, POSTPONE TEXT-EDITOR ; IMMEDIATE

DEFINITIONS

\ для создания exe
VARIABLE from-filename
: SET-CL
  GetCommandLineA ASCIIZ> \ 2DUP TYPE CR
  TIB SWAP C/L MIN DUP #TIB ! MOVE >IN 0!
  get-string 2DROP
;

: set-filenames ( -- ) \ интерпретировать командную строку
  SET-CL
  get-string ?DUP 0= IF S" " THEN S>ZALLOC from-filename !
;
EXPORT
: sTEXT-EDITOR ( a u -- )
set-filenames from-filename @ ASCIIZ>
2DUP EXIST? 0= IF S" " ELSE 2DUP FILE 2SWAP THEN
\ S" Text Editor" daterelize+
WIN-INPUT-TEXT-MULTI2 DROP
;
;MODULE

все это дело можно скомпилировать в exe
запуская файл по nncron.exe -runfile имя_файла
где содержание файла
Code: Select all
: main
[NONAME sTEXT-EDITOR BYE NONAME] MAINX !
S" forthEditor!.exe" SAVE
;

и в конце работает
и запуск
Code: Select all
forthEditor!.exe
и
Code: Select all
forthEditor!.exe "C:\Program Files\nnCron\nncron.ini"
и
Code: Select all
forthEditor!.exe "какой то текст"
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests