Menu

#98 タイプ別設定のインポート、エクスポート、初期化の追加

closed
nobody
None
5
2012-11-09
2010-04-15
Uchi
No

タイプ別設定のインポート、エクスポート、初期化を追加するパッチを作成しました。
「タイプ別設定一覧」に「インポート」「エクスポート」「初期化」のボタンを追加しました。
タイプを選択し、各ボタンをクリックします。

「インポート」「エクスポート」するファイルの形式は、
ファイル名の初期値は"[設定の名称].ini"、
形式は、"sakuraW.ini" の[Types(n)]のセクションを[Type]として、
[TypeEx]セクションとして「共通設定」との結合情報を格納します。
具体的のは、強調キーワード1~10とプラグイン情報です。

「エクスポート」時、強調キーワードが設定されていたならば、強調キーワードもエクスポートします。
ファイル名は「セット名」から自動的に作成されます。
「インポート」時にはエクスポート時に記録したファイルからインポートします。

プラグイン情報は、
「エクスポート」時、ウトライン、スマートインデントのフォルダ名とIDを記録します。
「インポート」時の記録しているIDを元に検索し、存在したならば、設定します。

「初期化」は、タイプ別設定の「基本」をコピーすることにより行います。

以上感想等お待ちしています。

Discussion

  • Uchi

    Uchi - 2010-04-15

    タイプ別設定のインポート、エクスポート、初期化の追加

     
  • Moca

    Moca - 2010-04-15

    似たようなというか「初期化」だけ、同じ機能を作ってしまったところでこのパッチを見つけました。
    コードをみてみました。まだ動かしてません。
    Import後のIdxの設定もきちんとしてあるし、よさそうです。

    新ShareData_IO_Typesは
    処理が違うのなら、別関数にしたほうがいいとおもいます。
    ShareData_IO_TypeAll:ShareData_IO_Typeを使って全部読む版
    ShareData_IO_Type:1個読む版。SecNameとSTypeConfigは引数で指定
    のような感じのほうがいいとおもいます。
    私もつい少ない変更で書けるので引数を増やしがちだけど、
    処理内容が異なってくると、後でつらくなってくるので、最近考えを改めました。
     あとは、インポート時に設定ファイルVerを確認していないところと、ファイルが偽者だった場合が少し気がかりです。

    これは要望:
    もともとあるインポート/エクスポートの処理がダイアログべったりなのが、いけないのだけど、
    キーワード読み込みとか共通化できるのなら、どこかへ追い出したいです。
    F_PLUGCOMMAND_FIRST + iPIdx * 100なども共通処理なら、
    staticでかまわないと思うので、CPluginかどこかで1個だけにしたいところです。

    いつもUchiさんは仕事が速いので追加注文というか勝手な妄想を書いておきます。
    ・複数色セットから色を選ぶ機能がほしい
    同じタイプ別でも、黒版、白版、灰色版、ローコントラスト、のように複数作った場合、1ファイルに統合できるといいとおもいます。
    これは、ダウンロードするときには、「PHPのタイプ別設定」を1つ拾ってきて、後でテーマ的なものは好きに選択できるというのを想定しています。
    ・取り込むときに「タイプ別設定:xxxx」のような表示確認(色選択が実装されるなら同じ画面で表示)
    ファイル名を日本語にすれば、いらないけど、インターネットで拾ってくるとファイル名が変なことが多いので。
    どちらも圧縮ファイルにすれば済みそうなのとオーバースペック気味なので、運用してみないと分からないですね。

    ちなみに私のほうは、えせ可変長Types版(だけどあいからわらず30制限)を作ってる途中で、
    タイプの「コピー」「貼り付け」「利用中のは変更禁止」「削除」でini削減と
    タイプの上下移動への布石という予定です。
    しかしインポートがあれば、コピー貼り付け(クリップボードではない)はいらないかなぁ
    ただし派生のしかたをミスしてすぐには出せません。

     
  • Uchi

    Uchi - 2010-04-16

    mocaさん査読ありがとうございます。

    それで、質問なのですけれども

    もともとあるインポート/エクスポートの処理がダイアログべったりなのが、いけないのだけど、
    キーワード読み込みとか共通化できるのなら、どこかへ追い出したいです。
    は、インポートエクスポートマネージャみたいなクラスを作成する、といった意味でしょうか。
    色や強調キーワード等も外出しをする、のような感じのイメージでしょうか?

     
  • Moca

    Moca - 2010-04-16

    >色や強調キーワード等も外出しをする
    のほうです(たぶん)。
    なんというかシリアライザ的なものまでを考えていました。
    ユーザー問い合わせのダイアログのフォルダ設定と拡張子の指定を考えると、
    確かにインポートアウトポート管理クラスがあったほうがいいかもしれないですね。
    労力が大変なので、そこまでは考えていませんでした。

    強調キーワードファイルは「//がコメント行で改行で区切られた1行がキーワード」
    という定義をどの関数(or クラス)が決定しているかということが大事です。
    それが2ヶ所あると、実装に差がある場合、どちらにあわせるべきか分からなくなってしまいます。
    たとえばCKeyWordSetMgrがある程度IOもやってくれて、
    「kwdファイルのフォーマットはCKeyWordSetMgr::ExportKeyword()」の実装が唯一の定義元(もちろんインポート管理クラスでもいい)となると、ありがたいです。

    #Grepして同じ修正を何箇所もするのが大変なのと、
    #最近パッチの書きすぎで、実行ファイルサイズが気になるのもあってつい神経質に。

     
  • Uchi

    Uchi - 2010-04-19

    mocaさんの指摘、要望にしたがって
    手直ししたものを、アップします。

    外部仕様的には
    ・複数色セットから色を選ぶ機能がほしい
    ・取り込むときに「タイプ別設定:xxxx」のような表示確認(色選択が実装されるなら同じ画面で表示)
    当たりの対応があります。

    mocaさんの要望はこんなものでしょうか?

    もともとあるインポート/エクスポートの処理がダイアログべったりなのが、いけないのだけど、
    キーワード読み込みとか共通化できるのなら、どこかへ追い出したいです。
    には、まだ対応していません。
    こちらあたりも、ぼちぼち対応していく心算ですが、まだ手が付いていません。

     
  • Uchi

    Uchi - 2010-04-19

    mocaさんの指摘、要望による手直し

     
  • Moca

    Moca - 2010-04-19

    ini。テストを兼ねて

     
  • Moca

    Moca - 2010-04-19

    パッチの斜め読みとコンパイルして実行してみました。
    CDogTypeList.cpp 415: auto_strcpy( buff, cKeyWordSetMgr.GetTypeName のところで
    NULLポインタで落ちる原因を探るのに時間がかかてしまいました。
    原因は、自分のiniをコピーしてきたら、それのKeyWordSetIdxが狂っていて
    (多分ひそかに開発中のパッチのバグ)keywordsetが11個しかないのに16になってた...
     新画面のはsakuraw.iniではなくて、エキスポートしたiniの中に複数色から設定できるといいなと思っていたのですが、
    色の設定は結局人によって違うので、今のUchiさんの実装のほうが便利に思います。
    「タイプ別設定:xx」て書いたのが誤解の元だった。でも便利になったから結果OKということで。
     ついでに自分のC/C++設定に近い白背景とHTMLを添付しておきました。
     そのなかの、cpp.iniというのがcpp_Blackとcpp_Whiteを両方含んだiniで、こんな感じのファイルがあれば、1ファイルでできるかなと。どうやってエキスポートすればいいかわからないけど。2ファイル添付すればいいので、これにこだわってはいません。
    コード的な話については、またコードを読んでから明日?以降にコメントすると思います。

     
  • Uchi

    Uchi - 2010-04-20

    ファイルのほうからの複数選択ということでちょっと作ってみました。
    一度にexportすることはあきらめて、タイプ別のexportファイルがあるフォルダに、色設定のexportファイル(*.col)が在った場合、インポートのドロップダウンで選択できるようにしてみました。
    mocaさんの希望とはちょっと違うかもしれませんが、ご感想お待ちしております。

    追記
    今回のパッチはデモ的なものです。
    のでVersionがB3(β3)にしてあります。

     
  • Uchi

    Uchi - 2010-04-20

    *.colファイル対応

     
  • Moca

    Moca - 2010-04-20

    コードの内容・外部仕様はかなりいいと思います。
    コメントするものがあまりないので、名前とか場所とか動作以外のことについて書いておきます。

    特殊なHackでないならincludeはファイルの上のほうに並べてください。
    sakura.hhが変なところにあるのは、元々#if 0 で区切っていた中にあったので、それで離れて置かれています。今は最後に並べておけばOKです。

    CDlgTypeList.cpp

    static wchar_t pszSecTypeEx[]
    static const wchar_t pszSecTypeEx* 推奨。[]だと書換えられるようにコピーが発生するとおもう。staticはお好みで。
    CDlgTypeList::Initialize()
    細かいことだけどclassのイニシャライザに見えます。
    CShareData* pcShare = CShareData::getInstance();
    未使用
    bool CDlgTypeList::Import_KeyWord
    return FALSE;
    結果は同じだけど return false;

    CDlgTypeList.h/CDlgTypeAscertain.h

    using namespace std;
    using std::wstring; とかで我慢してください。
    共通ヘッダでそうなっていれば...と最近コードみてて思う。
    CDlgTypeAscertain::SInterface
    interfaceはオブジェクト指向用語で使っているので誤解を招く名前です。
    SChooseTypeInfoとかのほうがいいかも。

    CShareData_IO.h

    ShareData_IO_Type_One( CDataProfile&, int, WCHAR * );
    ShareData_IO_Type_One( CDataProfile&, int, const WCHAR * );

    おまけ:
    TCHAR,WCHAR変換大変そう。sprintfよりto_wchar/to_tcharが楽だと思うけど、何か理由とかありますか?

    wcspbrk
    なにこれ便利。strtok全廃できるんじゃないか

    B3:ベータだけど突っ込み
    ・FindFistのFindClose
    すみません。こっちはまだ動かしてません。

     
  • Uchi

    Uchi - 2010-04-24

    やっとImport,Exportの外だしが出来ました。
    (ここまでする木は無かったのだが)
    あと、Rev1754が入ったようなので #include の整理してみました。
    (といっても使わないのをコメントアウトにしただけ)

    仕様的には、タイプ別設定の Export ファイルの
    [Other]セクション名を[Info]に変更しました。

    ご感想お待ちしております。

     
  • Uchi

    Uchi - 2010-04-24

    Import,Exportの外だし付き

     
  • Nobody/Anonymous

    Commitしました

     
  • Moca

    Moca - 2010-05-03

    コミット済みになっていますが、こちらへ書いておきます。
    投稿後すぐ見始めたのですが大作だったので、途中で寝てそのままにしてました;

    引っ越した/削除したコードは基本的にコメントアウトで残さないでください。
    ただし、includeのコメントアウトのうち、たまたまstdafx.hがincludeしているからコメントアウトしてある後で戻すかもしれないか意味がありそうな部分と、
    sakura.hhの利用済みIDなどは有用だとおもいます。

    TCHAR* szPath = (TCHAR*)to_tchar( sFileName.c_str() )
    const TCHAR* szPath = to_tchar( sFileName.c_str() );でconstの問題はないはず。
    CImpExpRegex::ImportのCPropTypesは、実は
    CRegexKeyword::RegexKeyCheckSyntaxと同じなので、この依存性は解消できます。
    #if _UNICODE sPath = szPath; #else sPath = to_wchar(szPath); #endif
    to_wcharはオーバーライドされていて#ifdefがなくても同じ動作をします。
    と思ったら、CImpExpManager::MakeFullPathはそうなってました。

    以下、大改修になると思うので、だだのメモと思ってください。
    CImpExpKeyHelp::Importなどがダイアログ画面に依存しています。
    メッセージ表示のために親ウィンドウとして使うのは良いことだと思います。
    しかし内部構造にアクセスするのは見つけにくい依存関係になってしまいます。
    可能なら分離推奨です。できないなら、引数の説明が必須です。
    それか依存元のダイアログクラスを引数にします。

    (ANSIビルドではto_tchar/to_wcharの結果のポインタを離れたところで再利用すると怖いです、Unicode版ではOK)

    TypeImpExp_1754_v4.zipとコミット内容が違うようなので、
    Trackerのほうにも違うとだけ一言書いてあると、
    (内容が同じときは)後でrevとパッチを見比べる作業をしなくてよくなるので、助かります。
    なぜか差分作ると時間かかるのでリビジョンの変更差分を添付しておきます。diff_r1754_r1755.zip

     
  • Moca

    Moca - 2010-05-03
     

Log in to post a comment.