4
- This file is part of Adblock Plus <https://adblockplus.org/>,
5
- Copyright (C) 2006-2015 Eyeo GmbH
7
- Adblock Plus is free software: you can redistribute it and/or modify
8
- it under the terms of the GNU General Public License version 3 as
9
- published by the Free Software Foundation.
11
- Adblock Plus is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU General Public License for more details.
16
- You should have received a copy of the GNU General Public License
17
- along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
20
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
21
<?xml-stylesheet href="chrome://adblockplus/skin/filters.css" type="text/css"?>
23
<!DOCTYPE dialog SYSTEM "chrome://adblockplus/locale/filters.dtd">
26
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
27
title="&dialog.title;"
33
persist="screenX screenY width height sizemode"
34
windowtype="abp:filters">
36
<script type="application/x-javascript;version=1.7" src="utils.js"/>
37
<script type="application/x-javascript;version=1.7" src="filters.js"/>
38
<script type="application/x-javascript;version=1.7" src="filters-subscriptionview.js"/>
39
<script type="application/x-javascript;version=1.7" src="filters-subscriptionactions.js"/>
40
<script type="application/x-javascript;version=1.7" src="filters-filterview.js"/>
41
<script type="application/x-javascript;version=1.7" src="filters-filteractions.js"/>
42
<script type="application/x-javascript;version=1.7" src="filters-backup.js"/>
43
<script type="application/x-javascript;version=1.7" src="filters-search.js"/>
45
<keyset id="filtersKeyset">
46
<key id="subscription-update-key" key="T" modifiers="accel" command="subscription-update-command"/>
47
<key id="subscription-update-all-key" key="T" modifiers="accel,shift" command="subscription-update-all-command"/>
48
<key id="edit-key" keycode="VK_F2" oncommand="E(FilterActions.focused ? 'filters-edit-command' : 'subscription-editTitle-command').doCommand();"/>
49
<key id="delete-key" keycode="VK_DELETE" oncommand="E(FilterActions.focused ? 'filters-delete-command' : 'subscription-delete-command').doCommand();"/>
50
<key id="subscription-showHideFilters-key" key="R" modifiers="accel" command="subscription-showHideFilters-command"/>
51
<key id="moveUp-key" keycode="VK_UP" modifiers="accel"/>
52
<key id="moveDown-key" keycode="VK_DOWN" modifiers="accel"/>
53
<key id="filters-add-key" keycode="VK_INSERT" oncommand="E('filters-add-command').doCommand();"/>
54
<key id="filters-selectAll-key" key="A" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-selectAll-command').doCommand();"/>
55
<key id="filters-copy-key" key="C" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-copy-command').doCommand();"/>
56
<key id="filters-cut-key" key="X" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-cut-command').doCommand();"/>
57
<key id="filters-paste-key" key="V" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-paste-command').doCommand();"/>
58
<key id="backup-key" key="E" modifiers="accel" oncommand="E('backup').doCommand();"/>
59
<key id="restore-key" key="I" modifiers="accel" oncommand="E('restoreOwnBackup').doCommand();"/>
60
<key id="find-key" key="F" modifiers="accel" oncommand="if (FilterActions.visible) E('find-command').doCommand();"/>
61
<key id="find-again-key" key="G" modifiers="accel" oncommand="if (FilterActions.visible) E('find-again-command').doCommand();"/>
62
<key id="find-previous-key" key="G" modifiers="accel,shift" oncommand="if (FilterActions.visible) E('find-previous-command').doCommand();"/>
63
<key id="find-again-key2" keycode="VK_F3" oncommand="if (FilterActions.visible) E('find-again-command').doCommand();"/>
64
<key id="find-previous-key2" keycode="VK_F3" modifiers="shift" oncommand="if (FilterActions.visible) E('find-previous-command').doCommand();"/>
67
<commandset id="filtersCommandset">
68
<command id="subscription-update-command" oncommand="SubscriptionActions.updateFilters();"/>
69
<command id="subscription-update-all-command" oncommand="SubscriptionActions.updateAllFilters();"/>
70
<command id="subscription-editTitle-command" oncommand="SubscriptionActions.editTitle();"/>
71
<command id="subscription-delete-command" oncommand="SubscriptionActions.remove();"/>
72
<command id="subscription-showHideFilters-command" oncommand="E('filtersGrippy').doCommand();"/>
73
<command id="subscription-moveUp-command" oncommand="SubscriptionActions.moveUp();"/>
74
<command id="subscription-moveDown-command" oncommand="SubscriptionActions.moveDown();"/>
75
<command id="subscription-add-command" oncommand="SelectSubscription.start(event);"/>
76
<command id="subscription-addSelected-command" oncommand="SelectSubscription.add();"/>
77
<command id="subscription-addOther-command" oncommand="SelectSubscription.chooseOther();"/>
78
<command id="group-add-command" oncommand="SubscriptionActions.addGroup();"/>
79
<command id="filters-selectAll-command" oncommand="FilterActions.selectAll();"/>
80
<command id="filters-edit-command" oncommand="FilterActions.startEditing();"/>
81
<command id="filters-add-command" oncommand="FilterActions.insertFilter();"/>
82
<command id="filters-delete-command" oncommand="FilterActions.deleteSelected();"/>
83
<command id="filters-resetHitCounts-command" oncommand="FilterActions.resetHitCounts();"/>
84
<command id="filters-moveUp-command" oncommand="FilterActions.moveUp();"/>
85
<command id="filters-moveDown-command" oncommand="FilterActions.moveDown();"/>
86
<command id="filters-copy-command" oncommand="FilterActions.copySelected(true);"/>
87
<command id="filters-cut-command" oncommand="FilterActions.copySelected(false);"/>
88
<command id="filters-paste-command" oncommand="FilterActions.paste();"/>
89
<command id="find-command" oncommand="E('findbar').startFind(E('findbar').FIND_NORMAL)"/>
90
<command id="find-again-command" oncommand="E('findbar').onFindAgainCommand(false)"/>
91
<command id="find-previous-command" oncommand="E('findbar').onFindAgainCommand(true)"/>
94
<popupset id="filtersPopupset">
95
<menupopup id="filters-view-menu1" onpopupshowing="FilterActions.fillColumnPopup(this);">
96
<menuitem id="filters-view-filter1" label="&filter.column;" type="checkbox" disabled="true"/>
97
<menuitem id="filters-view-slow1" label="&slow.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-slow')"/>
98
<menuitem id="filters-view-enabled1" label="&enabled.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-enabled')"/>
99
<menuitem id="filters-view-hitcount1" label="&hitcount.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-hitcount')"/>
100
<menuitem id="filters-view-lasthit1" label="&lasthit.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-lasthit')"/>
102
<menu id="filters-sort-menu1" label="&sort.label;">
103
<menupopup id="filters-sort-popup1">
104
<menuitem id="filters-sort-none1" label="&sort.none.label;" type="radio" name="sortColumn" oncommand="FilterView.sortBy(null)"/>
105
<menuitem id="filters-sort-filter1" label="&filter.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-filter')"/>
106
<menuitem id="filters-sort-slow1" label="&slow.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-slow')"/>
107
<menuitem id="filters-sort-enabled1" label="&enabled.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-enabled')"/>
108
<menuitem id="filters-sort-hitcount1" label="&hitcount.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-hitcount')"/>
109
<menuitem id="filters-sort-lasthit1" label="&lasthit.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-lasthit')"/>
111
<menuitem id="filters-sort-asc1" label="&sort.ascending.label;" type="radio" name="sortOrder" oncommand="FilterActions.setSortOrder('ascending')"/>
112
<menuitem id="filters-sort-desc1" label="&sort.descending.label;" type="radio" name="sortOrder" oncommand="FilterActions.setSortOrder('descending')"/>
116
<tooltip id="filtersTooltip" onpopupshowing="FilterActions.fillTooltip(event);">
123
<row id="tooltip-filter-row" align="top">
124
<label class="tooltipLabel" value="&filter.column;"/>
125
<vbox id="tooltip-filter"/>
127
<row id="tooltip-hitcount-row">
128
<label class="tooltipLabel" value="&hitcount.column;"/>
129
<description id="tooltip-hitcount"/>
131
<row id="tooltip-lasthit-row">
132
<label class="tooltipLabel" value="&lasthit.column;"/>
133
<description id="tooltip-lasthit"/>
138
<description id="tooltip-additional"/>
142
<hbox id="content" flex="1">
143
<tabbox id="tabs" flex="1" persist="selectedIndex">
144
<tabs onselect="onTabChange(this.parentNode);">
145
<tab label="&subscriptions.tab.label;"/>
146
<tab label="&filters.tab.label;"/>
149
<tabpanel id="subscriptionsTab" orient="vertical" flex="1">
151
<button id="selectSubscriptionButton" label="&addSubscription.label;…" command="subscription-add-command"/>
154
<panel id="selectSubscriptionPanel" type="arrow" position="bottomcenter topleft"
155
orient="vertical" onkeypress="SelectSubscription.keyPress(event);">
156
<menuitem id="selectSubscriptionTemplate" hidden="true"
157
class="{localePrefix ? 'localeMatch' : ''}"
158
label="{node.getAttribute('title')}"
159
value="{node.getAttribute('url')}">
160
<label class="selectSubscriptionItem" value="{node.getAttribute('title') + ' (' + node.getAttribute('specialization') + ')'}"/>
162
<menulist id="selectSubscription">
165
<hbox align="baseline">
166
<label class="text-link" value="&addSubscriptionOther.label;" onclick="E('subscription-addOther-command').doCommand();"/>
168
<button id="selectSubscriptionAccept" default="true" label="&addSubscriptionAdd.label;" command="subscription-addSelected-command"/>
170
<button label="&addSubscriptionCancel.label;" oncommand="E('selectSubscriptionPanel').hidePopup();"/>
174
<richlistitem id="subscriptionTemplate" class="subscription" hidden="true" orient="vertical"
175
onmousedown="this._wasSelected = (this.parentNode.selectedItem == this);"
176
ondragstart="SubscriptionActions.startDrag(event, this);"
177
ondragend="SubscriptionActions.endDrag();"
178
ondragover="SubscriptionActions.dragOver(event);"
179
ondrop="SubscriptionActions.drop(event, this);"
180
oncontextmenu="SubscriptionActions.openMenu(event, this);">
181
<vbox class="{subscription.disabled ? 'disabled' : ''}">
182
<hbox align="center">
183
<checkbox label="&subscription.enabled.label;" class="enabledCheckbox tabable" tabindex="-1"
184
checked="{subscription.disabled ? 'false' : 'true'}" oncommand="SubscriptionActions.setDisabled(this, !this.checked);"/>
187
<hbox align="center">
188
<deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();">
189
<description ondblclick="if (event.button == 0) TitleEditor.start(this, true);">
190
<description class="title" value="{subscription.title}" flex="1" crop="end"/>
191
(<if condition="{isExternal}">
192
<description value="&subscription.external.label;"/>
194
<if condition="{subscription.homepage}">
195
<description class="link" value="&subscription.homepage.label;"
196
_url="{subscription.homepage}" tooltiptext="{subscription.homepage}"
197
onclick="if (event.button == 0) { event.stopPropagation();UI.loadInBrowser(this.getAttribute('_url')); }"/>, 
199
<description class="link" value="&subscription.source.label;"
200
_url="{subscription.url}" tooltiptext="{subscription.url}"
201
onclick="if (event.button == 0) { event.stopPropagation();UI.loadInBrowser(this.getAttribute('_url')); }"/>
204
<textbox oncontextmenu="event.stopPropagation();" class="titleEditor" onkeypress="TitleEditor.keyPress(event);" onblur="TitleEditor.end(true);"/>
207
<hbox align="center">
208
<description flex="1" class="status">
209
<description value="&subscription.lastDownload.label;"/> 
210
<if condition="{downloading}">
211
<description value="&subscription.lastDownload.inProgress;"/>
212
<elif condition="{!subscription.lastDownload}"/>
213
<description value="&subscription.lastDownload.unknown;"/>
215
<description value="{formatTime(subscription.lastDownload * 1000)}"/>
216
<if condition="{subscription.downloadStatus}">
218
 (<if condition="{subscription.downloadStatus == 'synchronize_invalid_url'}">
219
<description value="&subscription.lastDownload.invalidURL;"/>
220
<elif condition="{subscription.downloadStatus == 'synchronize_connection_error'}"/>
221
<description value="&subscription.lastDownload.connectionError;"/>
222
<elif condition="{subscription.downloadStatus == 'synchronize_invalid_data'}"/>
223
<description value="&subscription.lastDownload.invalidData;"/>
224
<elif condition="{subscription.downloadStatus == 'synchronize_checksum_mismatch'}"/>
225
<description value="&subscription.lastDownload.checksumMismatch;"/>
226
<else/> <!-- synchronize_ok -->
227
<description value="&subscription.lastDownload.success;"/>
236
<button class="actionButton tabable" type="menu" label="&subscription.actions.label;" tabindex="-1">
237
<menupopup class="actionMenu">
238
<menuitem label="&subscription.editTitle.label;" key="edit-key" command="subscription-editTitle-command"/>
239
<menuitem label="&subscription.update.label;" key="subscription-update-key" command="subscription-update-command"/>
240
<menuitem label="&subscription.showHideFilters.label;" key="subscription-showHideFilters-key" command="subscription-showHideFilters-command"/>
241
<menuitem label="&subscription.delete.label;…" key="delete-key" command="subscription-delete-command"/>
243
<menuitem label="&subscription.moveUp.label;" key="moveUp-key" command="subscription-moveUp-command"/>
244
<menuitem label="&subscription.moveDown.label;" key="moveDown-key" command="subscription-moveDown-command"/>
249
<description class="warning" hidden="{!subscription.upgradeRequired}">&subscription.minVersion.warning;</description>
250
<description class="warning" hidden="{!disabledFilters}">
251
&subscription.disabledFilters.warning;
252
<description class="link" value="&subscription.disabledFilters.enable;" onclick="SubscriptionActions.enableFilters(this);"/>
257
<deck id="noSubscriptionsDeck" flex="1">
258
<description flex="1">&noSubscriptions.text;</description>
259
<richlistbox id="subscriptions" class="initialFocus" flex="1"
260
onselect="onSelectionChange(this);"
261
ondragover="SubscriptionActions.dragOver(event);"
262
ondrop="SubscriptionActions.drop(event, null);"
263
onkeypress="SubscriptionActions.keyPress(event);">
268
<checkbox id="acceptableAds" label="&acceptableAds2.label;" oncommand="ListManager.allowAcceptableAds(this.checked);"/>
269
<label class="text-link" value="&viewList.label;" onclick="UI.loadInBrowser(Prefs.subscriptions_exceptionsurl);"/>
270
<label class="text-link" value="&readMore.label;" onclick="UI.loadDocLink('acceptable_ads');"/>
273
<tabpanel id="filtersTab" orient="vertical" flex="1">
275
<button id="addGroupButton" label="&addGroup.label;" command="group-add-command"/>
278
<richlistitem id="groupTemplate" class="subscription" hidden="true" orient="vertical"
279
onmousedown="this._wasSelected = (this.parentNode.selectedItem == this);"
280
ondragstart="SubscriptionActions.startDrag(event, this);"
281
ondragend="SubscriptionActions.endDrag();"
282
ondragover="SubscriptionActions.dragOver(event);"
283
ondrop="SubscriptionActions.drop(event, this);"
284
oncontextmenu="SubscriptionActions.openMenu(event, this);">
285
<hbox class="{subscription.disabled ? 'disabled' : ''}" align="center">
286
<checkbox label="&subscription.enabled.label;" class="enabledCheckbox tabable" tabindex="-1"
287
checked="{subscription.disabled ? 'false' : 'true'}" oncommand="SubscriptionActions.setDisabled(this, !this.checked);"/>
288
<hbox align="center" flex="1">
289
<deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();">
290
<description class="title" value="{subscription.title}" crop="end" ondblclick="if (event.button == 0) TitleEditor.start(this, true);"/>
291
<textbox oncontextmenu="event.stopPropagation();" class="titleEditor" onkeypress="TitleEditor.keyPress(event);" onblur="TitleEditor.end(true);"/>
294
<button class="actionButton tabable" type="menu" label="&subscription.actions.label;" tabindex="-1">
295
<menupopup class="actionMenu">
296
<menuitem label="&subscription.editTitle.label;" key="edit-key" command="subscription-editTitle-command"/>
297
<menuitem label="&subscription.showHideFilters.label;" key="subscription-showHideFilters-key" command="subscription-showHideFilters-command"/>
298
<menuitem label="&subscription.delete.label;…" key="delete-key" command="subscription-delete-command"/>
300
<menuitem label="&subscription.moveUp.label;" key="moveUp-key" command="subscription-moveUp-command"/>
301
<menuitem label="&subscription.moveDown.label;" key="moveDown-key" command="subscription-moveDown-command"/>
307
<deck id="noFiltersDeck" flex="1">
308
<description flex="1">&noFilters.text;</description>
309
<richlistbox id="groups" class="initialFocus" flex="1"
310
onselect="onSelectionChange(this);"
311
ondragover="SubscriptionActions.dragOver(event);"
312
ondrop="SubscriptionActions.drop(event, null);"
313
onkeypress="SubscriptionActions.keyPress(event);">
320
<splitter id="filtersSplitter" persist="state" orient="horizontal" collapse="after" state="collapsed" oncommand="FilterView.refresh();onSplitterStateChange(this);">
321
<grippy id="filtersGrippy"/>
324
<vbox id="filtersContainer" persist="width height" width="500">
326
<button id="findButton" label="&find.label;" command="find-command"/>
327
<button id="filterActionButton" type="menu" label="&filter.actions.label;">
328
<menupopup id="filterActionMenu" onpopupshowing="FilterActions.fillActionsPopup();">
329
<menuitem label="&filter.edit.label;" key="edit-key" command="filters-edit-command"/>
330
<menuitem label="&filter.cut.label;" key="filters-cut-key" command="filters-cut-command"/>
331
<menuitem label="&filter.copy.label;" key="filters-copy-key" command="filters-copy-command"/>
332
<menuitem label="&filter.paste.label;" key="filters-paste-key" command="filters-paste-command"/>
333
<menuitem label="&filter.delete.label;" key="delete-key" command="filters-delete-command"/>
335
<menuitem label="&filter.selectAll.label;" key="filters-selectAll-key" command="filters-selectAll-command"/>
336
<menuitem label="&filter.resetHitCounts.label;" command="filters-resetHitCounts-command"/>
338
<menuitem label="&filter.moveUp.label;" key="moveUp-key" command="filters-moveUp-command"/>
339
<menuitem label="&filter.moveDown.label;" key="moveDown-key" command="filters-moveDown-command"/>
341
<menu id="viewMenu" label="&viewMenu.label;"/>
344
<button id="addFilterButton" label="&addFilter.label;" command="filters-add-command"/>
346
<tree id="filtersTree"
350
enableColumnDrag="true"
351
hidecolumnpicker="true"
352
_removewarning="&filters.remove.warning;">
353
<treecols context="filters-view-menu1">
354
<treecol id="col-enabled" label="&enabled.column;" cycler="true" flex="0" persist="width ordinal sortDirection hidden"/>
355
<splitter class="tree-splitter"/>
356
<treecol id="col-filter" label="&filter.column;" flex="10" persist="width ordinal sortDirection hidden"/>
357
<splitter class="tree-splitter"/>
358
<treecol id="col-slow" label="!" display="&slow.column;" tooltiptext="&slow.column;" flex="0" width="16" persist="width ordinal sortDirection hidden"/>
359
<splitter class="tree-splitter"/>
360
<treecol id="col-hitcount" label="&hitcount.column;" flex="0" persist="width ordinal sortDirection hidden"/>
361
<splitter class="tree-splitter"/>
362
<treecol id="col-lasthit" label="&lasthit.column;" hidden="true" flex="4" persist="width ordinal sortDirection hidden"/>
365
<treechildren id="filtersTreeChildren"
366
oncontextmenu="E('filterActionMenu').openPopupAtScreen(event.screenX, event.screenY, true);"
367
tooltip="filtersTooltip"
368
noGroupText="&noGroupSelected.text;"
369
noFiltersText="&noFiltersInGroup.text;"
370
ondragstart="FilterActions.startDrag(event);"
371
ondragend="FilterActions.endDrag(event);"/>
376
<findbar id="findbar"/>
379
<button id="backupButton" type="menu"
380
label="&backupButton.label;"
381
_backupDialogTitle="&backup.label;" _restoreDialogTitle="&restore.own.label;"
382
_fileFilterComplete="&backup.complete.title;" _fileFilterCustom="&backup.custom.title;"
383
_backupError="&backup.error;" _restoreError="&restore.error;"
384
_restoreCompleteWarning="&restore.complete.warning;" _restoreCustomWarning="&restore.custom.warning;"
385
_restoreVersionWarning="&restore.minVersion.warning;"
386
oncommand="if (event.target == this) Utils.runAsync(() => this.open = true);">
387
<menupopup onpopupshowing="Backup.fillRestorePopup();">
388
<menuitem id="backup" key="backup-key" label="&backup.label;…" oncommand="Backup.backupToFile();"/>
390
<menuitem id="restoreBackupTemplate" label="&restore.default.label;" hidden="true"/>
391
<menuitem id="restoreOwnBackup" key="restore-key" label="&restore.own.label;…" oncommand="Backup.restoreFromFile();"/>
397
<button id="close" dlgtype="accept" label="&close.label;"/>