254 lines
8.2 KiB
Vala
254 lines
8.2 KiB
Vala
namespace LAview.Desktop {
|
|
|
|
using Gtk;
|
|
|
|
/**
|
|
* Preferences window.
|
|
*/
|
|
public class PreferencesDialog {
|
|
Dialog dialog;
|
|
Gtk.ListStore liststore_data;
|
|
Gtk.ListStore liststore_objects;
|
|
FileChooserButton filechooserbutton_lyx;
|
|
FileChooserButton filechooserbutton_latexmk;
|
|
FileChooserButton filechooserbutton_perl;
|
|
TreeView treeview_data;
|
|
TreeView treeview_protocol_objects;
|
|
|
|
public PreferencesDialog (Gtk.Application application, Window parent) throws Error {
|
|
var builder = new Builder ();
|
|
builder.add_from_file (AppDirs.ui_dir + "/laview-desktop.glade");
|
|
builder.connect_signals (this);
|
|
|
|
dialog = builder.get_object ("preferences_window") as Dialog;
|
|
dialog.transient_for = parent;
|
|
dialog.modal = true;
|
|
//dialog.application = application;
|
|
dialog.delete_event.connect ((source) => {return true;});
|
|
liststore_data = builder.get_object ("liststore_data") as Gtk.ListStore;
|
|
liststore_objects = builder.get_object ("liststore_protocol_objects") as Gtk.ListStore;
|
|
filechooserbutton_lyx = builder.get_object ("filechooserbutton_lyx") as FileChooserButton;
|
|
filechooserbutton_latexmk = builder.get_object ("filechooserbutton_latexmk") as FileChooserButton;
|
|
filechooserbutton_perl = builder.get_object ("filechooserbutton_perl") as FileChooserButton;
|
|
treeview_data = builder.get_object ("treeview_data") as TreeView;
|
|
treeview_protocol_objects = builder.get_object ("treeview_protocol_objects") as TreeView;
|
|
|
|
fill_liststore_data ();
|
|
fill_liststore_objects ();
|
|
|
|
filechooserbutton_lyx.set_filename (AppCore.core.lyx_path);
|
|
filechooserbutton_latexmk.set_filename (AppCore.core.latexmk_pl_path);
|
|
filechooserbutton_perl.set_filename (AppCore.core.perl_path);
|
|
}
|
|
|
|
void fill_liststore_data () {
|
|
liststore_data.clear();
|
|
TreeIter iter = TreeIter();
|
|
foreach (var p in AppCore.core.data_plugins.entries) {
|
|
liststore_data.append (out iter);
|
|
liststore_data.set (iter, 0, p.value.get_readable_name ());
|
|
}
|
|
}
|
|
|
|
void fill_liststore_objects () {
|
|
liststore_objects.clear();
|
|
TreeIter iter = TreeIter();
|
|
foreach (var p in AppCore.core.object_plugins.entries) {
|
|
liststore_objects.append (out iter);
|
|
liststore_objects.set (iter, 0, p.value.get_readable_name ());
|
|
}
|
|
}
|
|
|
|
public void show_all () {
|
|
dialog.show_all ();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void button_close_clicked (Button button) {
|
|
dialog.hide ();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void lyx_file_set (FileChooserButton chooser) {
|
|
AppCore.core.lyx_path = chooser.get_filename ();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void latexmk_file_set (FileChooserButton chooser) {
|
|
AppCore.core.latexmk_pl_path = chooser.get_filename ();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void perl_file_set (FileChooserButton chooser) {
|
|
AppCore.core.perl_path = chooser.get_filename ();
|
|
}
|
|
|
|
int[] get_data_indices () {
|
|
var selection = treeview_data.get_selection ();
|
|
var selected_rows = selection.get_selected_rows (null);
|
|
int[] indices = {};
|
|
foreach (var r in selected_rows) {
|
|
indices += r.get_indices()[0];
|
|
}
|
|
return indices;
|
|
}
|
|
|
|
int[] get_objects_indices () {
|
|
var selection = treeview_protocol_objects.get_selection ();
|
|
var selected_rows = selection.get_selected_rows (null);
|
|
int[] indices = {};
|
|
foreach (var r in selected_rows) {
|
|
indices += r.get_indices()[0];
|
|
}
|
|
return indices;
|
|
}
|
|
|
|
void call_data_preferences () {
|
|
var indices = get_data_indices ();
|
|
var i = indices[0];
|
|
foreach (var p in AppCore.core.data_plugins.entries)
|
|
if (i-- == 0) {
|
|
try {
|
|
p.value.preferences(dialog);
|
|
break;
|
|
} catch (Error err) {
|
|
var msg = new MessageDialog (dialog, DialogFlags.MODAL, MessageType.ERROR,
|
|
ButtonsType.CLOSE, _("Error: ")+err.message);
|
|
msg.response.connect ((response_id) => { msg.destroy (); } );
|
|
msg.show ();
|
|
}
|
|
}
|
|
}
|
|
|
|
void call_object_preferences () {
|
|
var indices = get_objects_indices ();
|
|
var i = indices[0];
|
|
foreach (var p in AppCore.core.object_plugins.entries)
|
|
if (i-- == 0) {
|
|
try {
|
|
p.value.preferences(dialog);
|
|
break;
|
|
} catch (Error err) {
|
|
var msg = new MessageDialog (dialog, DialogFlags.MODAL, MessageType.ERROR,
|
|
ButtonsType.CLOSE, _("Error: ")+err.message);
|
|
msg.response.connect ((response_id) => { msg.destroy (); } );
|
|
msg.show ();
|
|
}
|
|
}
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void button_data_preferences_clicked (Button button) {
|
|
call_data_preferences();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void button_object_preferences_clicked (Button button) {
|
|
call_object_preferences();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void data_row_activated (Gtk.TreeView treeview,
|
|
Gtk.TreePath path,
|
|
Gtk.TreeViewColumn column) {
|
|
call_data_preferences();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void objects_row_activated (Gtk.TreeView treeview,
|
|
Gtk.TreePath path,
|
|
Gtk.TreeViewColumn column) {
|
|
call_object_preferences();
|
|
}
|
|
|
|
[CCode (instance_pos = -1)]
|
|
public void button_search_clicked (Button button) {
|
|
|
|
#if (UNIX)
|
|
var msg = new MessageDialog (dialog, DialogFlags.MODAL, MessageType.INFO,
|
|
ButtonsType.CLOSE, _("You are on Unix, bro! :-)"));
|
|
msg.response.connect ((response_id) => { msg.destroy (); } );
|
|
msg.show ();
|
|
#elif (WINDOWS)
|
|
if (!File.new_for_path(AppCore.core.lyx_path).query_exists()) {
|
|
string[] lyx_dirs = { "c:\\Program Files", "c:\\Program Files (x86)",
|
|
"c:\\msys64\\mingw64", "c:\\msys64\\mingw32" };
|
|
try {
|
|
foreach (var directory in lyx_dirs) {
|
|
Dir dir = Dir.open (directory, 0);
|
|
string? name = null;
|
|
|
|
while ((name = dir.read_name()) != null) {
|
|
if (/^(lyx|mingw)/i.match(name)) {
|
|
var lyx_path = directory+"\\"+name+"\\bin\\lyx.exe";
|
|
if (File.new_for_path(lyx_path).query_exists()) {
|
|
filechooserbutton_lyx.set_filename (lyx_path);
|
|
AppCore.core.lyx_path = lyx_path;
|
|
break;
|
|
} else {
|
|
name = null;
|
|
}
|
|
} else {
|
|
name = null;
|
|
}
|
|
}
|
|
if (name != null) break;
|
|
}
|
|
} catch (FileError err) {
|
|
}
|
|
}
|
|
|
|
if (!File.new_for_path(AppCore.core.latexmk_pl_path).query_exists()) {
|
|
string[] latexmk_pl_dirs = { "c:\\Program Files", "c:\\Program Files (x86)",
|
|
"c:\\", "c:\\texlive" };
|
|
try {
|
|
foreach (var directory in latexmk_pl_dirs) {
|
|
Dir dir = Dir.open (directory, 0);
|
|
string? name = null;
|
|
|
|
while ((name = dir.read_name()) != null) {
|
|
if (/^(miktex|20[0-9][0-9])/i.match(name)) {
|
|
string[] suffixes = { "scripts\\latexmk\\perl\\latexmk.pl",
|
|
"texmkf-dist\\scripts\\latexmk\\latexmk.pl" };
|
|
foreach (var suffix in suffixes) {
|
|
var latexmk_pl_path = directory+"\\"+name+"\\"+suffix;
|
|
if (File.new_for_path(latexmk_pl_path).query_exists()) {
|
|
filechooserbutton_latexmk.set_filename (latexmk_pl_path);
|
|
AppCore.core.latexmk_pl_path = latexmk_pl_path;
|
|
break;
|
|
} else {
|
|
name = null;
|
|
}
|
|
}
|
|
if (name != null) break;
|
|
} else {
|
|
name = null;
|
|
}
|
|
}
|
|
if (name != null) break;
|
|
}
|
|
} catch (FileError err) {
|
|
}
|
|
}
|
|
|
|
if (!File.new_for_path(AppCore.core.perl_path).query_exists()) {
|
|
var path = AppDirs.exec_dir.get_path() + "\\perl.exe";
|
|
if (File.new_for_path(path).query_exists()) {
|
|
filechooserbutton_perl.set_filename (path);
|
|
AppCore.core.perl_path = path;
|
|
}
|
|
}
|
|
|
|
if ( !File.new_for_path(AppCore.core.lyx_path).query_exists()
|
|
|| !File.new_for_path(AppCore.core.latexmk_pl_path).query_exists()
|
|
|| !File.new_for_path(AppCore.core.perl_path).query_exists()) {
|
|
var msg = new MessageDialog (dialog, DialogFlags.MODAL, MessageType.WARNING,
|
|
ButtonsType.CLOSE, _("Warning: ")+_("Not all paths found."));
|
|
msg.response.connect ((response_id) => { msg.destroy (); } );
|
|
msg.show ();
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|