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:
- http://live.gnome.org/Vala/GIOSamples - Vala言語でGIOを使用したサンプルコード集
使用したバージョン:
- Mono 1.9.1
- Vala 0.7.4