phoenix-firestorm/indra/newview/llfloatergotoline.cpp

185 lines
5.4 KiB
C++

/**
* @file llfloatergotoline.h
* @author MartinRJ
* @brief LLFloaterGotoLine class implementation
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloatergotoline.h"
#include "llpreviewscript.h"
#include "llfloaterreg.h"
#include "lllineeditor.h"
#include "llscripteditor.h"
#include "llviewerwindow.h"
LLFloaterGotoLine* LLFloaterGotoLine::sInstance = NULL;
LLFloaterGotoLine::LLFloaterGotoLine(LLScriptEdCore* editor_core)
: LLFloater(LLSD()),
mGotoBox(NULL),
mEditorCore(editor_core)
{
buildFromFile("floater_goto_line.xml");
sInstance = this;
// find floater in which script panel is embedded
LLView* viewp = (LLView*)editor_core;
while(viewp)
{
LLFloater* floaterp = dynamic_cast<LLFloater*>(viewp);
if (floaterp)
{
floaterp->addDependentFloater(this);
break;
}
viewp = viewp->getParent();
}
}
BOOL LLFloaterGotoLine::postBuild()
{
mGotoBox = getChild<LLLineEditor>("goto_line");
mGotoBox->setCommitCallback(boost::bind(&LLFloaterGotoLine::onGotoBoxCommit, this));
mGotoBox->setCommitOnFocusLost(FALSE);
getChild<LLLineEditor>("goto_line")->setPrevalidate(LLTextValidate::validateNonNegativeS32);
childSetAction("goto_btn", onBtnGoto,this);
setDefaultBtn("goto_btn");
return TRUE;
}
//static
void LLFloaterGotoLine::show(LLScriptEdCore* editor_core)
{
if (sInstance && sInstance->mEditorCore && sInstance->mEditorCore != editor_core)
{
sInstance->closeFloater();
delete sInstance;
}
if (!sInstance)
{
// sInstance will be assigned in the constructor.
new LLFloaterGotoLine(editor_core);
}
sInstance->openFloater();
}
LLFloaterGotoLine::~LLFloaterGotoLine()
{
sInstance = NULL;
}
// static
void LLFloaterGotoLine::onBtnGoto(void *userdata)
{
LLFloaterGotoLine* self = (LLFloaterGotoLine*)userdata;
self->handleBtnGoto();
}
void LLFloaterGotoLine::handleBtnGoto()
{
S32 row = 0;
S32 column = 0;
row = getChild<LLUICtrl>("goto_line")->getValue().asInteger();
if (row >= 0)
{
// <FS:Ansariel> LSL Preprocessor
// if (mEditorCore && mEditorCore->mEditor)
// {
//mEditorCore->mEditor->deselect();
//mEditorCore->mEditor->setCursor(row, column);
//mEditorCore->mEditor->setFocus(TRUE);
// }
if (mEditorCore && mEditorCore->mCurrentEditor)
{
mEditorCore->mCurrentEditor->deselect();
mEditorCore->mCurrentEditor->setCursor(row, column);
mEditorCore->mCurrentEditor->setFocus(TRUE);
}
// </FS:Ansariel>
}
}
bool LLFloaterGotoLine::hasAccelerators() const
{
if (mEditorCore)
{
return mEditorCore->hasAccelerators();
}
return FALSE;
}
BOOL LLFloaterGotoLine::handleKeyHere(KEY key, MASK mask)
{
if (mEditorCore)
{
return mEditorCore->handleKeyHere(key, mask);
}
return FALSE;
}
void LLFloaterGotoLine::onGotoBoxCommit()
{
S32 row = 0;
S32 column = 0;
row = getChild<LLUICtrl>("goto_line")->getValue().asInteger();
if (row >= 0)
{
// <FS:Ansariel> LSL Preprocessor
// if (mEditorCore && mEditorCore->mEditor)
// {
//mEditorCore->mEditor->setCursor(row, column);
//S32 rownew = 0;
//S32 columnnew = 0;
//mEditorCore->mEditor->getCurrentLineAndColumn( &rownew, &columnnew, FALSE ); // don't include wordwrap
//if (rownew == row && columnnew == column)
//{
// mEditorCore->mEditor->deselect();
// mEditorCore->mEditor->setFocus(TRUE);
// sInstance->closeFloater();
//} //else do nothing (if the cursor-position didn't change)
// }
if (mEditorCore && mEditorCore->mCurrentEditor)
{
mEditorCore->mCurrentEditor->setCursor(row, column);
S32 rownew = 0;
S32 columnnew = 0;
mEditorCore->mCurrentEditor->getCurrentLineAndColumn( &rownew, &columnnew, FALSE ); // don't include wordwrap
if (rownew == row && columnnew == column)
{
mEditorCore->mCurrentEditor->deselect();
mEditorCore->mCurrentEditor->setFocus(TRUE);
sInstance->closeFloater();
} //else do nothing (if the cursor-position didn't change)
}
// </FS:Ansariel>
}
}