2
// Copyright (C) 2009 Jason Smith, Robert Dyer
3
// Copyright (C) 2010 Chris Szikszoy
5
// This program is free software: you can redistribute it and/or modify
6
// it under the terms of the GNU General Public License as published by
7
// the Free Software Foundation, either version 3 of the License, or
8
// (at your option) any later version.
10
// This program is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
// GNU General Public License for more details.
15
// You should have received a copy of the GNU General Public License
16
// along with this program. If not, see <http://www.gnu.org/licenses/>.
20
using System.Collections.Generic;
21
using System.Collections.ObjectModel;
33
using Docky.Interface;
47
enum HelperShowStates : uint {
54
enum DockletShowStates : uint {
61
public partial class ConfigurationWindow : Gtk.Window
63
string AutoStartKey = "Hidden";
64
DesktopItem auto_start_item;
65
TileView HelpersTileview, DockletsTileview;
66
Widgets.SearchEntry HelperSearch, DockletSearch;
68
internal static ConfigurationWindow Instance { get; private set; }
70
static ConfigurationWindow () {
71
Instance = new ConfigurationWindow ();
74
static Dock activeDock;
75
public Dock ActiveDock {
76
get { return activeDock; }
78
if (activeDock == value)
81
if (activeDock != null)
82
activeDock.UnsetActiveGlow ();
85
value.SetActiveGlow ();
90
SetupConfigAlignment ();
95
private ConfigurationWindow () : base(Gtk.WindowType.Toplevel)
99
SkipTaskbarHint = true;
102
foreach (string theme in Docky.Controller.DockThemes) {
103
theme_combo.AppendText (theme);
104
if (Docky.Controller.DockTheme == theme) {
105
theme_combo.Active = i;
110
if (Docky.Controller.Docks.Count () == 1)
111
ActiveDock = Docky.Controller.Docks.First ();
113
start_with_computer_checkbutton.Active = IsAutoStartEnabled ();
116
DockletSearch = new SearchEntry ();
117
DockletSearch.EmptyMessage = Catalog.GetString ("Search Docklets...");
118
DockletSearch.InnerEntry.Changed += delegate {
121
DockletSearch.Ready = true;
122
DockletSearch.Show ();
123
hbox1.PackStart (DockletSearch, true, true, 2);
125
DockletsTileview = new TileView ();
126
DockletsTileview.IconSize = 48;
127
docklet_scroll.AddWithViewport (DockletsTileview);
131
HelperSearch = new SearchEntry ();
132
HelperSearch.EmptyMessage = Catalog.GetString ("Search Helpers...");
133
HelperSearch.InnerEntry.Changed += delegate {
136
HelperSearch.Ready = true;
137
HelperSearch.Show ();
138
hbox5.PackStart (HelperSearch, true, true, 2);
140
HelpersTileview = new TileView ();
141
HelpersTileview.IconSize = 48;
142
helper_scroll.AddWithViewport (HelpersTileview);
144
DockServices.Helpers.HelperUninstalled += delegate {
152
protected override bool OnDeleteEvent (Event evnt)
159
protected virtual void OnCloseButtonClicked (object sender, System.EventArgs e)
165
void SetupConfigAlignment ()
167
if (config_alignment.Child != null) {
168
config_alignment.Remove (config_alignment.Child);
171
if (ActiveDock == null) {
172
VBox vbox = new VBox ();
174
HBox hboxTop = new HBox ();
175
HBox hboxBottom = new HBox ();
176
Label label1 = new Gtk.Label (Mono.Unix.Catalog.GetString ("Click on any dock to configure."));
177
Label label2 = new Gtk.Label (Mono.Unix.Catalog.GetString ("Drag any dock to reposition."));
182
vbox.Add (hboxBottom);
184
vbox.SetChildPacking (hboxTop, true, true, 0, PackType.Start);
185
vbox.SetChildPacking (label1, false, false, 0, PackType.Start);
186
vbox.SetChildPacking (label2, false, false, 0, PackType.Start);
187
vbox.SetChildPacking (hboxBottom, true, true, 0, PackType.Start);
189
config_alignment.Add (vbox);
191
config_alignment.Add (ActiveDock.PreferencesWidget);
193
config_alignment.ShowAll ();
196
protected override void OnShown ()
198
foreach (Dock dock in Docky.Controller.Docks) {
199
dock.EnterConfigurationMode ();
200
dock.ConfigurationClick += HandleDockConfigurationClick;
203
if (Docky.Controller.Docks.Count () == 1)
204
ActiveDock = Docky.Controller.Docks.First ();
206
config_notebook.CurrentPage = (int) Pages.Docks;
214
void HandleDockConfigurationClick (object sender, EventArgs e)
216
ActiveDock = sender as Dock;
219
protected override void OnHidden ()
221
foreach (Dock dock in Docky.Controller.Docks) {
222
dock.ConfigurationClick -= HandleDockConfigurationClick;
223
dock.LeaveConfigurationMode ();
224
dock.UnsetActiveGlow ();
229
protected virtual void OnThemeComboChanged (object sender, System.EventArgs e)
231
Docky.Controller.DockTheme = theme_combo.ActiveText;
232
if (Docky.Controller.NumDocks == 1)
236
protected virtual void OnDeleteDockButtonClicked (object sender, System.EventArgs e)
238
if (!(Docky.Controller.Docks.Count () > 1))
241
if (ActiveDock != null) {
242
Gtk.MessageDialog md = new Gtk.MessageDialog (null,
244
Gtk.MessageType.Warning,
245
Gtk.ButtonsType.None,
246
"<b><big>" + Catalog.GetString ("Delete the currently selected dock?") + "</big></b>");
247
md.Icon = DockServices.Drawing.LoadIcon ("docky", 22);
248
md.SecondaryText = Catalog.GetString ("If you choose to delete the dock, all settings\n" +
249
"for the deleted dock will be permanently lost.");
254
Gtk.Button cancel_button = new Gtk.Button();
255
cancel_button.CanFocus = true;
256
cancel_button.CanDefault = true;
257
cancel_button.Name = "cancel_button";
258
cancel_button.UseStock = true;
259
cancel_button.UseUnderline = true;
260
cancel_button.Label = "gtk-cancel";
261
cancel_button.Show ();
262
md.AddActionWidget (cancel_button, Gtk.ResponseType.Cancel);
263
md.AddButton (Catalog.GetString ("_Delete Dock"), Gtk.ResponseType.Ok);
264
md.DefaultResponse = Gtk.ResponseType.Cancel;
266
if ((ResponseType)md.Run () == Gtk.ResponseType.Ok) {
267
Docky.Controller.DeleteDock (ActiveDock);
268
if (Docky.Controller.Docks.Count () == 1)
269
ActiveDock = Docky.Controller.Docks.First ();
278
protected virtual void OnNewDockButtonClicked (object sender, System.EventArgs e)
280
Dock newDock = Docky.Controller.CreateDock ();
282
if (newDock != null) {
283
newDock.ConfigurationClick += HandleDockConfigurationClick;
284
newDock.EnterConfigurationMode ();
285
ActiveDock = newDock;
291
int spotsAvailable = 0;
292
for (int i = 0; i < Screen.Default.NMonitors; i++)
293
spotsAvailable += Docky.Controller.PositionsAvailableForDock (i).Count ();
295
delete_dock_button.Sensitive = (Docky.Controller.Docks.Count () == 1 || ActiveDock == null) ? false : true;
296
new_dock_button.Sensitive = (spotsAvailable == 0) ? false : true;
299
string AutoStartDir {
300
get { return System.IO.Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), "autostart"); }
303
string AutoStartFileName {
304
get { return System.IO.Path.Combine (AutoStartDir, "docky.desktop"); }
307
DesktopItem AutoStartItem {
309
if (auto_start_item != null)
310
return auto_start_item;
312
GLib.File file = DockServices.Paths.AutoStartFile;
315
auto_start_item = DesktopItem.NewFromFile (file.Path, DesktopItemLoadFlags.NoTranslations);
316
} catch (GLib.GException loadException) {
317
Log<ConfigurationWindow>.Info ("Unable to load existing autostart file: {0}", loadException.Message);
318
Log<ConfigurationWindow>.Info ("Writing new autostart file to {0}", file.Path);
319
auto_start_item = DesktopItem.NewFromFile (System.IO.Path.Combine (AssemblyInfo.InstallData, "applications/docky.desktop"), DesktopItemLoadFlags.NoTranslations);
321
if (!file.Parent.Exists)
322
file.Parent.MakeDirectoryWithParents (null);
324
auto_start_item.Save (file.StringUri (), true);
325
auto_start_item.Location = file.StringUri ();
326
} catch (Exception e) {
327
Log<ConfigurationWindow>.Error ("Failed to write initial autostart file: {0}", e.Message);
330
return auto_start_item;
334
bool IsAutoStartEnabled ()
336
if (!AutoStartItem.Exists ()) {
337
Log<SystemService>.Error ("Could not open autostart file {0}", DockServices.Paths.AutoStartFile.Path);
340
if (AutoStartItem.AttrExists (AutoStartKey)) {
341
return !String.Equals (AutoStartItem.GetString (AutoStartKey), "true", StringComparison.OrdinalIgnoreCase);
346
void SetAutoStartEnabled (bool enabled)
348
AutoStartItem.SetBoolean (AutoStartKey, !enabled);
350
AutoStartItem.Save (null, true);
351
} catch (Exception e) {
352
Log<SystemService>.Error ("Failed to update autostart file: {0}", e.Message);
356
protected virtual void OnStartWithComputerCheckbuttonToggled (object sender, System.EventArgs e)
358
SetAutoStartEnabled (start_with_computer_checkbutton.Active);
362
protected virtual void OnPageSwitch (object o, Gtk.SwitchPageArgs args)
364
if (args.PageNum == (int)Pages.Helpers)
366
if (args.PageNum == (int)Pages.Docklets)
370
protected virtual void OnInstallClicked (object sender, System.EventArgs e)
372
GLib.File file = null;
373
Gtk.FileChooserDialog script_chooser = new Gtk.FileChooserDialog ("Helpers", this, FileChooserAction.Open, Gtk.Stock.Cancel, ResponseType.Cancel, Catalog.GetString ("_Select"), ResponseType.Ok);
374
FileFilter filter = new FileFilter ();
375
filter.AddPattern ("*.tar");
376
filter.Name = Catalog.GetString (".tar Archives");
377
script_chooser.AddFilter (filter);
379
if ((ResponseType) script_chooser.Run () == ResponseType.Ok)
380
file = GLib.FileFactory.NewForPath (script_chooser.Filename);
382
script_chooser.Destroy ();
387
Helper installedHelper;
388
if (DockServices.Helpers.InstallHelper (file.Path, out installedHelper)) {
389
installedHelper.Data.DataReady += delegate {
395
protected virtual void OnShowHelperChanged (object sender, System.EventArgs e)
400
protected virtual void OnShowDockletChanged (object sender, System.EventArgs e)
405
void RefreshHelpers ()
407
string query = HelperSearch.InnerEntry.Text.ToLower ();
408
IEnumerable<HelperTile> tiles = DockServices.Helpers.Helpers.Select (h => new HelperTile (h))
409
.Where (h => h.Name.ToLower ().Contains (query) || h.Description.ToLower ().Contains (query))
410
.OrderBy (t => t.Name);
412
if (helper_show_cmb.Active == (uint) HelperShowStates.Enabled)
413
tiles = tiles.Where (h => h.Enabled);
414
else if (helper_show_cmb.Active == (uint) HelperShowStates.Disabled)
415
tiles = tiles.Where (h => !h.Enabled);
417
HelpersTileview.Clear ();
418
foreach (HelperTile helper in tiles) {
419
HelpersTileview.AppendTile (helper);
423
void RefreshDocklets ()
425
if (DockletsTileview == null)
427
DockletsTileview.Clear ();
429
if (ActiveDock == null)
432
string query = DockletSearch.InnerEntry.Text.ToLower ();
433
// build a list of DockletTiles, starting with the currently active tiles for the active dock,
434
// and the available addins
435
List<DockletTile> tiles = new List<DockletTile> ();
437
foreach (AbstractDockItemProvider provider in ActiveDock.Preferences.ItemProviders) {
438
string providerID = PluginManager.AddinIDFromProvider (provider);
439
if (string.IsNullOrEmpty (providerID))
442
tiles.Add (new DockletTile (providerID, provider));
445
tiles = tiles.Concat (PluginManager.AvailableProviderIDs.Select (id => new DockletTile (id))).ToList ();
447
if (docklet_show_cmb.Active == (int) DockletShowStates.Active)
448
tiles = tiles.Where (t => t.Enabled).ToList ();
449
else if (docklet_show_cmb.Active == (int) DockletShowStates.Disabled)
450
tiles = tiles.Where (t => !t.Enabled).ToList ();
452
tiles = tiles.Where (t => t.Description.ToLower ().Contains (query) || t.Name.ToLower ().Contains (query)).ToList ();
454
foreach (DockletTile docklet in tiles) {
455
DockletsTileview.AppendTile (docklet);