~ubuntu-branches/ubuntu/maverick/weave/maverick

« back to all changes in this revision

Viewing changes to source/chrome/content/fx-tabs.js

  • Committer: Bazaar Package Importer
  • Author(s): Alexander GQ Gerasiov
  • Date: 2010-06-07 00:17:27 UTC
  • Revision ID: james.westby@ubuntu.com-20100607001727-ys6iau4b7uuf822x
Tags: upstream-1.3
ImportĀ upstreamĀ versionĀ 1.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Components.utils.import("resource://weave/service.js");
 
2
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
3
 
 
4
let RemoteTabViewer = {
 
5
  get _tabsList() document.getElementById("tabsList"),
 
6
 
 
7
  init: function () {
 
8
    Weave.Svc.Obs.add("weave:service:login:finish", this);
 
9
    Weave.Svc.Obs.add("weave:engine:sync:finish",   this);
 
10
 
 
11
    this.buildList(true);
 
12
 
 
13
    let win = getTopWin();
 
14
    let i = win.gFxWeaveGlue.getPageIndex();
 
15
    win.gBrowser.setIcon(win.gBrowser.mTabs[i], "chrome://weave/skin/sync-16x16.png");
 
16
  },
 
17
 
 
18
  buildList: function(force) {
 
19
    if (!Weave.Service.isLoggedIn ||
 
20
        this._refetchTabs(force))
 
21
      return;
 
22
 
 
23
    this._generateTabList();
 
24
  },
 
25
 
 
26
  createItem: function(attrs) {
 
27
    let item = document.createElement("richlistitem");
 
28
 
 
29
    // Copy the attributes from the argument into the item
 
30
    for (let attr in attrs)
 
31
      item.setAttribute(attr, attrs[attr]);
 
32
 
 
33
    if (attrs["type"] == "tab")
 
34
      item.label = attrs.title != "" ? attrs.title : attrs.url;
 
35
 
 
36
    return item;
 
37
  },
 
38
 
 
39
  filterTabs: function(event) {
 
40
    let val = event.target.value.toLowerCase();
 
41
    let numTabs = this._tabsList.getRowCount();
 
42
    let clientTabs = 0;
 
43
    let currentClient = null;
 
44
    for (let i = 0;i < numTabs;i++) {
 
45
      let item = this._tabsList.getItemAtIndex(i);
 
46
      let hide = false;
 
47
      if (item.getAttribute("type") == "tab") {
 
48
        if (item.getAttribute("url").toLowerCase().indexOf(val) == -1 &&
 
49
            item.getAttribute("title").toLowerCase().indexOf(val) == -1)
 
50
          hide = true;
 
51
        else
 
52
          clientTabs++;
 
53
      }
 
54
      else if (item.getAttribute("type") == "client") {
 
55
        if (currentClient) {
 
56
          if (clientTabs == 0)
 
57
            currentClient.hidden = true;
 
58
        }
 
59
        currentClient = item;
 
60
        clientTabs = 0;
 
61
      }
 
62
      item.hidden = hide;
 
63
    }
 
64
    if (clientTabs == 0)
 
65
      currentClient.hidden = true;
 
66
  },
 
67
 
 
68
  openSelected: function() {
 
69
    let items = this._tabsList.selectedItems;
 
70
    let urls = [];
 
71
    for (let i = 0;i < items.length;i++) {
 
72
      if (items[i].getAttribute("type") == "tab") {
 
73
        urls.push(items[i].getAttribute("url"));
 
74
        let index = this._tabsList.getIndexOfItem(items[i]);
 
75
        this._tabsList.removeItemAt(index);
 
76
      }
 
77
    }
 
78
    if (urls.length) {
 
79
      getTopWin().gBrowser.loadTabs(urls);
 
80
      this._tabsList.clearSelection();
 
81
    }
 
82
  },
 
83
 
 
84
  bookmarkSingleTab: function() {
 
85
    let item = this._tabsList.selectedItems[0];
 
86
    let uri = Weave.Utils.makeURI(item.getAttribute("url"));
 
87
    let title = item.getAttribute("title");
 
88
    PlacesUIUtils.showMinimalAddBookmarkUI(uri, title);
 
89
  },
 
90
 
 
91
  bookmarkSelectedTabs: function() {
 
92
    let items = this._tabsList.selectedItems;
 
93
    let URIs = [];
 
94
    for (let i = 0;i < items.length;i++) {
 
95
      if (items[i].getAttribute("type") == "tab") {
 
96
        let uri = Weave.Utils.makeURI(items[i].getAttribute("url"));
 
97
        if (!uri)
 
98
          continue;
 
99
 
 
100
        URIs.push(uri);
 
101
      }
 
102
    }
 
103
    if (URIs.length)
 
104
      PlacesUIUtils.showMinimalAddMultiBookmarkUI(URIs);
 
105
  },
 
106
 
 
107
  _generateTabList: function() {
 
108
    let engine = Weave.Engines.get("tabs");
 
109
    let list = this._tabsList;
 
110
 
 
111
    // clear out existing richlistitems
 
112
    let count = list.getRowCount();
 
113
    if (count > 0) {
 
114
      for (i = count - 1;i >= 0;i--)
 
115
        list.removeItemAt(i);
 
116
    }
 
117
 
 
118
    for (let [guid, client] in Iterator(engine.getAllClients())) {
 
119
      // Create the client node, but don't add it in-case we don't show any tabs
 
120
      let appendClient = true;
 
121
      let seenURLs = {};
 
122
      client.tabs.forEach(function({title, urlHistory, icon}) {
 
123
        let url = urlHistory[0];
 
124
        if (engine.locallyOpenTabMatchesURL(url) || url in seenURLs)
 
125
          return;
 
126
 
 
127
        seenURLs[url] = null;
 
128
 
 
129
        if (appendClient) {
 
130
          let attrs = {
 
131
            type: "client",
 
132
            clientName: client.clientName,
 
133
            icon: Weave.Clients.isMobile(client.id) ? "chrome://weave/skin/mobile-icon.png"
 
134
                                                    : "chrome://weave/skin/desktop-icon.png",
 
135
          };
 
136
          let clientEnt = RemoteTabViewer.createItem(attrs);
 
137
          list.appendChild(clientEnt);
 
138
          appendClient = false;
 
139
          clientEnt.disabled = true;
 
140
        }
 
141
        let attrs = {
 
142
          type:  "tab",
 
143
          title: title || url,
 
144
          url:   url,
 
145
          icon:  Weave.Utils.getIcon(icon)
 
146
        }
 
147
        let tab = RemoteTabViewer.createItem(attrs);
 
148
        list.appendChild(tab);
 
149
      });
 
150
    }
 
151
  },
 
152
 
 
153
  adjustContextMenu: function(event) {
 
154
    let mode = "all";
 
155
    switch (this._tabsList.selectedItems.length) {
 
156
      case 0:
 
157
        break;
 
158
      case 1:
 
159
        mode = "single"
 
160
        break;
 
161
      default:
 
162
        mode = "multiple";
 
163
        break;
 
164
    }
 
165
    let menu = document.getElementById("tabListContext");
 
166
    let el = menu.firstChild;
 
167
    while (el) {
 
168
      let sf = el.getAttribute("showFor");
 
169
      if (sf)
 
170
        el.hidden = sf != mode && sf != "all";
 
171
 
 
172
      el = el.nextSibling;
 
173
    }
 
174
  },
 
175
 
 
176
  _refetchTabs: function(force) {
 
177
    if (!force) {
 
178
      // Don't bother refetching tabs if we already did so recently
 
179
      let lastFetch = Weave.Svc.Prefs.get("lastTabFetch", 0);
 
180
      let now = Math.floor(Date.now() / 1000);
 
181
      if (now - lastFetch < 30)
 
182
        return false;
 
183
    }
 
184
 
 
185
    // if Clients hasn't synced yet this session, need to sync it as well
 
186
    if (Weave.Clients.lastSync == 0)
 
187
      Weave.Clients.sync();
 
188
 
 
189
    // Force a sync only for the tabs engine
 
190
    let engine = Weave.Engines.get("tabs");
 
191
    engine.lastModified = null;
 
192
    engine.sync();
 
193
    Weave.Svc.Prefs.set("lastTabFetch", Math.floor(Date.now() / 1000));
 
194
 
 
195
    return true;
 
196
  },
 
197
 
 
198
  QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIObserver,
 
199
                                         Components.interfaces.nsISupportsWeakReference]),
 
200
 
 
201
  observe: function(subject, topic, data) {
 
202
    switch (topic) {
 
203
      case "weave:service:login:finish":
 
204
        this.buildList(true);
 
205
        break;
 
206
      case "weave:engine:sync:finish":
 
207
        if (subject == "tabs")
 
208
          this._generateTabList();
 
209
        break;
 
210
    }
 
211
  },
 
212
 
 
213
  handleClick: function(event) {
 
214
    if (event.target.getAttribute("type") != "tab")
 
215
      return;
 
216
 
 
217
    if (event.button == 1) {
 
218
      let url = event.target.getAttribute("url");
 
219
      openUILink(url, event);
 
220
      let index = this._tabsList.getIndexOfItem(event.target);
 
221
      this._tabsList.removeItemAt(index);
 
222
    }
 
223
  }
 
224
}