現在時刻 - 2018年6月23日(土) 06:00



新しいトピックを投稿する トピックへ返信する  [ 30 件の記事 ]  ページ移動 1つ前へ  1, 2
 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック 
作成者 メッセージ

登録日時: 2009年10月05日(月) 19:08
記事: 60
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
まず、以下のようなテンプレートを作って登録します。
コード:
package $(Package) $(CSLB){
   import jp.progression.casts.*;
   import jp.progression.commands.display.*;
   import jp.progression.commands.lists.*;
   import jp.progression.commands.net.*;
   import jp.progression.commands.tweens.*;
   import jp.progression.commands.*;
   import jp.progression.data.*;
   import jp.progression.events.*;
   import jp.progression.scenes.*;
   
   public class $(FileName) extends SerialList $(CSLB){
      
      public function $(FileName)( initObject:Object = null ) $(CSLB){
         super( initObject );
         
         addCommand(
            $(SelText)
         );
      }
     
      public override function clone():Command $(CSLB){
         return new $(FileName)( this );
      }
   }
}

つぎに、クラス化したいコマンド群を選択したまま、プロジェクトマネージャ上で任意の場所にさっきのテンプレートを使って新規クラスを作ります。
っていうのはいかがでしょうか?


2010年1月05日(火) 00:00
プライベートメッセージ送信

登録日時: 2009年10月05日(月) 19:08
記事: 60
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
とりあえず希望の動きはできるようになりました。
上に書いたテンプレートを、Tools の Application Files... から開くディレクトリの中の
Templates ディレクトリに CommandFromSelection.as.fdt として保存したうえで、
以下のようなマクロをくんでみました。

コード:
using System;
using System.IO;
using System.Collections;
using System.Windows.Forms;
using FlashDevelop;
using PluginCore;
using PluginCore.Managers;
using PluginCore.Helpers;
using ProjectManager.Projects;
using ScintillaNet;
using ProjectManager.Actions;

public class AddClassFromSelection
{
   
   public static void Execute()
   {
      if ( Globals.SciControl == null ) return;
      
      ScintillaControl sci = Globals.SciControl;
      
      string selectStr = sci.SelText;
      if ( selectStr.Length < 1 ) {
         MessageBox.Show("クラスにするコマンドを選択してください","エラー",MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
      }
      
      Project project = (Project) PluginBase.CurrentProject;
      if (project == null) return;
            
      MainForm mainform = (MainForm) Globals.MainForm;
      FlashDevelopActions flashDevelopActions = new FlashDevelopActions(mainform);
      FileActions fileActions = new FileActions(mainform, flashDevelopActions);
      
      String templatePath = PathHelper.TemplateDir + "\\CommandFromSelection.as.fdt";
      
      ITabbedDocument currentDocument = (ITabbedDocument) mainform.CurrentDocument;
      String parentPath = System.IO.Path.GetDirectoryName(currentDocument.FileName);
      
      fileActions.AddFileFromTemplate(project,parentPath,templatePath);
      String fileName = fileActions.ProcessArgs(project, "$(FileName)");
      
      String newFilePath = parentPath + "\\" + fileName + ".as";
      if (!File.Exists(newFilePath)) {
         TraceManager.Add( "キャンセルされました" );
         return;
      }
      
      StreamReader reader = new StreamReader(newFilePath);
      String value = reader.ReadToEnd();
      reader.Close();
      
      StreamWriter writer = new StreamWriter(newFilePath);
      writer.Write(fileActions.ProcessArgs(project, value));
      writer.Close();
      
      string insText = "new "+fileName+"()";
      sci.BeginUndoAction();
      sci.Clear();
      sci.InsertText(sci.CurrentPos, insText);
      sci.SelectionStart = sci.CurrentPos;
      sci.SelectionEnd = sci.CurrentPos + insText.Length;
      sci.EndUndoAction();
      
      TraceManager.Add( fileName + " が作成されました" );
   }

}


2010年1月05日(火) 05:09
プライベートメッセージ送信

登録日時: 2009年10月05日(月) 20:18
記事: 52
所在地: Japan
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
nium さんが書きました:
補完リストの中に表示というのがちょっと分かりませんでしたが、単純に as3proj ファイルと同じフォルダ内に as クラスがテキストファイルとして書き出されるようなものをイメージしていました。書き出し後は通常のクラスと同じように使う感じで、その後に何らかの置き換え操作などは想定していません。

Progression に限っているのは、定型フォーマット化しやすいために、選択範囲からクラスを生成させても問題なく使用できるためです。

Snippets にしてしまうと、挿入後は通常のソースコードになってしまい、後から修正等がしにくいので、クラスとして書き出せるのが個人的にはうれしいですね。

※マクロ機能をテキストファイルの書き出しは結構厳しいですか?

段違いの勘違いをしてました。すみません・・・。
matsumos さんがマクロを作ってくれたようです!
matsumos さん速い・・・。


2010年1月05日(火) 05:38
プライベートメッセージ送信 WWW

登録日時: 2009年10月05日(月) 20:18
記事: 52
所在地: Japan
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
ちょっと改造して、テンプレートが保存されていない場合、
新たにテンプレートを保存するようにしました。
それと、\ProjectFiles\AS3Project\ の方に保存している人もいるかもしれないのでそちら側も見るようにしました。

コード:
using System;
using System.IO;
using System.Collections;
using System.Windows.Forms;
using FlashDevelop;
using PluginCore;
using PluginCore.Managers;
using PluginCore.Helpers;
using ProjectManager.Projects;
using ScintillaNet;
using ProjectManager.Actions;

public class AddClassFromSelection
{
   private const String TEMP_PATH = "\\CommandFromSelection.as.fdt";
   
   public static void Execute()
   {
      if ( Globals.SciControl == null ) return;
      
      ScintillaControl sci = Globals.SciControl;
      
      string selectStr = sci.SelText;
      if ( selectStr.Length < 1 ) {
         MessageBox.Show("クラスにするコマンドを選択してください","エラー",MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
      }
      
      Project project = (Project) PluginBase.CurrentProject;
      if (project == null) return;
      
      MainForm mainform = (MainForm) Globals.MainForm;
      FlashDevelopActions flashDevelopActions = new FlashDevelopActions(mainform);
      FileActions fileActions = new FileActions(mainform, flashDevelopActions);
      
      String templatePath = PathHelper.TemplateDir + TEMP_PATH;
      if (!File.Exists(templatePath))
      {
         templatePath = PathHelper.TemplateDir + "\\ProjectFiles\\AS3Project" + TEMP_PATH;
         if (!File.Exists(templatePath))
         {
            StreamWriter tmpWriter = new StreamWriter(templatePath);
            tmpWriter.Write(TMP_FILE);
            tmpWriter.Close();
         }
      }
      
      ITabbedDocument currentDocument = (ITabbedDocument) mainform.CurrentDocument;
      String parentPath = System.IO.Path.GetDirectoryName(currentDocument.FileName);
      
      fileActions.AddFileFromTemplate(project,parentPath,templatePath);
      String fileName = fileActions.ProcessArgs(project, "$(FileName)");
      
      String newFilePath = parentPath + "\\" + fileName + ".as";
      if (!File.Exists(newFilePath)) {
         TraceManager.Add( "キャンセルされました" );
         return;
      }
      
      StreamReader reader = new StreamReader(newFilePath);
      String value = reader.ReadToEnd();
      reader.Close();
      
      StreamWriter writer = new StreamWriter(newFilePath);
      writer.Write(fileActions.ProcessArgs(project, value));
      writer.Close();
      
      string insText = "new "+fileName+"()";
      sci.BeginUndoAction();
      sci.Clear();
      sci.InsertText(sci.CurrentPos, insText);
      sci.SelectionStart = sci.CurrentPos;
      sci.SelectionEnd = sci.CurrentPos + insText.Length;
      sci.EndUndoAction();
      TraceManager.Add( fileName + " が作成されました" );
   }
   
private const String TMP_FILE = @"package $(Package) $(CSLB){
   import jp.progression.casts.*;
   import jp.progression.commands.display.*;
   import jp.progression.commands.lists.*;
   import jp.progression.commands.net.*;
   import jp.progression.commands.tweens.*;
   import jp.progression.commands.*;
   import jp.progression.data.*;
   import jp.progression.events.*;
   import jp.progression.scenes.*;

   public class $(FileName) extends SerialList $(CSLB){
      public function $(FileName)( initObject:Object = null ) $(CSLB){
         super( initObject );
         
         addCommand(
            $(SelText)
         );
      }
      
      public override function clone():Command $(CSLB){
         return new $(FileName)( this );
      }
   }
}";
}


2010年1月05日(火) 06:50
プライベートメッセージ送信 WWW

登録日時: 2009年10月08日(木) 12:47
記事: 37
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
>bkzenさん、matsumosさん

とても素敵なマクロだったので、早速使わせて頂きました!

僕の場合は、下記リンクのProgressionのテンプレートを使っているので、(テンプレートの)パスを変更しちゃいました! すいませんっ!

http://flabaka.com/blog/?p=1658

変更したのは、一カ所だけです。

templatePath = PathHelper.TemplateDir + "\\ProjectFiles\\AS3Project\\Progression4" + TEMP_PATH;

あと、外部クラス化したコマンドの(addCommand内の)1行目には、インデントが(自動で)掛からないみたいなので、これを何とかしたいなぁ…と。

あれこれ弄っているので、上手くいったら、お知らせしま~す!


2010年1月05日(火) 13:14
プライベートメッセージ送信

登録日時: 2009年10月05日(月) 20:18
記事: 52
所在地: Japan
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
flabaka さんが書きました:
変更したのは、一カ所だけです。

templatePath = PathHelper.TemplateDir + "\\ProjectFiles\\AS3Project\\Progression4" + TEMP_PATH;


確かに、自分も作ったはいいけど Add の直下が増えていくのは微妙だなと思ってましたw
flabaka さんの方法がよさそうだと思います!

flabaka さんが書きました:
あと、外部クラス化したコマンドの(addCommand内の)1行目には、インデントが(自動で)掛からないみたいなので、これを何とかしたいなぁ…と。

あれこれ弄っているので、上手くいったら、お知らせしま~す!

確かにインデントをもうちょっと何とかしたいと思って朝やってましたが、
正規表現に弱い自分ではなかなかうまくいきませんでしたw
がんばってください!


2010年1月05日(火) 14:43
プライベートメッセージ送信 WWW

登録日時: 2010年1月04日(月) 20:59
記事: 3
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
マクロの使い方でつまずいて、テストできていませんでしたが、flabaka さんのエントリーを見て動かすことができました!

これはすごい便利ですね!

正規表現については、C? はちょっと分からないんですが、AS のコードを貼り付けたら移植とかは可能ですか?
可能そうであれば、ちょっとやってみますね。


2010年1月06日(水) 13:52
プライベートメッセージ送信

登録日時: 2009年10月08日(木) 12:47
記事: 37
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
>niumさん

お役に立てたようで、良かったです。

現在、マクロを使って作成されるファイルは、SerialList限定になっていますよね?

そこをSerialListかParallelListを選択出来るようにしてみました。

コード:
public class $(FileName) extends $$(ListType=SerialList,ParallelList) $(CSLB){


こんな感じにしてあげると、ファイル作成時に選択可能になります。(89行目あたり)

詳しくはブログに追記しておきましたので、ご覧頂ければと思います。

http://flabaka.com/blog/?p=2102


2010年1月06日(水) 15:59
プライベートメッセージ送信

登録日時: 2009年10月05日(月) 19:08
記事: 60
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
> nium さん
正規表現書いてくださるということであればお願いします!
がんばって組み込んでみます。


2010年1月06日(水) 16:35
プライベートメッセージ送信

登録日時: 2009年10月05日(月) 19:08
記事: 60
投稿記事 Re: 「これってできる?」「こういう機能があるといいなー」って思ったことを書くトピック
とりあえず、いままでのぶんをコミットしておきました。
http://code.google.com/p/flashdevelopjp ... lection.cs
Progression のテンプレートらしく(?)充実したコメントも入れておきました。
文字化け対策もしました。

で、問題が見つかりました。
マクロを実行するより先に、Project パネルの右クリックメニュー Add・・・ からテンプレートを作成していた場合におかしくなります。
理由はわかってるんですけど、どう対策したらいいかわかっていません。
もしかしたらプラグインにしないとだめかもしれません・・・


2010年1月06日(水) 20:19
プライベートメッセージ送信
期間内表示:  ソート  
新しいトピックを投稿する トピックへ返信する  [ 30 件の記事 ]  ページ移動 1つ前へ  1, 2


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

ページ移動:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by Vjacheslav Trushkin for Free Forums/DivisionCore.
Japanese translation principally by ocean