2013-02-18 15:55:30 -05:00
|
|
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
|
|
|
2019-02-08 22:21:36 -05:00
|
|
|
const { Clutter, Shell, St } = imports.gi;
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2013-02-18 15:55:44 -05:00
|
|
|
const BoxPointer = imports.ui.boxpointer;
|
2011-09-14 12:47:09 -04:00
|
|
|
const Main = imports.ui.main;
|
|
|
|
const Params = imports.misc.params;
|
|
|
|
const PopupMenu = imports.ui.popupMenu;
|
|
|
|
|
2017-10-30 21:19:44 -04:00
|
|
|
var EntryMenu = class extends PopupMenu.PopupMenu {
|
|
|
|
constructor(entry) {
|
|
|
|
super(entry, 0, St.Side.TOP);
|
2011-09-14 12:47:09 -04:00
|
|
|
|
|
|
|
this._entry = entry;
|
|
|
|
this._clipboard = St.Clipboard.get_default();
|
|
|
|
|
|
|
|
// Populate menu
|
|
|
|
let item;
|
|
|
|
item = new PopupMenu.PopupMenuItem(_("Copy"));
|
2017-12-01 19:27:35 -05:00
|
|
|
item.connect('activate', this._onCopyActivated.bind(this));
|
2011-09-14 12:47:09 -04:00
|
|
|
this.addMenuItem(item);
|
|
|
|
this._copyItem = item;
|
|
|
|
|
|
|
|
item = new PopupMenu.PopupMenuItem(_("Paste"));
|
2017-12-01 19:27:35 -05:00
|
|
|
item.connect('activate', this._onPasteActivated.bind(this));
|
2011-09-14 12:47:09 -04:00
|
|
|
this.addMenuItem(item);
|
|
|
|
this._pasteItem = item;
|
|
|
|
|
|
|
|
this._passwordItem = null;
|
|
|
|
|
|
|
|
Main.uiGroup.add_actor(this.actor);
|
|
|
|
this.actor.hide();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_makePasswordItem() {
|
2012-05-27 13:06:08 -04:00
|
|
|
let item = new PopupMenu.PopupMenuItem('');
|
2017-12-01 19:27:35 -05:00
|
|
|
item.connect('activate', this._onPasswordActivated.bind(this));
|
2012-05-27 13:06:08 -04:00
|
|
|
this.addMenuItem(item);
|
|
|
|
this._passwordItem = item;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2012-05-27 13:06:08 -04:00
|
|
|
|
|
|
|
get isPassword() {
|
2013-05-09 21:35:05 -04:00
|
|
|
return this._passwordItem != null;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2012-05-27 13:06:08 -04:00
|
|
|
|
|
|
|
set isPassword(v) {
|
2013-05-09 21:35:05 -04:00
|
|
|
if (v == this.isPassword)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (v) {
|
|
|
|
this._makePasswordItem();
|
2018-03-13 10:22:15 -04:00
|
|
|
this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD;
|
2013-05-09 21:35:05 -04:00
|
|
|
} else {
|
|
|
|
this._passwordItem.destroy();
|
|
|
|
this._passwordItem = null;
|
2018-03-13 10:22:15 -04:00
|
|
|
this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
|
2013-05-09 21:35:05 -04:00
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2012-05-27 13:06:08 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
open(animate) {
|
2011-09-14 12:47:09 -04:00
|
|
|
this._updatePasteItem();
|
|
|
|
this._updateCopyItem();
|
|
|
|
if (this._passwordItem)
|
|
|
|
this._updatePasswordItem();
|
|
|
|
|
2017-10-30 21:19:44 -04:00
|
|
|
super.open(animate);
|
2013-02-18 16:06:53 -05:00
|
|
|
this._entry.add_style_pseudo_class('focus');
|
|
|
|
|
2018-11-27 07:58:25 -05:00
|
|
|
let direction = St.DirectionType.TAB_FORWARD;
|
2011-09-14 12:47:09 -04:00
|
|
|
if (!this.actor.navigate_focus(null, direction, false))
|
|
|
|
this.actor.grab_key_focus();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2012-09-06 15:35:54 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_updateCopyItem() {
|
2011-09-14 12:47:09 -04:00
|
|
|
let selection = this._entry.clutter_text.get_selection();
|
2013-03-04 10:22:16 -05:00
|
|
|
this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
|
|
|
|
selection && selection != '');
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_updatePasteItem() {
|
2017-10-30 20:38:18 -04:00
|
|
|
this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
|
|
|
|
(clipboard, text) => {
|
2011-09-14 12:47:09 -04:00
|
|
|
this._pasteItem.setSensitive(text && text != '');
|
2017-10-30 20:38:18 -04:00
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_updatePasswordItem() {
|
2011-09-14 12:47:09 -04:00
|
|
|
let textHidden = (this._entry.clutter_text.password_char);
|
|
|
|
if (textHidden)
|
|
|
|
this._passwordItem.label.set_text(_("Show Text"));
|
|
|
|
else
|
|
|
|
this._passwordItem.label.set_text(_("Hide Text"));
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onCopyActivated() {
|
2011-09-14 12:47:09 -04:00
|
|
|
let selection = this._entry.clutter_text.get_selection();
|
2011-11-09 11:19:47 -05:00
|
|
|
this._clipboard.set_text(St.ClipboardType.CLIPBOARD, selection);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onPasteActivated() {
|
2017-10-30 20:38:18 -04:00
|
|
|
this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
|
|
|
|
(clipboard, text) => {
|
2011-09-14 12:47:09 -04:00
|
|
|
if (!text)
|
|
|
|
return;
|
|
|
|
this._entry.clutter_text.delete_selection();
|
|
|
|
let pos = this._entry.clutter_text.get_cursor_position();
|
|
|
|
this._entry.clutter_text.insert_text(text, pos);
|
2017-10-30 20:38:18 -04:00
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onPasswordActivated() {
|
2011-09-14 12:47:09 -04:00
|
|
|
let visible = !!(this._entry.clutter_text.password_char);
|
|
|
|
this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf');
|
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
};
|
2011-09-14 12:47:09 -04:00
|
|
|
|
|
|
|
function _setMenuAlignment(entry, stageX) {
|
|
|
|
let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0);
|
|
|
|
if (success)
|
2012-05-27 13:06:08 -04:00
|
|
|
entry.menu.setSourceAlignment(entryX / entry.width);
|
2019-01-28 20:18:52 -05:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2012-09-06 15:14:32 -04:00
|
|
|
function _onButtonPressEvent(actor, event, entry) {
|
2012-05-27 13:06:08 -04:00
|
|
|
if (entry.menu.isOpen) {
|
2013-02-18 15:55:44 -05:00
|
|
|
entry.menu.close(BoxPointer.PopupAnimation.FULL);
|
2013-11-29 13:17:34 -05:00
|
|
|
return Clutter.EVENT_STOP;
|
2012-09-06 15:14:32 -04:00
|
|
|
} else if (event.get_button() == 3) {
|
|
|
|
let [stageX, stageY] = event.get_coords();
|
2011-09-14 12:47:09 -04:00
|
|
|
_setMenuAlignment(entry, stageX);
|
2013-02-18 15:55:44 -05:00
|
|
|
entry.menu.open(BoxPointer.PopupAnimation.FULL);
|
2013-11-29 13:17:34 -05:00
|
|
|
return Clutter.EVENT_STOP;
|
2011-09-14 12:47:09 -04:00
|
|
|
}
|
2013-11-29 13:17:34 -05:00
|
|
|
return Clutter.EVENT_PROPAGATE;
|
2019-01-28 20:18:52 -05:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2012-09-06 15:14:32 -04:00
|
|
|
function _onPopup(actor, entry) {
|
2011-09-14 12:47:09 -04:00
|
|
|
let [success, textX, textY, lineHeight] = entry.clutter_text.position_to_coords(-1);
|
|
|
|
if (success)
|
2012-05-27 13:06:08 -04:00
|
|
|
entry.menu.setSourceAlignment(textX / entry.width);
|
2013-02-18 15:55:44 -05:00
|
|
|
entry.menu.open(BoxPointer.PopupAnimation.FULL);
|
2019-01-28 20:18:52 -05:00
|
|
|
}
|
2011-09-14 12:47:09 -04:00
|
|
|
|
|
|
|
function addContextMenu(entry, params) {
|
2012-05-27 13:06:08 -04:00
|
|
|
if (entry.menu)
|
2011-09-14 12:47:09 -04:00
|
|
|
return;
|
|
|
|
|
2019-01-23 15:59:42 -05:00
|
|
|
params = Params.parse (params, { isPassword: false, actionMode: Shell.ActionMode.POPUP });
|
2013-05-09 21:35:05 -04:00
|
|
|
|
|
|
|
entry.menu = new EntryMenu(entry);
|
|
|
|
entry.menu.isPassword = params.isPassword;
|
2019-04-09 19:23:59 -04:00
|
|
|
entry._menuManager = new PopupMenu.PopupMenuManager(entry,
|
2019-01-23 15:59:42 -05:00
|
|
|
{ actionMode: params.actionMode });
|
2012-05-27 13:06:08 -04:00
|
|
|
entry._menuManager.addMenu(entry.menu);
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2012-09-06 15:14:32 -04:00
|
|
|
// Add an event handler to both the entry and its clutter_text; the former
|
2011-09-14 12:47:09 -04:00
|
|
|
// so padding is included in the clickable area, the latter because the
|
|
|
|
// event processing of ClutterText prevents event-bubbling.
|
2017-12-01 19:27:35 -05:00
|
|
|
entry.clutter_text.connect('button-press-event', (actor, event) => {
|
|
|
|
_onButtonPressEvent(actor, event, entry);
|
|
|
|
});
|
|
|
|
entry.connect('button-press-event', (actor, event) => {
|
|
|
|
_onButtonPressEvent(actor, event, entry);
|
|
|
|
});
|
2011-09-14 12:47:09 -04:00
|
|
|
|
2019-01-27 19:42:00 -05:00
|
|
|
entry.connect('popup-menu', actor => _onPopup(actor, entry));
|
2013-04-04 11:35:50 -04:00
|
|
|
|
2017-10-30 20:38:18 -04:00
|
|
|
entry.connect('destroy', () => {
|
2013-04-04 11:35:50 -04:00
|
|
|
entry.menu.destroy();
|
|
|
|
entry.menu = null;
|
|
|
|
entry._menuManager = null;
|
|
|
|
});
|
2011-09-14 12:47:09 -04:00
|
|
|
}
|