Page 2 of 3

Posted: Thu Aug 23, 2012 11:25 am
by VladSh
KeepGoing
Можно взять CaretSelect.js, положить его в \Scripts\Include, а в \Scripts\ создать файл, к примеру

Code: Select all

if (! AkelPad.Include("CaretSelect.js")) WScript.Quit();

var URL = getLinkCaret();
if (URL) {
	if (URL.charAt(0) != "\\")	{	//не сетевой путь в файловой системе
		if (URL.indexOf(":\\") == -1 && URL.indexOf(":/") == -1)
			URL = "http://" + URL;
	}
	
	var WshShell = new ActiveXObject("WScript.Shell");
	WshShell.Exec('rundll32.exe shell32, ShellExec_RunDLL "' + URL + '"');
}

Открывает почти как Вы хотите. Почти - если в браузере была текущая вкладка, то при открытии ссылка откроется в фоне, а фокус останется на текущей вкладке (у меня в Опере так).

Можно было бы использовать функцию getLinkCaret() + скрипт openFileIn.js Infocatcher'а, но он к сожалению поддерживает только передачу параметров в виде аргументов.

Instructor
Очень не хватает в AEGI_ поиска начала и конца ссылки, находящейся под курсором.

Posted: Thu Aug 23, 2012 11:40 am
by VladSh
Infocatcher wrote:А меню вызывать с клавиатуры.
А как его вызвать с клавиатуры? Перепробовал все комбинации ContextMenu::Show, либо вылетает главное меню, либо требует обязательного указания подменю, находящегося ContextMenu::Show, меню же целиком (в данном случае меню ссылок) не выводит.

Posted: Thu Aug 23, 2012 12:06 pm
by Infocatcher
VladSh
Да стандартно, или кнопкой специальной, или Shift+F10.

Posted: Thu Aug 23, 2012 12:58 pm
by VladSh
Infocatcher
"стандартно, или кнопкой специальной" на подходит по условиям задачи, надо работать чисто с клавиатуры.
Жму по Shift+F10, меню вылетает, чтобы выбрать нужный пункт по комбинации клавиш надо жать Alt+0, но уже при нажатии Alt меню сбрасывается (старая баго-фича, о которой давно писали и просили, чтобы меню не сбрасывалось).

Posted: Thu Aug 23, 2012 1:07 pm
by Infocatcher
VladSh
Так это у всех меню так.
Alt+Ф => Файл
О => Открыть

При открытом меню нажимать Alt уже не надо.

Posted: Thu Aug 23, 2012 1:17 pm
by Fr0sT
Магическая кнопка между правой клавишей Win и правым Ctrl ;)

Posted: Thu Aug 23, 2012 1:41 pm
by VladSh
Infocatcher, Fr0sT
Работает. Прикольно :)

Posted: Thu Aug 23, 2012 2:19 pm
by Instructor
KeepGoing

Code: Select all

if (SelectLinkUnderCaret(AkelPad.GetEditWnd()))
  AkelPad.Exec('rundll32.exe shell32,ShellExec_RunDLL "' + AkelPad.GetSelText() + '"');

function SelectLinkUnderCaret(hWndEdit)
{
  var lpSel;
  var lpCaret;
  var bSelected=false;

  if (lpCaret=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaret);
    if (lpSel=AkelPad.MemAlloc(_X64?56:28 /*sizeof(AESELECTION)*/))
    {
      if (AkelPad.SendMessage(hWndEdit, 3149 /*AEM_INDEXINURL*/, lpCaret, lpSel))
      {
        AkelPad.SendMessage(hWndEdit, 3126 /*AEM_SETSEL*/, lpCaret, lpSel);
        bSelected=true;
      }
      AkelPad.MemFree(lpSel);
    }
    AkelPad.MemFree(lpCaret);
  }
  return bSelected;
}

Posted: Thu Aug 23, 2012 3:51 pm
by VladSh
Instructor
Здорово!
А можно ли ещё как-то не выделяя ссылку? Т.е. получить границы, текст ссылки, а затем открыть?

Posted: Thu Aug 23, 2012 5:43 pm
by KeepGoing
Instructor,
у меня OpenLinkUnderCaret.js, повешенный на хоткей, только выделяет ссылку, но в браузере ссылка не открывается

Posted: Thu Aug 23, 2012 6:09 pm
by KDJ
VladSh

Code: Select all

var sLink=GetLinkUnderCaret(AkelPad.GetEditWnd());
if (sLink)
  AkelPad.Exec('rundll32.exe shell32,ShellExec_RunDLL "' + sLink + '"');

function GetLinkUnderCaret(hWndEdit)
{
  var lpSel;
  var lpCaret;
  var nLinkStart;
  var nLinkEnd;
  var sLink;

  if (lpCaret=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaret);
    if (lpSel=AkelPad.MemAlloc(_X64?48:24 /*sizeof(AESELECTION)*/))
    {
      if (AkelPad.SendMessage(hWndEdit, 3149 /*AEM_INDEXINURL*/, lpCaret, lpSel))
      {
        nLinkStart=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpSel);
        nLinkEnd=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpSel + (_X64?24:12));
        sLink=AkelPad.GetTextRange(nLinkStart, nLinkEnd);
      }
      AkelPad.MemFree(lpSel);
    }
    AkelPad.MemFree(lpCaret);
  }
  return sLink;
}

Posted: Thu Aug 23, 2012 7:47 pm
by VladSh
KDJ
Thank you! Now there is both variants.

Edited:
Here's what obtained: CaretSelect.js.

Posted: Fri Aug 24, 2012 4:22 am
by Instructor
KeepGoing wrote:Instructor,
у меня OpenLinkUnderCaret.js, повешенный на хоткей, только выделяет ссылку, но в браузере ссылка не открывается
А так?

Code: Select all

var oSys=AkelPad.SystemFunction();
var hWndEdit=AkelPad.GetEditWnd();
var crUrl;

if (crUrl=GetLinkUnderCaret(hWndEdit))
  oSys.Call("shell32::ShellExecute" + _TCHAR, hWndEdit, "open", AkelPad.GetTextRange(crUrl.cpMin, crUrl.cpMax), 0, 0, 1 /*SW_SHOWNORMAL*/);

function GetLinkUnderCaret(hWndEdit)
{
  var lpRange;
  var lpCaret;
  var crUrl=[];
  var bResult=false;

  if (lpCaret=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaret);
    if (lpRange=AkelPad.MemAlloc(_X64?48:24 /*sizeof(AECHARRANGE)*/))
    {
      if (AkelPad.SendMessage(hWndEdit, 3149 /*AEM_INDEXINURL*/, lpCaret, lpRange))
      {
        crUrl.cpMin=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpRange);
        crUrl.cpMax=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpRange + (_X64?24:12) /*offsetof(AECHARRANGE, ciMax)*/);
        bResult=true;
      }
      AkelPad.MemFree(lpRange);
    }
    AkelPad.MemFree(lpCaret);
  }
  if (bResult)
    return crUrl;
  return 0;
}

Posted: Fri Aug 24, 2012 9:01 am
by VladSh
Instructor
Спасибо за ещё одну реализацию GetLinkUnderCaret, это как раз точно в ёлочку! 8)

Posted: Fri Aug 24, 2012 4:08 pm
by KeepGoing
Instructor wrote: А так?
вот теперь - аккурат то, что надо! :D