ラベル Footy2 の投稿を表示しています。 すべての投稿を表示
ラベル Footy2 の投稿を表示しています。 すべての投稿を表示

2008年1月8日火曜日

Footy2の「イベントの監視」機能を利用する

hscallbk.dllを利用したイベントの監視。
ステータスバーに捕まえたイベントを報告します。

切り取りやアンドゥなどのショートカットキー(ctrl+A,C,V,X,Y,Z)をonkeyで実装しています。
#include "Footy2.as"
#include "hscallbk.as"
#include "user32.as"
#func Focus             ""  int, int, int, int
#func MoveCaret         ""  int, int, int, int
#func TextModified      ""  int, int, int
#func InsertModeChanged ""  int, int, int

*init
    gosub *createGUIObjects
    gosub *setCallBackFunctions
    onkey gosub *onPushKey
    stop

*createGUIObjects
    // ステータスバー作成
    // 参考:http://lhsp.s206.xrea.com/hsp_object8.html
    //   :http://yokohama.cool.ne.jp/chokuto/urawaza/statusbar.html
    winobj "msctls_statusbar32", "ready", , $50000000
    statusbar_id = stat
    if statusbar_id == -1 {
        dialog "ウィンドウオブジェクトが正常に生成されませんでした", 1
        end
    }
    // ステータスバーの高さを取得
    dim rect, 4
    GetWindowRect objinfo_hwnd(statusbar_id), varptr(rect)
    if stat == 0 {
        dialog "ステータスバーの座標取得に失敗しました", 1
        end
    }
    statusbar_height = rect(3) - rect(1)

    // Footyエディタコントロール設置
    Footy2Create hwnd, 0, 0, ginfo_winx, ginfo_winy - statusbar_height, 0
    footy_id = stat
    if footy_id < 0 {
        dialog "Error : type " + stat, 1
        end
    }
    return

// コールバック関数の登録
*setCallBackFunctions
    setcallbk proc_Focus, Focus, *onFocus
    setcallbk proc_MoveCaret, MoveCaret, *onMoveCaret
    setcallbk proc_TextModified, TextModified, *onTextModified
    setcallbk proc_InsertModeChanged, InsertModeChanged, *onInsertModeChanged
    Footy2SetFuncFocus footy_id, varptr(proc_Focus), 0
    Footy2SetFuncMoveCaret footy_id, varptr(proc_MoveCaret), 0
    Footy2SetFuncTextModified footy_id, varptr(proc_TextModified), 0
    Footy2SetFuncInsertModeChanged footy_id, varptr(proc_InsertModeChanged), 0
    return

// フォーカスを得た/失った
*onFocus
    if callbkarg(3) & $FF {
        message = "Footyコントロールがフォーカスを得ました"
    } else {
        message = "Footyコントロールがフォーカスを失いました"
    }
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
    return

// キャレットが移動した
*onMoveCaret
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, "キャレット位置が変更されました(" + callbkarg(2) + ":" + callbkarg(3) + ")"
    return

// テキストが編集された
*onTextModified
    switch callbkarg(2)
        case MODIFIED_CAUSE_CHAR
            message = "文字が入力されました(IMEオフ)"
            swbreak
        case MODIFIED_CAUSE_IME
            message = "文字が入力されました(IMEオン)"
            swbreak
        case MODIFIED_CAUSE_DELETE
            message = "Deleteキーが押されました"
            swbreak
        case MODIFIED_CAUSE_BACKSPACE
            message = "BackSpaceキーが押されました"
            swbreak
        case MODIFIED_CAUSE_ENTER
            message = "Enterキーが押されました"
            swbreak
        case MODIFIED_CAUSE_UNDO
            message = "元に戻す処理が実行されました"
            swbreak
        case MODIFIED_CAUSE_REDO
            message = "やり直し処理が実行されました"
            swbreak
        case MODIFIED_CAUSE_CUT
            message = "切り取り処理が行われました"
            swbreak
        case MODIFIED_CAUSE_PASTE
            message = "貼り付け処理が行われました"
            swbreak
        case MODIFIED_CAUSE_INDENT
            message = "インデント処理が行われました"
            swbreak
        case MODIFIED_CAUSE_UNINDENT
            message = "逆インデント処理が行われました"
            swbreak
        case MODIFIED_CAUSE_TAB
            message = "タブキーが押されました"
            swbreak
        default
            message = "テキストが編集されました(UNKNOWN)"
            swbreak
    swend
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
    return

// 挿入/上書モードの変更
*onInsertModeChanged
    if callbkarg(2) & $FF {
        message = "挿入モードに変更されました"
    } else {
        message = "上書モードに変更されました"
    }
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
    return

// ショートカットキー
*onPushKey
    keycode = iparam
    getkey ctrl, 17
    if ctrl {
        switch keycode
            case 'A'
                Footy2SelectAll footy_id
                swbreak
            case 'C'
                Footy2Copy footy_id
                swbreak
            case 'V'
                Footy2Paste footy_id
                swbreak
            case 'X'
                Footy2Cut footy_id
                swbreak
            case 'Y'
                Footy2Redo footy_id
                swbreak
            case 'Z'
                Footy2Undo footy_id
                swbreak
        swend
    }
    return



アクセラレータキーを利用したスクリプトがこちら。
ウィンドウの最大化にも対応しています。
// アクセラレータキーを使用
// Footy2付属のC++サンプルとほぼ同等
#include "Footy2.as"
#include "hscallbk.as"
#include "user32.as"
#func Focus             ""  int, int, int, int
#func MoveCaret         ""  int, int, int, int
#func TextModified      ""  int, int, int
#func InsertModeChanged ""  int, int, int

#const FVIRTKEY         0x0001
#const FNOINVERT        0x0002
#const FSHIFT           0x0004
#const FCONTROL         0x0008
#const FALT             0x0010

#const WM_SIZE          0x0005
#const WM_COMMAND       0x0111

#enum IDM_UNDO = 1
#enum IDM_REDO
#enum IDM_CUT
#enum IDM_COPY
#enum IDM_PASTE
#enum IDM_SELECTALL

// 初期化作業
*init
    gosub *createGUIObjects
    gosub *createAccelTable
    gosub *setCallBackFunctions
    oncmd gosub *on_resize, WM_SIZE
    oncmd gosub *on_command, WM_COMMAND
    onexit goto *on_exit
    dim msg, 7
    Footy2SetFocus footy_id

// メッセージループ
*msg_loop
    GetMessage varptr(msg), 0, 0, 0
    ret = stat
    if (ret == 0)|(ret == -1) {
        goto *on_exit
    }
    TranslateAccelerator hwnd, haccel, varptr(msg)
    if stat == 0 {
        TranslateMessage varptr(msg)
        DispatchMessage  varptr(msg)
    }
    goto *msg_loop

#define WS_MAXIMIZEBOX  0x00010000
#define WS_SIZEBOX      0x00040000
*createGUIObjects
    // ウィンドウ初期化
    screen 0, ginfo_dispx, ginfo_dispy
    GetWindowLong hwnd, -16
    SetWindowLong hwnd, -16, stat | WS_MAXIMIZEBOX | WS_SIZEBOX
    title "Footy2サンプル on Footy2 ver." + GetFooty2Ver()
    width 640, 480

    // ステータスバー作成
    // 参考:http://lhsp.s206.xrea.com/hsp_object8.html
    //   :http://yokohama.cool.ne.jp/chokuto/urawaza/statusbar.html
    winobj "msctls_statusbar32", "ready", , $50000000
    statusbar_id = stat
    if statusbar_id == -1 {
        dialog "ウィンドウオブジェクトが正常に生成されませんでした", 1
        end
    }

    // ステータスバーの高さを取得
    dim rect, 4
    GetWindowRect objinfo_hwnd(statusbar_id), varptr(rect)
    if stat == 0 {
        dialog "ステータスバーの座標取得に失敗しました", 1
        end
    }
    statusbar_height = rect(3) - rect(1)

    // Footyエディタコントロール設置
    Footy2Create hwnd, 0, 0, ginfo_winx, ginfo_winy - statusbar_height, 0
    footy_id = stat
    if footy_id < 0 {
        dialog "Error : type " + stat, 1
        end
    }
    return

// アクセラレータテーブルの作成
// 参考:「アクセラレータ - HSP開発wiki」
//    http://hspdev-wiki.net/?%A5%A2%A5%AF%A5%BB%A5%E9%A5%EC%A1%BC%A5%BF
*createAccelTable
    sdim accel, 6*6

    key = 'Z', 'Y', 'X', 'C', 'V', 'A'
    repeat 6
        poke accel,  cnt*6+0, FCONTROL | FVIRTKEY
        wpoke accel, cnt*6+2, key(cnt)
        wpoke accel, cnt*6+4, cnt+1
    loop

    CreateAcceleratorTable varptr(accel), 6
    haccel = stat
    if haccel == 0 {
        dialog "アクセラレータテーブル作成に失敗しました", 1
    }
    return

// コールバック関数の登録
*setCallBackFunctions
    setcallbk proc_Focus, Focus, *onFocus
    setcallbk proc_MoveCaret, MoveCaret, *onMoveCaret
    setcallbk proc_TextModified, TextModified, *onTextModified
    setcallbk proc_InsertModeChanged, InsertModeChanged, *onInsertModeChanged
    Footy2SetFuncFocus footy_id, varptr(proc_Focus), 0
    Footy2SetFuncMoveCaret footy_id, varptr(proc_MoveCaret), 0
    Footy2SetFuncTextModified footy_id, varptr(proc_TextModified), 0
    Footy2SetFuncInsertModeChanged footy_id, varptr(proc_InsertModeChanged), 0
    return

// フォーカスを得た/失った
*onFocus
    if callbkarg(3) & $FF {
        message = "Footyコントロールがフォーカスを得ました"
    } else {
        message = "Footyコントロールがフォーカスを失いました"
    }
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
    return

// キャレットが移動した
*onMoveCaret
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, "キャレット位置が変更されました(" + callbkarg(2) + ":" + callbkarg(3) + ")"
    return

// テキストが編集された
*onTextModified
    switch callbkarg(2)
        case MODIFIED_CAUSE_CHAR
            message = "文字が入力されました(IMEオフ)"
            swbreak
        case MODIFIED_CAUSE_IME
            message = "文字が入力されました(IMEオン)"
            swbreak
        case MODIFIED_CAUSE_DELETE
            message = "Deleteキーが押されました"
            swbreak
        case MODIFIED_CAUSE_BACKSPACE
            message = "BackSpaceキーが押されました"
            swbreak
        case MODIFIED_CAUSE_ENTER
            message = "Enterキーが押されました"
            swbreak
        case MODIFIED_CAUSE_UNDO
            message = "元に戻す処理が実行されました"
            swbreak
        case MODIFIED_CAUSE_REDO
            message = "やり直し処理が実行されました"
            swbreak
        case MODIFIED_CAUSE_CUT
            message = "切り取り処理が行われました"
            swbreak
        case MODIFIED_CAUSE_PASTE
            message = "貼り付け処理が行われました"
            swbreak
        case MODIFIED_CAUSE_INDENT
            message = "インデント処理が行われました"
            swbreak
        case MODIFIED_CAUSE_UNINDENT
            message = "逆インデント処理が行われました"
            swbreak
        case MODIFIED_CAUSE_TAB
            message = "タブキーが押されました"
            swbreak
        default
            message = "テキストが編集されました(UNKNOWN)"
            swbreak
    swend
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
    return

// 挿入/上書モードの変更
*onInsertModeChanged
    if callbkarg(2) & $FF {
        message = "挿入モードに変更されました"
    } else {
        message = "上書モードに変更されました"
    }
    sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
    return

// WM_COMMANDメッセージを受け取った
*on_command
    switch wparam & $FFFF
        case IDM_UNDO
            Footy2Undo footy_id
            swbreak
        case IDM_REDO
            Footy2Redo footy_id
            swbreak
        case IDM_CUT
            Footy2Cut footy_id
            swbreak
        case IDM_COPY
            Footy2Copy footy_id
            swbreak
        case IDM_PASTE
            Footy2Paste footy_id
            swbreak
        case IDM_SELECTALL
            Footy2SelectAll footy_id
            swbreak
    swend
    return

// WM_SIZEメッセージを受け取った
#const  SIZE_RESTORED   0
#const  SIZE_MAXIMIZED  2
*on_resize
    if (wparam == SIZE_RESTORED) | (wparam == SIZE_MAXIMIZED) {
        Footy2Move footy_id, 0, 0, ginfo_winx, ginfo_winy - statusbar_height
        sendmsg objinfo_hwnd(id_statusbar), WM_SIZE, SIZE_RESTORED, 0
    }
    return 0

// アクセラレータテーブルの削除
*destroyAccelTable
    if haccel != 0 {
        DestroyAcceleratorTable haccel
    }
    return

// 終了時処理
*on_exit
    gosub *destroyAccelTable
    end

Footy2.as正式版を公開しました

すべての命令・関数・マクロと定数を記述したHSP3向けヘッダファイルをFooty2のプロジェクトページからダウンロードできます。(コールバック関数の利用はhscallbk.dllが必要です)

リポジトリブラウザ→trunk→HSPとリンクを辿ってダウンロードしてください。

2007年11月10日土曜日

Footy2.as 仮公開

HSPスクリプトビューワ(Footy2)のページにコメントをくださった方、ありがとうございます。

私の力量不足によりまだ動作検証がヘルプの6章までしか終わっていない状態ですが、Footy2.asを下記アドレスにて仮公開いたします。
シフトキーロックが正常に働かないなど問題点も見つかっています。他にも不具合があるかも知れませんが、各自自己責任にてご利用ください。
http://www.geocities.jp/prjctsp/hsp/Footy2.txt
※拡張子をtxtに変えているので、asにリネームしてご利用ください。

正式な公開は早くても来月以降になります。

正式公開いたしました。詳しくはこちらの記事をご覧ください。

2007年9月9日日曜日

HSPスクリプトビューワ(Footy2)

Footy2とHHXモジュールによるスクリプトビューワ。機能は読み込みのみで、保存さえできません(^-^;

私がプログラミングを始めたころはリッチテキストを扱うなんてまさに雲の上のお話だったのですが、なべしんさんのおかげでとても簡単になりました。ちょっと信じ難いくらいお手軽です。

それとヘッダファイルFooty2.asを作成したので、なべしんさんの許可が降りたら公開したいと思います。
#include "../hsphelp/src/hhx_db.hsp"
#uselib "Footy2.dll"
#func Footy2Create "Footy2Create" int, int, int, int, int, int
#func Footy2Delete "Footy2Delete" int
#func Footy2TextFromFile "Footy2TextFromFileA" int, sptr, int
#func Footy2AddEmphasis "Footy2AddEmphasisA" int, sptr, sptr, int, int, int, int, int, int
#func Footy2FlushEmphasis "Footy2FlushEmphasis" int
// 独立レベル
/*ASCII記号用フラグ*/
#define global EMP_IND_PARENTHESIS 0x00000001//!< 前後に丸括弧()があることを許可する
#define global EMP_IND_BRACE 0x00000002//!< 前後に中括弧{}があることを許可する
#define global EMP_IND_ANGLE_BRACKET 0x00000004//!< 前後に山形括弧<>があることを許可する
#define global EMP_IND_SQUARE_BRACKET 0x00000008//!< 前後に各括弧[]があることを許可する
#define global EMP_IND_QUOTATION 0x00000010//!< 前後にコーテーション'"があることを許可する
#define global EMP_IND_UNDERBAR 0x00000020//!< 前後にアンダーバー_があることを許可する
#define global EMP_IND_OPERATORS 0x00000040//!< 前後に演算子 + - * / % ^  があることを許可する
#define global EMP_IND_OTHER_ASCII_SIGN 0x00000080//!< 前述のものを除く全てのASCII記号 # ! $ & | \ @ ?  .
/*ASCII文字列を指定するフラグ*/
#define global EMP_IND_NUMBER 0x00000100//!< 前後に数字を許可する
#define global EMP_IND_CAPITAL_ALPHABET 0x00000200//!< 前後に大文字アルファベットを許可する
#define global EMP_IND_SMALL_ALPHABET 0x00000400//!< 前後に小文字アルファベットを許可する
/*空白を指定するフラグ*/
#define global EMP_IND_SPACE 0x00001000//!< 前後に半角スペースを許可する
#define global EMP_IND_FULL_SPACE 0x00002000//!< 前後に全角スペースを許可する
#define global EMP_IND_TAB 0x00004000//!< 前後にタブを許可する
/*そのほかの文字列*/
#define global EMP_IND_JAPANESE 0x00010000//!< 日本語
#define global EMP_IND_KOREAN 0x00020000//!< 韓国語
#define global EMP_IND_EASTUROPE 0x00040000//!< 東ヨーロッパ
#define global EMP_IND_OTHERS 0x80000000//!< 上記以外
/*省略形(主にこれらを使用すると指定が楽です)*/
#define global EMP_IND_ASCII_SIGN 0x000000FF//!< 全てのASCII記号列を許可する
#define global EMP_IND_ASCII_LETTER 0x00000F00//!< 全てのASCII文字を許可する(数字とアルファベット)
#define global EMP_IND_BLANKS 0x0000F000//!< 全ての空白文字列を許可する
#define global EMP_IND_OTHER_CHARSETS 0xFFFF0000//!< 全てのキャラクタセットを許可する
#define global EMP_IND_ALLOW_ALL 0xFFFFFFFF//!< 何でもOK

// キャラクタセット
#enum global CSM_AUTOMATIC = 0

// ビュー状態
#enum global VIEWMODE_NORMAL = 0

#enum global EMP_INVALIDITY = 0//!< 無効
#enum global EMP_WORD//!< 単語を強調
#enum global EMP_LINE_AFTER//!< それ以降~行末
#enum global EMP_LINE_BETWEEN//!< 二つの文字の間(同一行に限る・二つの文字列を指定)
#enum global EMP_MULTI_BETWEEN//!< 二つの文字の間(複数行にわたる・二つの文字列を指定)

// 強調表示モード
#define global EMPFLAG_BOLD   0x00000001//!< 太字にする
#define global EMPFLAG_NON_CS 0x00000002//!< 大文字と小文字を区別しない
#define global EMPFLAG_HEAD   0x00000004//!< 頭にあるときのみ

// エラー
#define global FOOTY2ERR_NONE           0   //!< 関数が成功した
#define global FOOTY2ERR_ARGUMENT       -1  //!< 引数おかしい
#define global FOOTY2ERR_NOID           -2  //!< IDが見つからない
#define global FOOTY2ERR_MEMORY         -3  //!< メモリー不足
#define global FOOTY2ERR_NOUNDO         -4  //!< アンドゥ情報がこれ以前に見つからない
#define global FOOTY2ERR_NOTSELECTED    -5  //!< 選択されていない
#define global FOOTY2ERR_UNKNOWN        -6  //!< 不明なエラー
#define global FOOTY2ERR_NOTYET         -7  //!< 未実装(ごめんなさい)
#define global FOOTY2ERR_404            -8  //!< ファイルが見つからない、検索文字列が見つからない
#define global FOOTY2ERR_NOTACTIVE      -9  //!< アクティブなビューは存在しません
#define global FOOTY2ERR_ENCODER        -10 //!< 文字コードのエンコーダが見つかりません(ファイルのエンコード形式が不正です、バイナリとか)
#define global FOOTY2ERR_NOT_SELECTING  -11 //!< 選択していない

#define COLOR_COMMENT 0xcccccc
#define COLOR_COMMAND 0xcc00cc
#define COLOR_FUNC 0xffff00
#define COLOR_PREPROCESS 0xffcc00
#define COLOR_LABEL 0xffff00
#define COLOR_SYSVAR 0xcc9900
#define COLOR_MACRO 0xcc9900
#define COLOR_STRING 0x00ccff
    title "Footytest"
    Footy2Create hwnd, 0, 0, ginfo_winx, ginfo_winy, VIEWMODE_NORMAL
    if ( stat != FOOTY2ERR_NONE ) : end
    idFooty = stat

    // ファイルを読み込む
    dialog "hsp", 16
    if ( stat == 0 ) : end
    fileName = refstr
    Footy2TextFromFile idFooty, fileName, CSM_AUTOMATIC
    if ( stat != FOOTY2ERR_NONE ) : end

    // hsphelpディレクトリの存在を確認
    chdir dir_exe
    dirlist s, "hsphelp", 5 
    if ( stat == 0 ) : dialog "hsphelpディレクトリが見つかりません。", 1 : end
    chdir dir_exe + "/hsphelp"

    // HHXのデータベースをロード
    HHX_init_load_db
    if HHX_currentset_sum() ! HHX_diskset_sum() {
        // HSファイルに何かしらの変更が加わったため、データベースを再構築
        logmes "HHXのデータベースをリビルドしています..."
        HHX_init_rebuild_db DBR_READONLY
    } else {
        HHX_init_extract_db             // 配列変数hhxdataxにメモリ上のデータをロード
    }
    logmes "HHXのデータベースをロードしました。"

    // データベースから命令・関数をひとつずつ取り出し、その名前を列挙する
    db_num = HHX_select_all()           // すべての命令・関数などを検索対象とする(ABC順)
    sdim buf, 16000
    notesel buf
    repeat db_num
        c = HHX_get_next()              // 次の命令・関数などのナンバーを取得
        db_name  = hhxdata( c, C_NAME )
        db_group = hhxdata( c, C_GROUP )
        db_prm   = hhxdata( c, C_PRM )
        if instr( db_group, 0, "プリプロセッサ命令" ) >= 0 {
            ; プリプロセッサ
            Footy2AddEmphasis idFooty, db_name, 0, EMP_WORD, 0, 1, 1, EMP_IND_BLANKS, COLOR_PREPROCESS
        } else : if instr( db_group, 0, "システム変数" ) >= 0 {
            ; システム変数
            Footy2AddEmphasis idFooty, db_name, 0, EMP_WORD, 0, 1, 1, EMP_IND_BLANKS | EMP_IND_PARENTHESIS | EMP_IND_OTHER_ASCII_SIGN, COLOR_SYSVAR
        } else : if instr( db_group, 0, "マクロ" ) >= 0 {
            ; マクロ
            Footy2AddEmphasis idFooty, db_name, 0, EMP_WORD, 0, 1, 1, EMP_IND_BLANKS | EMP_IND_PARENTHESIS | EMP_IND_OTHER_ASCII_SIGN, COLOR_MACRO
        } else : if db_prm = "" {
            ; 引数なし(命令)
            Footy2AddEmphasis idFooty, db_name, 0, EMP_WORD, 0, 1, 1, EMP_IND_BLANKS, COLOR_COMMAND
        } else : if peek( db_prm ) = '(' {
            ; 関数型
            Footy2AddEmphasis idFooty, db_name, 0, EMP_WORD, 0, 1, 1, EMP_IND_BLANKS | EMP_IND_PARENTHESIS, COLOR_FUNC
        } else {
            ; 命令型
            Footy2AddEmphasis idFooty, db_name, 0, EMP_WORD, 0, 1, 1, EMP_IND_BLANKS, COLOR_COMMAND
        }
    loop
    // そのほかの色分け
    Footy2AddEmphasis idFooty, "/*", "*/", EMP_MULTI_BETWEEN, 0, 1, 1, EMP_IND_ALLOW_ALL, COLOR_COMMENT
    Footy2AddEmphasis idFooty, ";", 0, EMP_LINE_AFTER, 0, 1, 1, EMP_IND_ALLOW_ALL, COLOR_COMMENT
    Footy2AddEmphasis idFooty, "//", 0, EMP_LINE_AFTER, 0, 1, 1, EMP_IND_ALLOW_ALL, COLOR_COMMENT
    Footy2AddEmphasis idFooty, "*", 0, EMP_LINE_AFTER, EMPFLAG_HEAD, 1, 1, EMP_IND_ALLOW_ALL, COLOR_LABEL
    Footy2AddEmphasis idFooty, "{\"", "\"}", EMP_MULTI_BETWEEN, 0, 2, -1, EMP_IND_ALLOW_ALL, COLOR_STRING

    // 色分けを反映
    Footy2FlushEmphasis idFooty

    onexit *exit
    stop
*exit
    Footy2Delete FootyID
    end