Firestorm Area Search re-write. See full comment comments for details.

Engine redone and is now 10x to 100x faster and many bugs fixed.
UI changed and added tabs.
Added search for creator, last owner.
Added regular expressions to the find tab.
Added filter result list for:
For sale, distance, mouse click action, touch, locked, physical, phantom, tempary, and attachment.
Can include or exclude attachments, physical, or temporary objects in the search.
Added distance, creator, last owner columes.
Options to display any columes.
Right click menu on result list to perform action on selected objects:
Script info, touch, teleport to, inspect, edit, return, delete, and buy object.
Display beacons on found objects.
Techwolf Lupindo 2012-10-29 21:39:06 -04:00
parent 0511eb162f
commit 4d086c7faa
12 changed files with 2766 additions and 444 deletions

View File

@ -2758,6 +2758,54 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params
dirtyColumns();
}
// <FS:Techwolf Lupindo> area search
// area search support for deleting a column
LLScrollListColumn::Params LLScrollListCtrl::delColumn(std::string name)
{
std::vector<LLScrollListColumn::Params> column_params;
LLScrollListColumn::Params params;
// save params for each column
ordered_columns_t::iterator column_itor;
for (column_itor = mColumnsIndexed.begin(); column_itor != mColumnsIndexed.end(); ++column_itor)
{
LLScrollListColumn* column = (*column_itor);
params.header.label = column->mLabel;
params.name = column->mName;
params.width.dynamic_width = column->mDynamicWidth;
params.width.relative_width = column->mRelWidth;
params.width.pixel_width = column->getWidth();
params.halign = column->mFontAlignment;
LLScrollColumnHeader *header = column->mHeader;
if (header)
{
params.tool_tip = header->getToolTip();
}
column_params.push_back(params);
}
clearColumns();
// restore colums except named column.
for (std::vector<LLScrollListColumn::Params>::iterator iter = column_params.begin(); iter != column_params.end(); ++iter)
{
std::string i_name = iter->name;
if (i_name != name)
{
addColumn((*iter));
}
else
{
params = (*iter);
}
}
return params;
}
// </FS:Techwolf Lupindo> area search
// static
void LLScrollListCtrl::onClickColumn(void *userdata)
{

View File

@ -156,6 +156,9 @@ public:
// Adds a single column descriptor: ["name" : string, "label" : string, "width" : integer, "relwidth" : integer ]
virtual void addColumn(const LLScrollListColumn::Params& column, EAddPosition pos = ADD_BOTTOM);
virtual void addColumn(const LLSD& column, EAddPosition pos = ADD_BOTTOM);
// <FS:Techwolf Lupindo> area search, allow deleting a column
virtual LLScrollListColumn::Params delColumn(std::string name);
// </FS:Techwolf Lupindo> area search
virtual void clearColumns();
virtual void setColumnLabel(const std::string& column, const std::string& label);
virtual bool preProcessChildNode(LLXMLNodePtr child);

View File

@ -18319,6 +18319,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSAreaSearchAdvanced</key>
<map>
<key>Comment</key>
<string>Displays the advanced settings tab</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSCollisionMessagesInChat</key>
<map>
<key>Comment</key>

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,28 @@
/* Copyright (c) 2009
/**
* @file fsareasearch.h
* @brief Floater to search and list objects in view or is known to the viewer.
*
* Modular Systems. All rights reserved.
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2012 Techwolf Lupindo
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
* 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.
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* 3. Neither the name Modular Systems nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS “AS IS”
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* Modified, debugged, optimized and improved by Henri Beauchamp Feb 2010.
* Refactored for Viewer2 by Kadah Coba, April 2011
* 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
*
* The Phoenix Viewer Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.phoenixviewer.com
* $/LicenseInfo$
*/
#include "llfloater.h"
@ -37,64 +30,359 @@
#include "lluuid.h"
#include "llstring.h"
#include "llframetimer.h"
#include "llsaleinfo.h"
#include "llcategory.h"
#include "llpermissions.h"
#include "llviewerobject.h"
#include <boost/regex.hpp>
#include <boost/graph/graph_concepts.hpp>
#include "llscrolllistcolumn.h"
class LLTextBox;
class LLScrollListCtrl;
class LLViewerRegion;
class LLCheckBoxCtrl;
class LLLineEditor;
class LLTabContainer;
class LLContextMenu;
class LLSpinCtrl;
class LLComboBox;
struct AObjectDetails
class FSPanelAreaSearchList;
class FSPanelAreaSearchFind;
class FSPanelAreaSearchFilter;
class FSPanelAreaSearchAdvanced;
class FSPanelAreaSearchOptions;
struct FSObjectProperties
{
LLUUID id;
bool valid;
bool listed;
std::string name;
std::string desc;
std::string description;
std::string touch_name;
std::string sit_name;
LLUUID creator_id;
LLUUID owner_id;
LLUUID group_id;
LLUUID ownership_id;
BOOL group_owned; // used in LL function that uses BOOL instead of bool
U64 creation_date;
U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask;
LLSaleInfo sale_info;
LLCategory category;
LLUUID last_owner_id;
LLAggregatePermissions ag_perms;
LLAggregatePermissions ag_texture_perms;
LLAggregatePermissions ag_texture_perms_owner;
LLPermissions permissions;
uuid_vec_t texture_ids;
bool name_requested;
FSObjectProperties() :
valid(false),
listed(false),
name_requested(false)
{
}
};
//---------------------------------------------------------------------
// Main class for area search
// holds the search engine and main floater
// --------------------------------------------------------------------
class FSAreaSearch : public LLSingleton<FSAreaSearch>, public LLFloater
{
LOG_CLASS(FSAreaSearch);
public:
FSAreaSearch(const LLSD &);
virtual ~FSAreaSearch();
/*virtual*/ BOOL postBuild();
virtual void draw();
void callbackLoadOwnerName(const LLUUID& id, const std::string& full_name);
void processObjectPropertiesFamily(LLMessageSystem* msg);
void callbackLoadFullName(const LLUUID& id, const std::string& full_name);
void processObjectProperties(LLMessageSystem* msg);
static void idle(void *user_data);
void checkRegion();
void refreshList(bool cache_clear);
void onCommitLine();
void clearSearchText();
void onButtonClickedSearch();
void onCommitCheckboxRegex();
bool isSearchableObject (LLViewerObject* objectp, LLViewerRegion* our_region);
std::map<LLUUID, FSObjectProperties> mObjectDetails;
FSPanelAreaSearchAdvanced* getPanelAdvanced() { return mPanelAdvanced; }
FSPanelAreaSearchList* getPanelList() { return mPanelList; }
void setFilterForSale(bool b) { mFilterForSale = b; }
void setFilterLocked(bool b) { mFilterLocked = b; }
void setFilterPhysicial(bool b) { mFilterPhysicial = b; }
void setFilterTemporary(bool b) { mFilterTemporary = b; }
void setFilterPhantom(bool b) { mFilterPhantom = b; }
void setFilterAttachment(bool b) { mFilterAttachment = b; }
void setRegexSearch(bool b) { mRegexSearch = b; }
void setBeacons(bool b) { mBeacons = b; }
void setExcludeAttachment(bool b) { mExcludeAttachment = b; }
void setExcludeTempary(bool b) { mExcludeTempary = b; }
void setExcludePhysics(bool b) { mExcludePhysics = b; }
void setFilterForSaleMin(S32 s) { mFilterForSaleMin = s; }
void setFilterForSaleMax(S32 s) { mFilterForSaleMax = s; }
void setFilterClickAction(bool b) { mFilterClickAction = b; }
void setFilterClickActionType(U8 u) { mFilterClickActionType = u; }
void setFilterDistance(bool b) { mFilterDistance = b; }
void setFilterDistanceMin(S32 s) { mFilterDistanceMin = s; }
void setFilterDistanceMax(S32 s) { mFilterDistanceMax = s; }
private:
void results();
void checkRegion();
void cancel();
void search();
void onCommitLine(class LLLineEditor* line, void* user_data);
void requestIfNeeded(class LLViewerObject *objectp);
void onDoubleClick();
void requestObjectProperties(const std::vector<U32>& request_list, bool select);
void matchObject(FSObjectProperties& details, LLViewerObject* objectp);
void getName(LLUUID& id, std::string& name, BOOL group, bool& name_requested);
enum OBJECT_COLUMN_ORDER
{
LIST_OBJECT_NAME,
LIST_OBJECT_DESC,
LIST_OBJECT_OWNER,
LIST_OBJECT_GROUP
};
void updateCounterText();
bool regexTest(std::string text);
void findObjects();
S32 mRequested;
bool mRefresh;
S32 mSearchableObjects;
bool mActive;
std::string mSearchName;
std::string mSearchDescription;
std::string mSearchOwner;
std::string mSearchGroup;
std::string mSearchCreator;
std::string mSearchLastOwner;
bool mRegexSearch;
boost::regex mRegexSearchName;
boost::regex mRegexSearchDescription;
boost::regex mRegexSearchOwner;
boost::regex mRegexSearchGroup;
boost::regex mRegexSearchCreator;
boost::regex mRegexSearchLastOwner;
LLTextBox* mCounterText;
LLScrollListCtrl* mResultList;
LLFrameTimer mLastUpdateTimer;
std::map<LLUUID, AObjectDetails> mObjectDetails;
std::string mSearchedName;
std::string mSearchedDesc;
std::string mSearchedOwner;
std::string mSearchedGroup;
std::vector<LLUUID> mNamesRequested;
LLViewerRegion* mLastRegion;
class FSParcelChangeObserver;
friend class FSParcelChangeObserver;
FSParcelChangeObserver* mParcelChangedObserver;
// Used for checking to see if a floater has been created.
// Can not be trusted as a singleton pointer, don't use as a pointer.
FSAreaSearch* mInstance;
LLTabContainer* mTab;
FSPanelAreaSearchList* mPanelList;
FSPanelAreaSearchFind* mPanelFind;
FSPanelAreaSearchFilter* mPanelFilter;
FSPanelAreaSearchOptions* mPanelOptions;
FSPanelAreaSearchAdvanced* mPanelAdvanced;
bool mBeacons;
LLColor4 mBeaconColor;
LLColor4 mBeaconTextColor;
S32 mBeaconLineWidth;
bool mExcludeAttachment;
bool mExcludeTempary;
bool mExcludePhysics;
bool mFilterLocked;
bool mFilterPhysicial;
bool mFilterTemporary;
bool mFilterPhantom;
bool mFilterAttachment;
bool mFilterForSale;
S32 mFilterForSaleMin;
S32 mFilterForSaleMax;
bool mFilterDistance;
S32 mFilterDistanceMin;
S32 mFilterDistanceMax;
bool mFilterClickAction;
U8 mFilterClickActionType;
protected:
static void* createPanelList(void* data);
static void* createPanelFind(void* data);
static void* createPanelFilter(void* data);
static void* createPanelAdvanced(void* data);
static void* createPanelOptions(void* data);
};
//------------------------------------------------------------
// List panel
// displays the found objects
//------------------------------------------------------------
class FSPanelAreaSearchList
: public LLPanel
{
LOG_CLASS(FSPanelAreaSearchList);
public:
FSPanelAreaSearchList(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchList();
/*virtual*/ BOOL postBuild();
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
void setCounterText();
void setCounterText(LLStringUtil::format_map_t args);
void updateScrollList();
void updateName(LLUUID id, std::string name);
void touchObject(LLViewerObject* objectp);
LLScrollListCtrl* getResultList() { return mResultList; }
void setAgentLastPosition(LLVector3d d) { mAgentLastPosition = d; }
LLVector3d getAgentLastPosition() { return mAgentLastPosition; }
private:
void onDoubleClick();
void onClickRefresh();
void buyObject(FSObjectProperties& details, LLViewerObject* objectp);
void onCommitCheckboxBeacons();
LLContextMenu* mPopupMenu;
bool onContextMenuItemClick(const LLSD& userdata);
bool onContextMenuItemEnable(const LLSD& userdata);
LLVector3d mAgentLastPosition;
FSAreaSearch* mFSAreaSearch;
LLButton* mRefreshButton;
LLScrollListCtrl* mResultList;
LLCheckBoxCtrl* mCheckboxBeacons;
LLTextBox* mCounterText;
};
//------------------------------------------------------------
// Find panel
// UI for what objects to search for
//------------------------------------------------------------
class FSPanelAreaSearchFind
: public LLPanel
{
LOG_CLASS(FSPanelAreaSearchFind);
public:
FSPanelAreaSearchFind(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchFind();
/*virtual*/ BOOL postBuild();
LLLineEditor* mNameLineEditor;
LLLineEditor* mDescriptionLineEditor;
LLLineEditor* mOwnerLineEditor;
LLLineEditor* mGroupLineEditor;
LLLineEditor* mCreatorLineEditor;
LLLineEditor* mLastOwnerLineEditor;
LLCheckBoxCtrl* mCheckboxRegex;
private:
void onButtonClickedClear();
FSAreaSearch* mFSAreaSearch;
LLButton* mSearchButton;
LLButton* mClearButton;
};
//------------------------------------------------------------
// Filter panel
// "filter" the list to certion object types.
//------------------------------------------------------------
class FSPanelAreaSearchFilter
: public LLPanel
{
LOG_CLASS(FSPanelAreaSearchFilter);
public:
FSPanelAreaSearchFilter(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchFilter();
/*virtual*/ BOOL postBuild();
private:
void onCommitCheckbox();
void onCommitSpin();
void onCommitCombo();
FSAreaSearch* mFSAreaSearch;
LLCheckBoxCtrl* mCheckboxForSale;
LLCheckBoxCtrl* mCheckboxPhysical;
LLCheckBoxCtrl* mCheckboxTemporary;
LLCheckBoxCtrl* mCheckboxLocked;
LLCheckBoxCtrl* mCheckboxPhantom;
LLCheckBoxCtrl* mCheckboxDistance;
LLSpinCtrl* mSpinDistanceMinValue;
LLSpinCtrl* mSpinDistanceMaxValue;
LLSpinCtrl* mSpinForSaleMinValue;
LLSpinCtrl* mSpinForSaleMaxValue;
LLButton* mButtonApply;
LLComboBox* mComboClickAction;
LLCheckBoxCtrl* mCheckboxAttachment;
LLCheckBoxCtrl* mCheckboxExcludeAttachment;
LLCheckBoxCtrl* mCheckboxExcludePhysics;
LLCheckBoxCtrl* mCheckboxExcludeTempary;
};
//------------------------------------------------------------
// Options panel
//------------------------------------------------------------
class FSPanelAreaSearchOptions
: public LLPanel
{
LOG_CLASS(FSPanelAreaSearchOptions);
public:
FSPanelAreaSearchOptions(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchOptions();
// not used
// /*virtual*/ BOOL postBuild();
private:
void onCommitCheckboxDisplayColumn(const LLSD& userdata);
FSAreaSearch* mFSAreaSearch;
std::map<std::string, LLScrollListColumn::Params> mColumnParms;
};
//------------------------------------------------------------
// Advanced panel
//------------------------------------------------------------
class FSPanelAreaSearchAdvanced
: public LLPanel
{
LOG_CLASS(FSPanelAreaSearchAdvanced);
public:
FSPanelAreaSearchAdvanced(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchAdvanced();
/*virtual*/ BOOL postBuild();
LLCheckBoxCtrl* mCheckboxClickTouch;
LLCheckBoxCtrl* mCheckboxClickBuy;
private:
FSAreaSearch* mFSAreaSearch;
};

View File

@ -2685,9 +2685,11 @@ void register_viewer_callbacks(LLMessageSystem* msg)
msg->setHandlerFuncFast(_PREHASH_ImprovedInstantMessage, process_improved_im);
msg->setHandlerFuncFast(_PREHASH_ScriptQuestion, process_script_question);
msg->setHandlerFuncFast(_PREHASH_ObjectProperties, LLSelectMgr::processObjectProperties, NULL);
//msg->setHandlerFuncFast(_PREHASH_ObjectPropertiesFamily, LLSelectMgr::processObjectPropertiesFamily, NULL);
msg->setHandlerFuncFast(_PREHASH_ObjectPropertiesFamily, process_object_properties_family, NULL); //KC
// <FS:Techwolf Lupindo> area search
//msg->setHandlerFuncFast(_PREHASH_ObjectProperties, LLSelectMgr::processObjectProperties, NULL);
msg->setHandlerFuncFast(_PREHASH_ObjectProperties, process_object_properties, NULL);
// </FS:Techwolf Lupindo> area search
msg->setHandlerFuncFast(_PREHASH_ObjectPropertiesFamily, LLSelectMgr::processObjectPropertiesFamily, NULL);
msg->setHandlerFunc("ForceObjectSelect", LLSelectMgr::processForceObjectSelect);
msg->setHandlerFuncFast(_PREHASH_MoneyBalanceReply, process_money_balance_reply, NULL);

View File

@ -118,6 +118,11 @@ void handle_zoom_to_object(LLUUID object_id);
void handle_object_return();
void handle_object_delete();
// <FS:Techwolf Lupindo> area search
// expose this function so other classes can call it
void handle_object_edit();
// <FS:Techwolf Lupindo>
void handle_buy_land();
// Takes avatar UUID, or if no UUID passed, uses last selected object

View File

@ -5380,17 +5380,19 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
}
}
//ObjectPropertiesFamily -KC
void process_object_properties_family(LLMessageSystem *msg, void**user_data)
// <FS:Techwolf Lupindo> area search
void process_object_properties(LLMessageSystem *msg, void**user_data)
{
// Send the result to the corresponding requesters.
LLSelectMgr::processObjectPropertiesFamily(msg, user_data);
LLSelectMgr::processObjectProperties(msg, user_data);
FSAreaSearch* area_search_floater = dynamic_cast<FSAreaSearch*>(LLFloaterReg::getInstance("area_search"));
FSAreaSearch* area_search_floater = LLFloaterReg::getTypedInstance<FSAreaSearch>("area_search");
if( area_search_floater )
area_search_floater->processObjectPropertiesFamily(msg);
{
area_search_floater->processObjectProperties(msg);
}
}
// </FS:Techwolf Lupindo> area search
void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
{

View File

@ -84,7 +84,11 @@ void process_object_update(LLMessageSystem *mesgsys, void **user_data);
void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data);
void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data);
void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_data);
void process_object_properties_family(LLMessageSystem *msg, void**user_data);
// <FS:Techwolf Lupindo> area search
// send object properties to all classes that need it
void process_object_properties(LLMessageSystem *msg, void**user_data);
// </FS:Techwolf Lupindo> area search
void send_simulator_throttle_settings(const LLHost &host);
void process_kill_object( LLMessageSystem *mesgsys, void **user_data);

View File

@ -1,170 +1,673 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
name="area_search"
help_topic="fs_area_search"
title="Area Search for Objects"
min_width="425"
min_height="250"
width="600"
height="400"
save_rect="true"
can_resize="true"
can_minimize="true"
can_close="true"
can_drag_on_left="false">
<floater.string name="ListedPendingTotalBlank" value="Listed/Pending/Total"/>
<floater.string name="ListedPendingTotalFilled" value="[LISTED] Listed/[PENDING] Pending/[TOTAL] Total"/>
<text
name="name_label"
top_pad="10"
follows="top|left"
height="15"
left="12"
width="200">
Name search string:
</text>
<text
name="desc_label"
bottom_delta="0"
follows="top|left"
height="15"
left="218"
width="200">
Description search string:
</text>
<line_editor
name="Name query chunk"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left="10"
bottom_delta="20"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<line_editor
name="Description query chunk"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20" width="200"
left_delta="206"
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<text
name="owner_label"
bottom_delta="20"
follows="top|left"
height="15"
left="12"
width="200">
Owner search string:
</text>
<text
name="group_label"
bottom_delta="0"
follows="top|left"
height="15"
left="218"
width="200">
Group search string:
</text>
<line_editor
name="Owner query chunk"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left="10"
bottom_delta="20"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<line_editor
name="Group query chunk"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left_delta="206"
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<scroll_list
name="result_list"
left="10"
right="-10"
top="90"
bottom="-32"
follows="left|top|bottom|right"
can_resize="true"
column_padding="0"
draw_heading="true"
multi_select="false"
search_column="1">
<column
name="Name"
label="Name"
dynamicwidth="true"
tool_tip="Double click on any entry to get a position beacon"/>
<column
name="Description"
label="Description"
dynamicwidth="true"
tool_tip="Double click on any entry to get a position beacon"/>
<column
name="Owner"
label="Owner"
dynamicwidth="true"
tool_tip="Double click on any entry to get a position beacon"/>
<column
name="Group"
label="Group"
dynamicwidth="true"
tool_tip="Double click on any entry to get a position beacon"/>
</scroll_list>
<button
name="Refresh"
label="Refresh"
font="SansSerif"
mouse_opaque="true"
height="20"
width="80"
left="10"
bottom="-6"
follows="left|bottom"/>
<button
name="Stop"
label="Stop"
font="SansSerif"
mouse_opaque="true"
height="20"
width="80"
left_delta="85"
bottom="-6"
follows="left|bottom"/>
<text
name="counter"
height="15"
width="220"
left_delta="85"
bottom="-9"
follows="left|bottom">
Listed/Pending/Total
</text>
name="area_search"
help_topic="fs_area_search"
title="Area Search for Objects"
min_width="430"
min_height="255"
width="610"
height="435"
save_rect="true"
can_resize="true"
can_minimize="true"
can_close="true"
can_drag_on_left="false">
<tab_container
follows="all"
layout="topleft"
left="1"
right="-1"
name="area_searchtab"
tab_position="top"
tab_height="20"
tab_min_width="67"
bottom="430"
top="2">
<panel
border="true"
follows="all"
label="List"
layout="topleft"
left="0"
name="area_search_list_panel"
top="0"
height="435"
width="610" >
<panel.string
name="ListedPendingTotalBlank">
Listed | Pending | Total
</panel.string>
<panel.string
name="ListedPendingTotalFilled">
[LISTED] Listed | [PENDING] Pending | [TOTAL] Total
</panel.string>
<scroll_list
name="result_list"
left="5"
right="-5"
height="395"
top="5"
follows="left|top|bottom|right"
column_padding="0"
draw_heading="true"
multi_select="true"
search_column="1">
<scroll_list.columns
name="distance"
label="Dist"
width="40" />
<scroll_list.columns
name="name"
label="Name"
width="140" />
<scroll_list.columns
name="description"
label="Description"
width="140" />
<scroll_list.columns
name="owner"
label="Owner"
width="140" />
<scroll_list.columns
name="group"
label="Group"
width="140"
tool_tip="What group the object is set to."/>
<scroll_list.columns
name="creator"
label="Creator"
width="140" />
<scroll_list.columns
name="last_owner"
label="Last Owner"
width="140"
tool_tip="Who owned it last."/>
</scroll_list>
<button
name="Refresh"
label="Refresh"
font="SansSerif"
mouse_opaque="true"
height="20"
width="80"
left="10"
bottom="-6"
follows="left|bottom"/>
<text
name="counter"
height="15"
width="220"
left_delta="85"
bottom="-9"
follows="left|bottom">
Listed/Pending/Total
</text>
<check_box
follows="right|bottom"
height="16"
left_pad="180"
width="80"
name="beacons"
label="Show beacons"
bottom="-9" />
</panel>
<panel
border="true"
follows="all"
label="Find"
layout="topleft"
left="0"
top="0"
help_topic="area_search_find_tab"
name="area_search_find_panel" >
<text
name="name_label"
top_pad="10"
follows="top|left"
height="15"
left="12"
width="200">
Name:
</text>
<text
name="desc_label"
bottom_delta="0"
follows="top|left"
height="15"
left="218"
width="200">
Description:
</text>
<line_editor
name="name_search"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left="10"
bottom_delta="20"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<line_editor
name="description_search"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20" width="200"
left_delta="206"
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<text
name="owner_label"
bottom_delta="20"
follows="top|left"
height="15"
left="12"
width="200">
Owner:
</text>
<text
name="group_label"
bottom_delta="0"
follows="top|left"
height="15"
left="218"
width="200">
Group:
</text>
<line_editor
name="owner_search"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left="10"
bottom_delta="20"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<line_editor
name="group_search"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left_delta="206"
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<text
name="creator_label"
bottom_delta="20"
follows="top|left"
height="15"
left="12"
width="200">
Creator:
</text>
<text
name="last_owner_label"
bottom_delta="0"
follows="top|left"
height="15"
left="218"
width="200">
Last owner:
</text>
<line_editor
name="creator_search"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left="10"
bottom_delta="20"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<line_editor
name="last_owner_search"
tool_tip=""
bevel_style="in"
border_style="line"
border_thickness="1"
height="20"
width="200"
left_delta="206"
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
max_length_chars="256"
mouse_opaque="true" />
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="regular_expression"
label="Use regular expression"
top_pad="10" />
<button
name="search"
label="Search"
mouse_opaque="true"
height="20"
width="80"
left="10"
bottom="-6"
follows="left|bottom"/>
<button
name="clear"
label="Clear"
mouse_opaque="true"
height="20"
width="80"
left_pad="10"
bottom="-6"
follows="left|bottom"/>
</panel>
<panel
border="true"
follows="all"
label="Filter"
layout="topleft"
left="0"
top="0"
help_topic="area_search_filter_tab"
name="area_search_filter_panel" >
<text
name="only_list"
height="15"
follows="top|left"
left="5">
Only list objects that are:
</text>
<check_box
follows="top|left"
top_pad="10"
layout="topleft"
left="10"
name="filter_locked"
label="Locked"
width="80"
/>
<check_box
follows="top|left"
layout="topleft"
left_pad="0"
name="filter_physical"
label="Physical"
width="80" />
<check_box
follows="top|left"
layout="topleft"
name="filter_phantom"
label="Phantom"
left_pad="0"
width="80"/>
<check_box
follows="top|left"
layout="topleft"
name="filter_temporary"
label="Temporary"
left_pad="0"
width="80"/>
<check_box
follows="top|left"
layout="topleft"
name="filter_attachment"
label="Attachment"
left_pad="0"
width="80"/>
<check_box
follows="top|left"
height="20"
layout="topleft"
left="10"
name="filter_for_sale"
label="For Sale between"
top_pad="10"
width="120"/>
<spinner
decimal_digits="0"
follows="left|top"
increment="1"
initial_value="0"
layout="topleft"
left_pad="0"
max_val="999999999"
min_val="0"
name="min_price"
top_delta="0"
width="80" />
<text
name="and"
height="10"
follows="top|left"
left_pad="5"
top_delta="4"
width="22">
and
</text>
<spinner
decimal_digits="0"
follows="left|top"
increment="1"
initial_value="999999"
layout="topleft"
left_pad="5"
max_val="999999999"
min_val="0"
name="max_price"
top_delta="-4"
width="80" />
<text
name="mouse_text"
height="18"
follows="top|left"
left="15"
top_pad="25"
width="100">
Mouse click action
</text>
<combo_box
height="23"
follows="top|left"
name="click_action"
left_pad="0"
tool_tip="Action that is performed when clicking on an object."
width="80" >
<combo_box.item
enabled="true"
label=" "
name="click_blank"
value="blank" />
<combo_box.item
enabled="true"
label="Any"
name="click_any"
value="any" />
<combo_box.item
enabled="true"
label="Touch"
name="click_touch"
value="touch" />
<combo_box.item
enabled="true"
label="Sit"
name="click_sit"
value="sit" />
<combo_box.item
enabled="true"
label="Buy"
name="click_buy"
value="buy" />
<combo_box.item
enabled="true"
label="Pay"
name="click_pay"
value="pay" />
<combo_box.item
enabled="true"
label="Open"
name="click_open"
value="open" />
<combo_box.item
enabled="true"
label="Play"
name="click_play"
value="play" />
<combo_box.item
enabled="true"
label="Open Media"
name="click_open_media"
value="open_media" />
<combo_box.item
enabled="true"
label="Zoom"
name="click_zoom"
value="zoom" />
</combo_box>
<check_box
follows="top|left"
height="20"
layout="topleft"
left="10"
name="filter_distance"
label="Distance between"
top_pad="10"
width="120"/>
<spinner
decimal_digits="0"
follows="left|top"
increment="1"
initial_value="0"
layout="topleft"
left_pad="0"
max_val="999999999"
min_val="0"
name="min_distance"
top_delta="0"
width="80" />
<text
name="and"
height="10"
follows="top|left"
left_pad="5"
top_delta="4"
width="22">
and
</text>
<spinner
decimal_digits="0"
follows="left|top"
increment="1"
initial_value="999999"
layout="topleft"
left_pad="5"
max_val="999999999"
min_val="0"
name="max_distance"
top_delta="-4"
width="80" />
<text
name="only_list"
height="15"
top_pad="10"
follows="top|left"
left="5">
Exclude objects that are:
</text>
<check_box
follows="top|left"
top_pad="10"
layout="topleft"
left="10"
name="exclude_attachment"
label="Attachment"
width="80"
/>
<check_box
follows="top|left"
top_pad="10"
layout="topleft"
left="10"
name="exclude_physical"
label="Physical"
width="80"
/>
<check_box
follows="top|left"
top_pad="10"
layout="topleft"
left="10"
name="exclude_temporary"
label="Temporary"
width="80"
/>
<button
name="apply"
label="Apply"
mouse_opaque="true"
height="20"
width="80"
left="10"
bottom="-6"
follows="left|bottom"/>
</panel>
<panel
border="true"
follows="all"
label="Options"
layout="topleft"
left="0"
top="0"
help_topic="area_search_options_tab"
name="area_search_options_panel" >
<text
name="only_list"
height="15"
follows="top|left"
left="5">
Display column:
</text>
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="show_distance"
label="distance"
top_pad="10"
initial_value="true">
<check_box.commit_callback
function="AreaSearch.DisplayColumn"
parameter="distance" />
</check_box>
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="show_name"
label="name"
top_pad="10"
initial_value="true">
<check_box.commit_callback
function="AreaSearch.DisplayColumn"
parameter="name" />
</check_box>
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="show_description"
label="description"
top_pad="10"
initial_value="true">
<check_box.commit_callback
function="AreaSearch.DisplayColumn"
parameter="description" />
</check_box>
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="show_owner"
label="owner"
top_pad="10"
initial_value="true">
<check_box.commit_callback
function="AreaSearch.DisplayColumn"
parameter="owner" />
</check_box>
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="show_group"
label="group"
top_pad="10"
initial_value="true">
<check_box.commit_callback
function="AreaSearch.DisplayColumn"
parameter="group" />
</check_box>
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="show_creator"
label="creator"
top_pad="10"
initial_value="true">
<check_box.commit_callback
function="AreaSearch.DisplayColumn"
parameter="creator" />
</check_box>
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="show_last_owner"
label="last owner"
top_pad="10"
initial_value="true">
<check_box.commit_callback
function="AreaSearch.DisplayColumn"
parameter="last_owner" />
</check_box>
</panel>
<panel
border="true"
follows="all"
label="Advanced"
layout="topleft"
left="0"
top="0"
help_topic="area_search_advanced_tab"
name="area_search_advanced_panel" >
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="double_click_touch"
label="Double click touch object"
top_pad="10" />
<check_box
follows="top|left"
height="16"
layout="topleft"
left="8"
name="double_click_buy"
label="Double click buy object"
top_pad="10" />
</panel>
</tab_container>
</floater>

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<context_menu
layout="topleft"
name="Object List popup">
<menu_item_call
label="Script Info"
layout="topleft"
name="script_info">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="script" />
</menu_item_call>
<menu_item_call
label="Touch"
layout="topleft"
name="touch_object">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="touch" />
</menu_item_call>
<menu_item_call
label="Teleport to"
layout="topleft"
name="teleport_to_object">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="p_teleport" />
<menu_item_call.on_enable
function="AreaSearch.Enable"
parameter="one" />
</menu_item_call>
<menu_item_call
label="Inspect"
layout="topleft"
name="inspect_object">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="inspect" />
</menu_item_call>
<menu_item_call
label="Edit"
layout="topleft"
name="edit_object">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="edit" />
</menu_item_call>
<menu_item_call
label="Return"
layout="topleft"
name="return_object">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="return" />
</menu_item_call>
<menu_item_call
label="Delete"
layout="topleft"
name="delete_object">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="delete" />
</menu_item_call>
<!-- <menu_item_separator
layout="topleft" /> -->
<menu_item_call
label="Buy object"
layout="topleft"
name="object_buy">
<menu_item_call.on_click
function="AreaSearch.Action"
parameter="buy" />
<menu_item_call.on_enable
function="AreaSearch.Enable"
parameter="one" />
</menu_item_call>
</context_menu>

View File

@ -9370,4 +9370,13 @@ Did you know you can get the classic Phoenix Viewer look with Firestorm? Go to t
Unable to save snapshot.
<tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="RegExFail"
type="alertmodal">
Error in the regular expression:
[EWHAT]
<tag>fail</tag>
</notification>
</notifications>