試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GTK+の最近使用したファイル一覧にファイルを追加するコードをValaとC#で作成

PyGTKで最近開いたファイルを記憶する」で最近使用したファイル一覧へファイルを追加するためのコードをPython(PyGTK)で記述したが、ここでは同じことをC#言語(Gtk#)とVala言語で書いてみた。
(2009/7/10)ボタンのラベルなどの微調整を行った。

C#(Gtk#)

[任意]ファイル名: RecentManagerTest.cs

using System.IO;
using System;
using Gtk;

/*
 * gmcs -out:RecentManagerTest.exe RecentManagerTest.cs -pkg:gtk-sharp-2.0
 */

namespace RecentManagerTest
{
  class MainWindow : Gtk.Window
  {
    Gtk.AccelGroup accelgroup;
    Gtk.ImageMenuItem item_quit;
    Gtk.Menu menu_file;
    Gtk.MenuItem item_file;
    Gtk.MenuBar menubar;
    Gtk.Button button;
    Gtk.VBox vbox;
    Gtk.RecentManager recents;
    public MainWindow () : base (Gtk.WindowType.Toplevel)
    {
      /* ショートカットキー(アクセラレータ) */
      this.accelgroup = new Gtk.AccelGroup ();
      this.AddAccelGroup (this.accelgroup);
      /* メニュー項目 */
      this.item_quit = new Gtk.ImageMenuItem (Gtk.Stock.Quit, this.accelgroup);
      this.menu_file = new Gtk.Menu ();
      this.menu_file.Add (this.item_quit);
      this.item_file = new Gtk.MenuItem ("_File");
      this.item_file.Submenu = this.menu_file;
      this.menubar = new Gtk.MenuBar ();
      this.menubar.Append (this.item_file);
      /* ボタン */
      this.button = new Gtk.Button ("Select a f_ile");
      /* レイアウト用コンテナ */
      this.vbox = new Gtk.VBox (false, 0);
      this.vbox.PackStart (this.menubar, false, false, 0);
      this.vbox.PackStart (this.button, true, true, 0);
      /* シグナル */
      this.Destroyed += new EventHandler (this.OnQuit);
      this.item_quit.Activated += new EventHandler (this.OnQuit);
      this.button.Clicked += new EventHandler (this.OnButtonClicked);
      /* ウィンドウ */
      this.Add (this.vbox);
      this.SetSizeRequest (200, 150);
      /* 最近開いた項目の管理 */
      this.recents = Gtk.RecentManager.Default;
    }
    void OnButtonClicked (object sender, System.EventArgs e)
    {
      int response;
      string infile;
      Gtk.FileChooserDialog chooserdlg = new FileChooserDialog ("Open file", this,  Gtk.FileChooserAction.Open, Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, Gtk.Stock.Open, Gtk.ResponseType.Ok);
      chooserdlg.LocalOnly = true;
      response = chooserdlg.Run ();
      infile = chooserdlg.Filename;
      chooserdlg.Destroy ();
      if ((Gtk.ResponseType) response == Gtk.ResponseType.Ok)
      {
        try
        {
          /* このコードでは実際に読み込み処理はしないのでこのストリームは未使用(警告が出る) */
          System.IO.FileStream in_stream = new FileStream (infile, FileMode.Open);
          /* 正常にファイルが開けたら「最近開いたファイル」に追加する */
          this.recents.AddItem ("file://" + infile);
        }
        catch (System.IO.IOException ex)
        {
          Gtk.MessageDialog errdlg = new MessageDialog (null, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, String.Format ("Cannot open file {0}: {1}", infile, ex.Message));
          errdlg.Title = "Open failed";
          errdlg.Run ();
          errdlg.Destroy ();
        }
      }
    }
    void OnQuit (object sender, System.EventArgs e)
    {
      Application.Quit ();
    }
  }
  class MainClass
  {
    public static void Main (string[] args)
    {
      Application.Init ();
      MainWindow win = new MainWindow ();
      win.ShowAll ();
      Application.Run ();
    }
  }
}

文字列のフォーマット付けにはString.Format()を使用している。System.Console.Write()系関数のように、値が入る部分には「{0}」「{1}」のように番号を記述する。

Vala

[任意]ファイル名: recentmanagertest.vala

using GLib;
using Gtk;

/*
 * valac --pkg gtk+-2.0 --pkg gio-2.0 -o recentmanagertest recentmanagertest.vala
 */

namespace RecentManagerTest
{
  class MainWindow : Gtk.Window
  {
    Gtk.AccelGroup accelgroup;
    Gtk.ImageMenuItem item_quit;
    Gtk.Menu menu_file;
    Gtk.MenuItem item_file;
    Gtk.MenuBar menubar;
    Gtk.Button button;
    Gtk.VBox vbox;
    Gtk.RecentManager recents;
    public MainWindow ()
    {
      /* ショートカットキー(アクセラレータ) */
      this.accelgroup = new Gtk.AccelGroup ();
      this.add_accel_group (this.accelgroup);
      /* メニュー項目 */
      this.item_quit = new Gtk.ImageMenuItem.from_stock (Gtk.STOCK_QUIT, this.accelgroup);
      this.menu_file = new Gtk.Menu ();
      this.menu_file.add (this.item_quit);
      this.item_file = new Gtk.MenuItem.with_mnemonic ("_File");
      this.item_file.set_submenu (this.menu_file);
      this.menubar = new Gtk.MenuBar ();
      this.menubar.append (this.item_file);
      /* ボタン */
      this.button = new Gtk.Button.with_mnemonic ("Select a f_ile");
      /* レイアウト用コンテナ */
      this.vbox = new Gtk.VBox (false, 0);
      this.vbox.pack_start (this.menubar, false, false, 0);
      this.vbox.pack_start (this.button, true, true, 0);
      /* シグナル */
      this.destroy += Gtk.main_quit;
      this.item_quit.activate += Gtk.main_quit;
      this.button.clicked += this.on_button_clicked;
      /* ウィンドウ */
      this.add (this.vbox);
      this.set_size_request (200, 150);
      /* 最近開いた項目の管理 */
      this.recents = Gtk.RecentManager.get_default ();
    }
    void on_button_clicked ()
    {
      int response;
      string infile;
      Gtk.FileChooserDialog chooserdlg = new FileChooserDialog ("Open file", this,  Gtk.FileChooserAction.OPEN, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK);
      chooserdlg.local_only = true;
      response = chooserdlg.run ();
      infile = chooserdlg.get_filename ();
      chooserdlg.destroy ();
      if (response == Gtk.ResponseType.OK)
      {
        GLib.File f_in = GLib.File.new_for_path (infile);
        try
        {
          /* このコードでは実際に読み込み処理はしないのでこのストリームは未使用(警告が出る) */
          GLib.DataInputStream in_stream = new DataInputStream (f_in.read (null));
          /* 正常にファイルが開けたら「最近開いたファイル」に追加する */
          this.recents.add_item ("file://" + infile);
        }
        catch (GLib.Error e)
        {
          Gtk.MessageDialog errdlg = new MessageDialog (null, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "Cannot open file %s: %s".printf (infile, e.message));
          errdlg.set_title ("Open failed");
          errdlg.run ();
          errdlg.destroy ();
        }
      }
    }
  }
  class MainClass
  {
    public static void main (string[] args)
    {
      Gtk.init (ref args);
      MainWindow win = new MainWindow ();
      win.show_all ();
      Gtk.main ();
    }
  }
}

関連記事:

参考URL:

使用したバージョン:

  • Mono 1.9.1
  • Vala 0.7.4