Bug 387749 - add an item detail pane to the organizer. r=dietrich (r=gavin for editable-menulist changes). a=mconnor.

This commit is contained in:
mozilla.mano@sent.com 2007-09-21 15:57:18 -07:00
Родитель 0cccc74b01
Коммит cad73793e2
17 изменённых файлов: 666 добавлений и 259 удалений

Просмотреть файл

@ -139,7 +139,8 @@ var PlacesCommandHook = {
this.panel.openPopup(aAnchorElement, aPosition, -1, -1);
gEditItemOverlay.initPanel(aItemId,
{ hiddenRows: ["description", "location"] });
{ hiddenRows: ["description", "location",
"loadInSidebar"] });
setTimeout(function() {
var namePicker = document.getElementById("editBMPanel_namePicker");
namePicker.focus();

Просмотреть файл

@ -54,8 +54,8 @@ var gEditItemOverlay = {
_uri: null,
_itemId: -1,
_itemType: -1,
_readOnly: false,
_microsummaries: null,
_doneCallback: null,
_hiddenRows: [],
_observersAdded: false,
@ -76,45 +76,82 @@ var gEditItemOverlay = {
_showHideRows: function EIO__showHideRows() {
var isBookmark = this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK;
this._element("nameRow").hidden = this._hiddenRows.indexOf("name") != -1;
this._element("folderRow").hidden =
this._element("nameRow").collapsed = this._hiddenRows.indexOf("name") != -1;
this._element("folderRow").collapsed =
this._hiddenRows.indexOf("folderPicker") != -1;
this._element("tagsRow").hidden =
this._hiddenRows.indexOf("tags") != -1 || !isBookmark;
this._element("descriptionRow").hidden =
this._hiddenRows.indexOf("description") != -1;
this._element("locationRow").hidden =
this._hiddenRows.indexOf("location") != -1 || !isBookmark;
this._element("tagsRow").collapsed = !isBookmark ||
this._hiddenRows.indexOf("tags") != -1;
this._element("descriptionRow").collapsed =
this._hiddenRows.indexOf("description") != -1 ||
this._readOnly;
this._element("keywordRow").collapsed = !isBookmark || this._readOnly ||
this._hiddenRows.indexOf("keyword") != -1;
this._element("locationRow").collapsed = !isBookmark ||
this._hiddenRows.indexOf("location") != -1;
this._element("loadInSidebarCheckbox").collapsed = !isBookmark ||
this._readOnly || this._hiddenRows.indexOf("loadInSidebar") != -1;
this._element("feedLocationRow").collapsed = !this._isLivemark ||
this._hiddenRows.indexOf("feedLocation") != -1;
this._element("siteLocationRow").collapsed = !this._isLivemark ||
this._hiddenRows.indexOf("siteLocation") != -1;
},
/**
* Initialize the panel
*/
initPanel: function EIO_initPanel(aItemId, aInfo) {
const bms = PlacesUtils.bookmarks;
this._folderMenuList = this._element("folderMenuList");
this._folderTree = this._element("folderTree");
this._itemId = aItemId;
this._itemType = PlacesUtils.bookmarks.getItemType(this._itemId);
this._itemType = bms.getItemType(this._itemId);
this._determineInfo(aInfo);
var container = bms.getFolderIdForItem(this._itemId);
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK) {
this._uri = PlacesUtils.bookmarks.getBookmarkURI(this._itemId);
// tags field
this._element("tagsField").value =
PlacesUtils.tagging.getTagsForURI(this._uri).join(", ");
this._uri = bms.getBookmarkURI(this._itemId);
this._isLivemark = false;
if (PlacesUtils.livemarks.isLivemark(container))
this._readOnly = true;
else
this._readOnly = false;
this._element("locationField").value = this._uri.spec;
this._initTextField("locationField", this._uri.spec);
this._initTextField("tagsField",
PlacesUtils.tagging
.getTagsForURI(this._uri).join(", "),
false);
this._initTextField("keywordField",
bms.getKeywordForBookmark(this._itemId));
// Load In Sidebar checkbox
this._element("loadInSidebarCheckbox").checked =
PlacesUtils.annotations.itemHasAnnotation(this._itemId,
LOAD_IN_SIDEBAR_ANNO);
}
else {
this._readOnly = false;
this._isLivemark = PlacesUtils.livemarks.isLivemark(this._itemId);
if (this._isLivemark) {
var feedURI = PlacesUtils.livemarks.getFeedURI(this._itemId);
var siteURI = PlacesUtils.livemarks.getSiteURI(this._itemId);
this._initTextField("feedLocationField", feedURI.spec);
this._initTextField("siteLocationField", siteURI ? siteURI.spec : "");
}
this._uri = null;
}
// folder picker
this._initFolderMenuList();
this._initFolderMenuList(container);
// name picker
this._initNamePicker();
// description field
this._element("descriptionField").value =
PlacesUtils.getItemDescription(this._itemId);
this._initTextField("descriptionField",
PlacesUtils.getItemDescription(this._itemId));
this._showHideRows();
@ -126,6 +163,20 @@ var gEditItemOverlay = {
}
},
_initTextField: function(aTextFieldId, aValue, aReadOnly) {
var field = this._element(aTextFieldId);
field.readOnly = aReadOnly !== undefined ? aReadOnly : this._readOnly;
if (field.value != aValue) {
field.value = aValue;
// clear the undo stack
var editor = field.editor;
if (editor)
editor.transactionManager.clear();
}
},
/**
* Appends a menu-item representing a bookmarks folder to a menu-popup.
* @param aMenupopup
@ -148,16 +199,15 @@ var gEditItemOverlay = {
return folderMenuItem;
},
_initFolderMenuList: function EIO__initFolderMenuList() {
_initFolderMenuList: function EIO__initFolderMenuList(aSelectedFolder) {
// clean up first
var menupopup = this._folderMenuList.menupopup;
while (menupopup.childNodes.length > 4)
menupopup.removeChild(menupopup.lastChild);
var container = PlacesUtils.bookmarks.getFolderIdForItem(this._itemId);
// only show "All Bookmarks" if the url isn't bookmarked somewhere else
this._element("unfiledRootItem").hidden = container != PlacesUtils.unfiledRootId;
this._element("unfiledRootItem").hidden =
aSelectedFolder != PlacesUtils.unfiledRootId;
// List of recently used folders:
var annos = PlacesUtils.annotations;
@ -189,11 +239,12 @@ var gEditItemOverlay = {
this._appendFolderItemToMenupopup(menupopup, folders[i].folderId);
}
var defaultItem = this._getFolderMenuItem(container, true);
var defaultItem = this._getFolderMenuItem(aSelectedFolder, true);
this._folderMenuList.selectedItem = defaultItem;
// Hide the folders-separator if no folder is annotated as recently-used
this._element("foldersSeparator").hidden = (menupopup.childNodes.length <= 4);
this._folderMenuList.disabled = this._readOnly;
},
QueryInterface: function EIO_QueryInterface(aIID) {
@ -265,7 +316,8 @@ var gEditItemOverlay = {
var itemToSelect = userEnteredNameField;
try {
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK)
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK &&
!this._readOnly)
this._microsummaries = this._mss.getMicrosummaries(this._uri, -1);
}
catch(ex) {
@ -303,6 +355,12 @@ var gEditItemOverlay = {
namePicker.selectedItem = itemToSelect;
namePicker.setAttribute("droppable", droppable);
namePicker.readOnly = this._readOnly;
// clear the undo stack
var editor = namePicker.editor;
if (editor)
editor.transactionManager.clear();
},
// nsIMicrosummaryObserver
@ -455,6 +513,52 @@ var gEditItemOverlay = {
}
},
onKeywordFieldBlur: function EIO_onKeywordFieldBlur() {
var keyword = this._element("keywordField").value;
if (keyword != PlacesUtils.bookmarks.getKeywordForBookmark(this._itemId)) {
var txn = PlacesUtils.ptm.editBookmarkKeyword(this._itemId, keyword);
PlacesUtils.ptm.commitTransaction(txn);
}
},
onFeedLocationFieldBlur: function EIO_onFeedLocationFieldBlur() {
// XXXmano: uri fixup
var uri;
try {
uri = IO.newURI(this._element("feedLocationField").value);
}
catch(ex) { return; }
var currentFeedURI = PlacesUtils.livemarks.getFeedURI(this._itemId);
if (!currentFeedURI.equals(uri)) {
var txn = PlacesUtils.ptm.editLivemarkFeedURI(this._itemId, uri);
PlacesUtils.ptm.commitTransaction(txn);
}
},
onSiteLocationFieldBlur: function EIO_onSiteLocationFieldBlur() {
// XXXmano: uri fixup
var uri = null;
try {
uri = IO.newURI(this._element("siteLocationField").value);
}
catch(ex) { }
var currentSiteURI = PlacesUtils.livemarks.getSiteURI(this._itemId);
if (!uri || !currentSiteURI.equals(uri)) {
var txn = PlacesUtils.ptm.editLivemarkSiteURI(this._itemId, uri);
PlacesUtils.ptm.commitTransaction(txn);
}
},
onLoadInSidebarCheckboxCommand:
function EIO_onLoadInSidebarCheckboxCommand() {
var loadInSidebarChecked = this._element("loadInSidebarCheckbox").checked;
var txn = PlacesUtils.ptm.setLoadInSidebar(this._itemId,
loadInSidebarChecked);
PlacesUtils.ptm.commitTransaction(txn);
},
toggleFolderTreeVisibility: function EIO_toggleFolderTreeVisibility() {
var expander = this._element("foldersExpander");
if (!this._folderTree.collapsed) {
@ -672,24 +776,51 @@ var gEditItemOverlay = {
if (userEnteredNameField.value != aValue) {
userEnteredNameField.value = aValue;
var namePicker = this._element("namePicker");
if (namePicker.selectedItem == userEnteredNameField)
if (namePicker.selectedItem == userEnteredNameField) {
namePicker.label = aValue;
// clear undo stack
namePicker.editor.transactionManager.clear();
}
}
break;
case "uri":
var locationField = this._element("locationField");
if (locationField.value != aValue) {
locationField.value = aValue;
this._uri = IO.newURI(aValue);
this._initTextField("locationField", this._uri.spec);
this._initNamePicker(); // for microsummaries
this._element("tagsField").value =
PlacesUtils.tagging.getTagsForURI(this._uri).join(", ");
this._initTextField("tagsField",
PlacesUtils.tagging
.getTagsForURI(this._uri).join(", "),
false);
this._rebuildTagsSelectorList();
}
break;
case "keyword":
this._initTextField("keywordField",
PlacesUtils.bookmarks
.getKeywordForBookmark(this._itemId));
break;
case DESCRIPTION_ANNO:
this._element("descriptionField").value =
PlacesUtils.annotations.getItemDescription(this._itemId);
this._initTextField("descriptionField",
PlacesUtils.getItemDescription(this._itemId));
break;
case LOAD_IN_SIDEBAR_ANNO:
this._element("loadInSidebarCheckbox").checked =
PlacesUtils.annotations.itemHasAnnotation(this._itemId,
LOAD_IN_SIDEBAR_ANNO);
break;
case LMANNO_FEEDURI:
var feedURISpec = PlacesUtils.livemarks.getFeedURI(this._itemId).spec;
this._initTextField("feedLocationField", feedURISpec);
break;
case LMANNO_SITEURI:
var siteURISpec = "";
var siteURI = PlacesUtils.livemarks.getSiteURI(this._itemId);
if (siteURI)
siteURISpec = siteURI.spec;
this._initTextField("siteLocationField", siteURISpec);
break;
}
},

Просмотреть файл

@ -49,6 +49,8 @@
src="chrome://browser/content/places/editBookmarkOverlay.js"/>
<vbox id="editBookmarkPanelContent">
<broadcaster id="paneElementsBroadcaster"/>
<grid id="editBookmarkPanelGrid" flex="1">
<columns>
<column/>
@ -57,14 +59,16 @@
<rows>
<row align="center" id="editBMPanel_nameRow">
<label value="&editBookmarkOverlay.name.label;"
contorl="editBMPanel_namePicker"/>
control="editBMPanel_namePicker"
observes="paneElementsBroadcaster"/>
<menulist id="editBMPanel_namePicker"
flex="1"
editable="true"
droppable="false"
oninput="gEditItemOverlay.onNamePickerInput();"
onblur="gEditItemOverlay.onNamePickerChange();"
oncommand="gEditItemOverlay.onNamePickerChange();">
oncommand="gEditItemOverlay.onNamePickerChange();"
observes="paneElementsBroadcaster">
<menupopup>
<menuitem id="editBMPanel_userEnteredName"/>
<menuitem disabled="true">
@ -77,17 +81,39 @@
<row align="center" id="editBMPanel_locationRow">
<label value="&editBookmarkOverlay.location.label;"
contorl="editBMPanel_locationField"/>
control="editBMPanel_locationField"
observes="paneElementsBroadcaster"/>
<textbox id="editBMPanel_locationField"
onblur="gEditItemOverlay.onLocationFieldBlur();"/>
onblur="gEditItemOverlay.onLocationFieldBlur();"
observes="paneElementsBroadcaster"/>
</row>
<row align="center" id="editBMPanel_feedLocationRow">
<label value="&editBookmarkOverlay.feedLocation.label;"
control="editBMPanel_feedLocationField"
observes="paneElementsBroadcaster"/>
<textbox id="editBMPanel_feedLocationField"
onblur="gEditItemOverlay.onFeedLocationFieldBlur();"
observes="paneElementsBroadcaster"/>
</row>
<row align="center" id="editBMPanel_siteLocationRow">
<label value="&editBookmarkOverlay.siteLocation.label;"
control="editBMPanel_siteLocationField"
observes="paneElementsBroadcaster"/>
<textbox id="editBMPanel_siteLocationField"
onblur="gEditItemOverlay.onSiteLocationFieldBlur();"
observes="paneElementsBroadcaster"/>
</row>
<row align="center" id="editBMPanel_folderRow">
<label value="&editBookmarkOverlay.folder.label;"
control="editBMPanel_folderMenuList"/>
control="editBMPanel_folderMenuList"
observes="paneElementsBroadcaster"/>
<menulist id="editBMPanel_folderMenuList"
class="folder-icon"
oncommand="gEditItemOverlay.onFolderMenuListCommand();">
oncommand="gEditItemOverlay.onFolderMenuListCommand();"
observes="paneElementsBroadcaster">
<menupopup>
<!-- Static item for special folders -->
<menuitem id="editBMPanel_unfiledRootItem"
@ -107,7 +133,8 @@
tooltiptext="&editBookmarkOverlay.foldersExpanderDown.tooltip;"
tooltiptextdown="&editBookmarkOverlay.foldersExpanderDown.tooltip;"
tooltiptextup="&editBookmarkOverlay.expanderUp.tooltip;"
oncommand="gEditItemOverlay.toggleFolderTreeVisibility();"/>
oncommand="gEditItemOverlay.toggleFolderTreeVisibility();"
observes="paneElementsBroadcaster"/>
</row>
<tree id="editBMPanel_folderTree"
@ -118,7 +145,8 @@
onselect="gEditItemOverlay.onFolderTreeSelect();"
showRoot="true"
place="place:folder=2&amp;group=3&amp;excludeItems=1&amp;excludeQueries=1&amp;excludeReadOnlyFolders=1"
hidecolumnpicker="true">
hidecolumnpicker="true"
observes="paneElementsBroadcaster">
<treecols>
<treecol anonid="title" flex="1" primary="true" hideheader="true"/>
</treecols>
@ -127,25 +155,46 @@
<row align="center" id="editBMPanel_tagsRow">
<label value="&editBookmarkOverlay.tags.label;"
control="tagsField"/>
control="tagsField"
observes="paneElementsBroadcaster"/>
<textbox id="editBMPanel_tagsField"
onblur="gEditItemOverlay.onTagsFieldBlur();"/>
onblur="gEditItemOverlay.onTagsFieldBlur();"
observes="paneElementsBroadcaster"/>
<button id="editBMPanel_tagsSelectorExpander"
class="expander-down"
tooltiptext="&editBookmarkOverlay.tagsExpanderDown.tooltip;"
tooltiptextdown="&editBookmarkOverlay.tagsExpanderDown.tooltip;"
tooltiptextup="&editBookmarkOverlay.expanderUp.tooltip;"
oncommand="gEditItemOverlay.toggleTagsSelector();"/>
oncommand="gEditItemOverlay.toggleTagsSelector();"
observes="paneElementsBroadcaster"/>
</row>
<listbox id="editBMPanel_tagsSelector" height="150" collapsed="true"/>
<listbox id="editBMPanel_tagsSelector"
height="150" collapsed="true"
observes="paneElementsBroadcaster"/>
<row id="editBMPanel_descriptionRow" align="center">
<row id="editBMPanel_keywordRow">
<label value="&editBookmarkOverlay.keyword.label;"
control="editBMPanel_keywordField"
observes="paneElementsBroadcaster"/>
<textbox id="editBMPanel_keywordField"
onblur="gEditItemOverlay.onKeywordFieldBlur();"
observes="paneElementsBroadcaster"/>
</row>
<row id="editBMPanel_descriptionRow">
<label value="&editBookmarkOverlay.description.label;"
control="editBMPanel_descriptionField"/>
control="editBMPanel_descriptionField"
observes="paneElementsBroadcaster"/>
<textbox id="editBMPanel_descriptionField"
onblur="gEditItemOverlay.onDescriptionFieldBlur();"/>
multiline="true"
onblur="gEditItemOverlay.onDescriptionFieldBlur();"
observes="paneElementsBroadcaster"/>
</row>
<checkbox id="editBMPanel_loadInSidebarCheckbox"
label="&editBookmarkOverlay.loadInSidebar.label;"
oncommand="gEditItemOverlay.onLoadInSidebarCheckboxCommand();"
observes="paneElementsBroadcaster"/>
</rows>
</grid>
</vbox>

Просмотреть файл

@ -27,3 +27,10 @@ button.commandButton {
display: -moz-box;
}
/* Edit Item Panel */
#infoScrollbox[minimal="true"] #editBMPanel_descriptionRow,
#infoScrollbox[minimal="true"] #editBMPanel_loadInSidebarCheckbox,
#infoScrollbox[minimal="true"] #editBMPanel_keywordRow {
visibility: collapse;
}

Просмотреть файл

@ -10,4 +10,3 @@ hbox[type="places"] {
menupopup[type="places"] {
-moz-binding: url("chrome://browser/content/places/menu.xml#places-menupopup");
}

Просмотреть файл

@ -106,6 +106,7 @@ var PlacesOrganizer = {
this._backHistory.unshift(this.location);
this._content.place = this._location = aLocation;
this.onContentTreeSelect();
// update navigation commands
if (this._backHistory.length == 0)
@ -185,7 +186,6 @@ var PlacesOrganizer = {
* Loads the place URI entered in the debug
*/
loadPlaceURI: function PO_loadPlaceURI() {
// clear forward history
this._forwardHistory.splice(0);
@ -498,28 +498,159 @@ var PlacesOrganizer = {
}
},
_paneDisabled: false,
_setDetailsFieldsDisabledState:
function PO__setDetailsFieldsDisabledState(aDisabled) {
if (aDisabled) {
document.getElementById("paneElementsBroadcaster")
.setAttribute("disabled", "true");
}
else {
document.getElementById("paneElementsBroadcaster")
.removeAttribute("disabled");
}
},
_detectAndSetDetailsPaneMinimalState:
function PO__detectAndSetDetailsPaneMinimalState(aNode) {
/**
* The details of simple folder-items (as opposed to livemarks) or the
* of livemark-children are not likely to fill the scrollbox anyway,
* thus we remove the "More/Less" button and show all details.
*
* the wasminimal attribute here is used to persist the "more/less"
* state in a bookmark->folder->bookmark scenario.
*/
var infoScrollbox = document.getElementById("infoScrollbox");
var scrollboxExpander = document.getElementById("infoScrollboxExpander");
if ((PlacesUtils.nodeIsFolder(aNode) &&
!PlacesUtils.nodeIsLivemarkContainer(aNode)) ||
PlacesUtils.nodeIsLivemarkItem(aNode)) {
if (infoScrollbox.getAttribute("minimal") == "true")
infoScrollbox.setAttribute("wasminimal", "true");
infoScrollbox.removeAttribute("minimal");
scrollboxExpander.hidden = true;
}
else {
if (infoScrollbox.getAttribute("wasminimal") == "true")
infoScrollbox.setAttribute("minimal", "true");
infoScrollbox.removeAttribute("wasminimal");
scrollboxExpander.hidden = false;
}
},
updateThumbnailProportions: function PO_updateThumbnailProportions() {
var previewBox = document.getElementById("previewBox");
var canvas = document.getElementById("itemThumbnail");
var height = previewBox.boxObject.height;
var width = height * (screen.width / screen.height);
canvas.width = width;
canvas.height = height;
},
onContentTreeSelect: function PO_onContentTreeSelect() {
// If a textbox within a panel is focused, force-blur it so its contents
// are saved
if (gEditItemOverlay.itemId != -1) {
var focusedElement = document.commandDispatcher.focusedElement;
if (focusedElement instanceof HTMLInputElement &&
/^editBMPanel.*/.test(focusedElement.parentNode.parentNode.id))
focusedElement.blur();
}
var contentTree = document.getElementById("placeContent");
var deck = document.getElementById("infoDeck");
this.updateStatusBarForView(contentTree);
var detailsDeck = document.getElementById("detailsDeck");
if (contentTree.hasSelection) {
detailsDeck.selectedIndex = 1;
if (contentTree.hasSingleSelection) {
var selectedNode = contentTree.selectedNode;
if (selectedNode.itemId != -1 &&
!PlacesUtils.nodeIsSeparator(selectedNode)) {
if (this._paneDisabled) {
this._setDetailsFieldsDisabledState(false);
this._paneDisabled = false;
}
gEditItemOverlay.initPanel(selectedNode.itemId,
{ hiddenRows: ["folderPicker"] });
deck.selectedIndex = 1;
this._detectAndSetDetailsPaneMinimalState(selectedNode);
this.updateThumbnailProportions();
this._updateThumbnail();
return;
}
}
}
else {
detailsDeck.selectedIndex = 0;
var selectItemDesc = document.getElementById("selectItemDescription");
var itemsCountLabel = document.getElementById("itemsCountText");
var rowCount = this._content.treeBoxObject.view.rowCount;
if (rowCount == 0) {
selectItemDesc.hidden = true;
itemsCountLabel.value = PlacesUtils.getString("detailsPane.noItems");
}
else {
selectItemDesc.hidden = false;
if (rowCount == 1)
itemsCountLabel.value = PlacesUtils.getString("detailsPane.oneItem");
else {
itemsCountLabel.value =
PlacesUtils.getFormattedString("detailsPane.multipleItems",
[rowCount]);
}
}
this.updateThumbnailProportions();
this._updateThumbnail();
}
// Nothing to do if the pane was already disabled
if (!this._paneDisabled) {
gEditItemOverlay.uninitPanel();
deck.selectedIndex = 0;
this._setDetailsFieldsDisabledState(true);
this._paneDisabled = true;
}
},
_updateThumbnail: function PO__updateThumbnail() {
var bo = document.getElementById("previewBox").boxObject;
var width = bo.width;
var height = bo.height;
var canvas = document.getElementById("itemThumbnail");
var ctx = canvas.getContext('2d');
var notAvailableText = canvas.getAttribute("notavailabletext");
ctx.save();
ctx.fillStyle = "-moz-Dialog";
ctx.fillRect(0, 0, width, height);
ctx.translate(width/2, height/2);
ctx.fillStyle = "GrayText";
ctx.mozTextStyle = "12pt sans serif";
var len = ctx.mozMeasureText(notAvailableText);
ctx.translate(-len/2,0);
ctx.mozDrawText(notAvailableText);
ctx.restore();
},
toggleAdditionalInfoFields: function PO_toggleAdditionalInfoFields() {
var infoScrollbox = document.getElementById("infoScrollbox");
var scrollboxExpander = document.getElementById("infoScrollboxExpander");
if (infoScrollbox.getAttribute("minimal") == "true") {
infoScrollbox.removeAttribute("minimal");
scrollboxExpander.label = scrollboxExpander.getAttribute("lesslabel");
}
else {
infoScrollbox.setAttribute("minimal", "true");
scrollboxExpander.label = scrollboxExpander.getAttribute("morelabel");
}
},
/**
* Save the current search (or advanced query) to the bookmarks root.
*/
saveSearch: function PP_saveSearch() {
saveSearch: function PO_saveSearch() {
// Get the place: uri for the query.
// If the advanced query builder is showing, use that.
var queries = [];
@ -562,8 +693,11 @@ var PlacesOrganizer = {
if (!save || input.value == "")
return;
// Add the place: uri as a bookmark under the places root.
var txn = PlacesUtils.ptm.createItem(placeURI, PlacesUtils.bookmarks.bookmarksRoot, PlacesUtils.bookmarks.DEFAULT_INDEX, input.value);
// Add the place: uri as a bookmark under the bookmarks root.
var txn = PlacesUtils.ptm.createItem(placeURI,
PlacesUtils.bookmarksRootId,
PlacesUtils.bookmarks.DEFAULT_INDEX,
input.value);
PlacesUtils.ptm.commitTransaction(txn);
}
};
@ -1073,17 +1207,15 @@ var PlacesQueryBuilder = {
}
else {
query.uriIsPrefix = (type == "startswith");
var ios = Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
var spec = document.getElementById(prefix + "Textbox").value;
try {
query.uri = ios.newURI(spec, null, null);
query.uri = IO.newURI(spec);
}
catch (e) {
// Invalid input can cause newURI to barf, that's OK, tack "http://"
// onto the front and try again to see if the user omitted it
try {
query.uri = ios.newURI("http://" + spec, null, null);
query.uri = IO.newURI("http://" + spec);
}
catch (e) {
// OK, they have entered something which can never match. This should
@ -1668,4 +1800,3 @@ var Groupers = {
OptionsFilter.update(content.getResult());
}
};

Просмотреть файл

@ -45,6 +45,8 @@
<?xml-stylesheet href="chrome://global/skin/"?>
<?xml-stylesheet href="chrome://browser/skin/places/places.css"?>
<?xul-overlay href="chrome://browser/content/places/editBookmarkOverlay.xul"?>
#ifdef XP_MACOSX
<?xul-overlay href="chrome://browser/content/macBrowserOverlay.xul"?>
#else
@ -64,6 +66,7 @@
title="&places.organizer.title;"
windowtype="Places:Organizer"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml"
onload="PlacesOrganizer.init();"
onunload="PlacesOrganizer.destroy();"
width="700" height="500" screenX="10" screenY="10"
@ -71,6 +74,8 @@
<script type="application/x-javascript"
src="chrome://browser/content/places/places.js"/>
<script type="application/javascript"
src="chrome://browser/content/utilityOverlay.js"/>
#ifdef XP_MACOSX
#include ../../../base/content/browserMountPoints.inc
@ -246,15 +251,6 @@
label="&deleteCmd.label;"
key="key_delete"
accesskey="&deleteCmd.accesskey;"/>
<menuitem id="orgRename"
command="placesCmd_rename"
label="&cmd.rename.label;"
accesskey="&cmd.rename.accesskey;"/>
<menuitem id="orgProperties"
command="placesCmd_show:info"
label="&cmd.properties.label;"
key="placesKey_show:info"
accesskey="&cmd.properties.accesskey;"/>
<menuseparator id="orgCloseSeparator"/>
@ -270,6 +266,7 @@
label="&views.label;"
accesskey="&view.accesskey;">
<menupopup id="viewMenuPopup">
<!--
<menuitem id="viewDetails"
type="radio"
#ifdef MACOSX
@ -282,18 +279,19 @@
<menuseparator id="addonsSeparator"/>
<!--
<menuitem id="viewAddons"
command=""
label="&view.addons.label;"
accesskey="&view.addons.label;"/>
<menuseparator id="sortingSeparator"/>
-->
-->
<menu id="viewColumns"
label="&view.columns.label;" accesskey="&view.columns.accesskey;">
<menupopup onpopupshowing="ViewMenu.fillWithColumns(event, null, null, 'checkbox', null);"
oncommand="ViewMenu.showHideColumn(event.target); event.stopPropagation();"/>
</menu>
<menu id="viewSort" label="&view.sort.label;"
accesskey="&view.sort.accesskey;">
<menupopup onpopupshowing="ViewMenu.populateSortMenu(event);"
@ -310,14 +308,14 @@
oncommand="ViewMenu.setSortColumn(null, 'descending'); event.stopPropagation();"/>
</menupopup>
</menu>
<!--
<!--
<menuseparator id="groupingSeparator" observes="placesBC_grouping:separator"/>
<menuitem id="viewGroupNone" type="radio" name="group"
observes="placesBC_grouping:off"/>
<menuitem id="viewGroupGroup" type="radio" name="group"
observes="placesBC_grouping:on"/>
-->
-->
</menupopup>
</toolbarbutton>
@ -409,10 +407,12 @@
</hbox>
</hbox>
#include advancedSearch.inc
<vbox flex="1">
<tree id="placeContent" class="placesTree" context="placesContext"
flex="1" type="places"
ondblclick="this.controller.openSelectedNodeWithEvent(event);"
onclick="PlacesOrganizer.onTreeClick(event);">
onclick="PlacesOrganizer.onTreeClick(event);"
onselect="PlacesOrganizer.onContentTreeSelect();">
<treecols id="placeContentColumns">
<treecol label="&col.name.label;" id="title" flex="5" primary="true"
persist="width hidden ordinal sortActive sortDirection"/>
@ -443,6 +443,38 @@
</treecols>
<treechildren id="placeContentChildren" view="placeContent" flex="1"/>
</tree>
<splitter id="contentSplitter" collapse="after" persist="state">
<grippy/>
</splitter>
<hbox persist="height" id="infoPane">
<hbox id="previewBox" style="min-width: 60px; -moz-border-end: 1px solid GrayText;">
<html:canvas id="itemThumbnail" notavailabletext="&detailsPane.noPreviewAvailable.label;"/>
</hbox>
<deck flex="1" id="detailsDeck">
<vbox align="center">
<spacer flex="3"/>
<label id="itemsCountText"/>
<spacer flex="1"/>
<description id="selectItemDescription">
&detailsPane.selectAnItemText.description;
</description>
<spacer flex="3"/>
</vbox>
<scrollbox id="infoScrollbox" minimal="true" orient="vertical" flex="1" style='overflow: auto;'>
<vbox id="editBookmarkPanelContent"/>
<hbox>
<button type="image" id="infoScrollboxExpander"
lesslabel="&detailsPane.less.label;"
morelabel="&detailsPane.more.label;"
label="&detailsPane.more.label;"
oncommand="PlacesOrganizer.toggleAdditionalInfoFields();"
observes="paneElementsBroadcaster"/>
<spacer flex="1"/>
</hbox>
</scrollbox>
</deck>
</hbox>
</vbox>
<vbox id="debugPanel" hidden="true">
<grid>
<columns>

Просмотреть файл

@ -52,6 +52,7 @@ const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
const DESCRIPTION_ANNO = "bookmarkProperties/description";
const POST_DATA_ANNO = "URIProperties/POSTData";
const LMANNO_FEEDURI = "livemark/feedURI";
const LMANNO_SITEURI = "livemark/siteURI";
#ifdef XP_MACOSX
// On Mac OSX, the transferable system converts "\r\n" to "\n\n", where we
@ -408,7 +409,7 @@ var PlacesUtils = {
*/
nodeIsLivemarkContainer: function PU_nodeIsLivemarkContainer(aNode) {
return this.nodeIsFolder(aNode) &&
this.annotations.itemHasAnnotation(aNode.itemId, LMANNO_FEEDURI);
this.livemarks.isLivemark(aNode.itemId);
},
/**
@ -457,7 +458,7 @@ var PlacesUtils = {
},
/**
* String-wraps a NavHistoryResultNode according to the rules of the specified
* String-wraps a result node according to the rules of the specified
* content type.
* @param aNode
* The Result node to wrap (serialize)

Просмотреть файл

@ -1,5 +1,7 @@
<!ENTITY editBookmarkOverlay.name.label "Name:">
<!ENTITY editBookmarkOverlay.location.label "Location:">
<!ENTITY editBookmarkOverlay.feedLocation.label "Feed Location:">
<!ENTITY editBookmarkOverlay.siteLocation.label "Site Location:">
<!ENTITY editBookmarkOverlay.liveTitlesSeparator.label "Live Titles">
<!ENTITY editBookmarkOverlay.folder.label "Folder:">
<!ENTITY editBookmarkOverlay.allBookmarksFolderItem.label "All Bookmarks">
@ -9,4 +11,6 @@
<!ENTITY editBookmarkOverlay.expanderUp.tooltip "Hide">
<!ENTITY editBookmarkOverlay.tags.label "Tags:">
<!ENTITY editBookmarkOverlay.description.label "Description:">
<!ENTITY editBookmarkOverlay.keyword.label "Keyword:">
<!ENTITY editBookmarkOverlay.tagsExpanderDown.tooltip "Show all tags">
<!ENTITY editBookmarkOverlay.loadInSidebar.label "Load this bookmark in the sidebar">

Просмотреть файл

@ -191,3 +191,12 @@
<!ENTITY forwardCmd.label "Forward">
<!ENTITY forwardCmd.accesskey "F">
<!ENTITY forwardButton.tooltip "Go forward">
<!ENTITY detailsPane.more.label
"More">
<!ENTITY detailsPane.less.label
"Less">
<!ENTITY detailsPane.noPreviewAvailable.label
"Preview">
<!ENTITY detailsPane.selectAnItemText.description
"Select an item to view and edit its properties">

Просмотреть файл

@ -93,3 +93,7 @@ EnterExport=Export Bookmarks File
saveSearch.title=Save Search
saveSearch.inputLabel=Name:
saveSearch.defaultText=New Query
detailsPane.noItems=No items
detailsPane.oneItem=One item
detailsPane.multipleItems=%S items

Просмотреть файл

@ -49,6 +49,8 @@ classic.jar:
skin/classic/browser/places/editBookmarkOverlay.css (places/editBookmarkOverlay.css)
skin/classic/browser/places/starPage.png (places/starPage.png)
skin/classic/browser/places/pageStarred.png (places/pageStarred.png)
skin/classic/browser/places/twisty-open.gif (places/twisty-open.gif)
skin/classic/browser/places/twisty-closed.gif (places/twisty-closed.gif)
skin/classic/browser/places/tag.png (places/tag.png)
skin/classic/browser/places/organizer-toolbar.png (bookmarks/Bookmarks-toolbar.png)
skin/classic/browser/places/expander-closed-active.png (bookmarks/expander-closed-active.png)

Просмотреть файл

@ -112,17 +112,28 @@
*/
-moz-appearance: textfield;
cursor: text;
margin: 2px 4px;
border: 2px solid;
-moz-border-top-colors: ThreeDShadow ThreeDDarkShadow;
-moz-border-right-colors: ThreeDHighlight ThreeDLightShadow;
-moz-border-bottom-colors: ThreeDHighlight ThreeDLightShadow;
-moz-border-left-colors: ThreeDShadow ThreeDDarkShadow;
padding: 2px 2px 3px 4px;
margin: 4px 4px;
border: 3px solid;
-moz-border-top-colors: transparent #888888 #000000;
-moz-border-right-colors: transparent #FFFFFF #000000;
-moz-border-bottom-colors: transparent #FFFFFF #000000;
-moz-border-left-colors: transparent #888888 #000000;
-moz-border-radius-topright: 2px;
-moz-border-radius-bottomleft: 2px;
padding: 0;
background-color: -moz-Field;
color: -moz-FieldText;
}
#editBMPanel_namePicker[droppable="false"][disabled="true"] > .menulist-editable-box {
cursor: default;
-moz-border-top-colors: transparent ThreeDShadow -moz-Dialog;
-moz-border-right-colors: transparent ThreeDShadow -moz-Dialog;
-moz-border-bottom-colors: transparent ThreeDShadow -moz-Dialog;
-moz-border-left-colors: transparent ThreeDShadow -moz-Dialog;
color: GrayText;
}
#editBMPanel_namePicker[droppable="false"] > .menulist-editable-box > html|*.textbox-input {
margin: 0px !important;
border: none !important;

Просмотреть файл

@ -272,3 +272,24 @@ treechildren::-moz-tree-twisty(title, separator) {
min-width:0em;
}
/**
* info pane
*/
/* More/Less button */
#infoScrollboxExpander {
list-style-image: url("chrome://browser/skin/places/twisty-open.gif");
-moz-appearance: none;
margin: 0;
padding: 0;
max-width: 0;
}
#infoScrollbox[minimal="true"] #infoScrollboxExpander {
list-style-image: url("chrome://browser/skin/places/twisty-closed.gif");
}
#itemsCountText,
#selectItemDescription {
color: GrayText;
}

Двоичные данные
browser/themes/pinstripe/browser/places/twisty-closed.gif Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 372 B

Двоичные данные
browser/themes/pinstripe/browser/places/twisty-open.gif Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 372 B

Просмотреть файл

@ -358,7 +358,7 @@
<binding id="menulist-editable" extends="chrome://global/content/bindings/menulist.xml#menulist">
<content sizetopopup="pref">
<xul:hbox class="menulist-editable-box textbox-input-box" xbl:inherits="context" flex="1">
<xul:hbox class="menulist-editable-box textbox-input-box" xbl:inherits="context,disabled,readonly" flex="1">
<html:input class="menulist-editable-input" flex="1" anonid="input" allowevents="true"
xbl:inherits="value=label,value,disabled,tabindex,readonly"/>
</xul:hbox>
@ -493,6 +493,11 @@
]]></getter>
</property>
<property name="readOnly" onset="this.inputField.readOnly = val;
if (val) this.setAttribute('readonly', 'true');
else this.removeAttribute('readonly'); return val;"
onget="return this.inputField.readOnly;"/>
<method name="select">
<body>
this.inputField.select();