00001 
00032 
00033 
00034 
00035 
00036 #include "llviewerprecompiledheaders.h"
00037 
00038 #include "llpanelpick.h"
00039 
00040 #include "lldir.h"
00041 #include "llparcel.h"
00042 #include "message.h"
00043 
00044 #include "llagent.h"
00045 #include "llbutton.h"
00046 #include "llcheckboxctrl.h"
00047 #include "llviewercontrol.h"
00048 #include "lllineeditor.h"
00049 #include "lltabcontainervertical.h"
00050 #include "lltextbox.h"
00051 #include "llviewertexteditor.h"
00052 #include "lltexturectrl.h"
00053 #include "lluiconstants.h"
00054 #include "llviewergenericmessage.h"
00055 #include "llvieweruictrlfactory.h"
00056 #include "llviewerparcelmgr.h"
00057 #include "llworldmap.h"
00058 #include "llfloaterworldmap.h"
00059 #include "llviewerregion.h"
00060 #include "llviewerwindow.h"
00061 
00062 
00063 std::list<LLPanelPick*> LLPanelPick::sAllPanels;
00064 
00065 LLPanelPick::LLPanelPick(BOOL top_pick)
00066 :       LLPanel("Top Picks Panel"),
00067         mTopPick(top_pick),
00068         mPickID(),
00069         mCreatorID(),
00070         mParcelID(),
00071         mDataRequested(FALSE),
00072         mDataReceived(FALSE),
00073     mPosGlobal(),
00074     mSnapshotCtrl(NULL),
00075     mNameEditor(NULL),
00076     mDescEditor(NULL),
00077     mLocationEditor(NULL),
00078     mTeleportBtn(NULL),
00079     mMapBtn(NULL),
00080     
00081     mSortOrderText(NULL),
00082     mSortOrderEditor(NULL),
00083     mEnabledCheck(NULL),
00084     mSetBtn(NULL)
00085 {
00086     sAllPanels.push_back(this);
00087 
00088         std::string pick_def_file;
00089         if (top_pick)
00090         {
00091                 gUICtrlFactory->buildPanel(this, "panel_top_pick.xml");
00092         }
00093         else
00094         {
00095                 gUICtrlFactory->buildPanel(this, "panel_avatar_pick.xml");
00096         }       
00097 }
00098 
00099 
00100 LLPanelPick::~LLPanelPick()
00101 {
00102     sAllPanels.remove(this);
00103 }
00104 
00105 
00106 void LLPanelPick::reset()
00107 {
00108         mPickID.setNull();
00109         mCreatorID.setNull();
00110         mParcelID.setNull();
00111 
00112         
00113         mDataRequested = TRUE;
00114         mDataReceived = FALSE;
00115 
00116         mPosGlobal.clearVec();
00117 
00118         clearCtrls();
00119 }
00120 
00121 
00122 BOOL LLPanelPick::postBuild()
00123 {
00124     mSnapshotCtrl = LLViewerUICtrlFactory::getTexturePickerByName(this, "snapshot_ctrl");
00125         mSnapshotCtrl->setCommitCallback(onCommitAny);
00126         mSnapshotCtrl->setCallbackUserData(this);
00127 
00128     mNameEditor = LLViewerUICtrlFactory::getLineEditorByName(this, "given_name_editor");
00129         mNameEditor->setCommitOnFocusLost(TRUE);
00130         mNameEditor->setCommitCallback(onCommitAny);
00131         mNameEditor->setCallbackUserData(this);
00132 
00133     mDescEditor = LLUICtrlFactory::getTextEditorByName(this, "desc_editor");
00134         mDescEditor->setCommitOnFocusLost(TRUE);
00135         mDescEditor->setCommitCallback(onCommitAny);
00136         mDescEditor->setCallbackUserData(this);
00137         mDescEditor->setTabToNextField(TRUE);
00138 
00139     mLocationEditor = LLViewerUICtrlFactory::getLineEditorByName(this, "location_editor");
00140 
00141     mSetBtn = LLViewerUICtrlFactory::getButtonByName(this, "set_location_btn");
00142     mSetBtn->setClickedCallback(onClickSet);
00143     mSetBtn->setCallbackUserData(this);
00144 
00145     mTeleportBtn = LLViewerUICtrlFactory::getButtonByName(this, "pick_teleport_btn");
00146     mTeleportBtn->setClickedCallback(onClickTeleport);
00147     mTeleportBtn->setCallbackUserData(this);
00148 
00149     mMapBtn = LLViewerUICtrlFactory::getButtonByName(this, "pick_map_btn");
00150     mMapBtn->setClickedCallback(onClickMap);
00151     mMapBtn->setCallbackUserData(this);
00152 
00153         mSortOrderText = LLViewerUICtrlFactory::getTextBoxByName(this, "sort_order_text");
00154 
00155         mSortOrderEditor = LLViewerUICtrlFactory::getLineEditorByName(this, "sort_order_editor");
00156         mSortOrderEditor->setPrevalidate(LLLineEditor::prevalidateInt);
00157         mSortOrderEditor->setCommitOnFocusLost(TRUE);
00158         mSortOrderEditor->setCommitCallback(onCommitAny);
00159         mSortOrderEditor->setCallbackUserData(this);
00160 
00161         mEnabledCheck = LLViewerUICtrlFactory::getCheckBoxByName(this, "enabled_check");
00162         mEnabledCheck->setCommitCallback(onCommitAny);
00163         mEnabledCheck->setCallbackUserData(this);
00164 
00165     return TRUE;
00166 }
00167 
00168 
00169 
00170 void LLPanelPick::initNewPick()
00171 {
00172         mPickID.generate();
00173 
00174         mCreatorID = gAgent.getID();
00175 
00176         mPosGlobal = gAgent.getPositionGlobal();
00177 
00178         
00179         LLParcel* parcel = gParcelMgr->getAgentParcel();
00180         if (parcel)
00181         {
00182                 mNameEditor->setText(parcel->getName());
00183                 mDescEditor->setText(parcel->getDesc());
00184                 mSnapshotCtrl->setImageAssetID(parcel->getSnapshotID());
00185         }
00186 
00187         
00188         sendPickInfoUpdate();
00189 }
00190 
00191 
00192 void LLPanelPick::setPickID(const LLUUID& pick_id, const LLUUID& creator_id)
00193 {
00194         mPickID = pick_id;
00195         mCreatorID = creator_id;
00196 }
00197 
00198 
00199 
00200 
00201 void LLPanelPick::markForServerRequest()
00202 {
00203         mDataRequested = FALSE;
00204         mDataReceived = FALSE;
00205 }
00206 
00207 
00208 std::string LLPanelPick::getPickName()
00209 {
00210         return mNameEditor->getText();
00211 }
00212 
00213 
00214 void LLPanelPick::sendPickInfoRequest()
00215 {
00216         
00217         
00218         std::vector<std::string> strings;
00219         strings.push_back( mCreatorID.asString() );
00220         strings.push_back( mPickID.asString() );
00221         send_generic_message("pickinforequest", strings);
00222 
00223         mDataRequested = TRUE;
00224 }
00225 
00226 
00227 void LLPanelPick::sendPickInfoUpdate()
00228 {
00229         
00230         
00231         if (mPickID.isNull())
00232         {
00233                 mPickID.generate();
00234         }
00235 
00236         LLMessageSystem* msg = gMessageSystem;
00237 
00238         msg->newMessage("PickInfoUpdate");
00239         msg->nextBlock("AgentData");
00240         msg->addUUID("AgentID", gAgent.getID());
00241         msg->addUUID("SessionID", gAgent.getSessionID());
00242         msg->nextBlock("Data");
00243         msg->addUUID("PickID", mPickID);
00244         msg->addUUID("CreatorID", mCreatorID);
00245         msg->addBOOL("TopPick", mTopPick);
00246         
00247         msg->addUUID("ParcelID", mParcelID);
00248         msg->addString("Name", mNameEditor->getText());
00249         msg->addString("Desc", mDescEditor->getText());
00250         msg->addUUID("SnapshotID", mSnapshotCtrl->getImageAssetID());
00251         msg->addVector3d("PosGlobal", mPosGlobal);
00252         
00253         
00254         S32 sort_order;
00255         if (mTopPick)
00256         {
00257                 sort_order = atoi(mSortOrderEditor->getText().c_str());
00258         }
00259         else
00260         {
00261                 sort_order = 0;
00262         }
00263         msg->addS32("SortOrder", sort_order);
00264         msg->addBOOL("Enabled", mEnabledCheck->get());
00265         gAgent.sendReliableMessage();
00266 }
00267 
00268 
00269 
00270 void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **)
00271 {
00272     
00273     
00274     LLUUID agent_id;
00275     msg->getUUID("AgentData", "AgentID", agent_id );
00276     if (agent_id != gAgent.getID())
00277     {
00278         llwarns << "Agent ID mismatch in processPickInfoReply"
00279             << llendl;
00280                 return;
00281     }
00282 
00283     LLUUID pick_id;
00284     msg->getUUID("Data", "PickID", pick_id);
00285 
00286     LLUUID creator_id;
00287     msg->getUUID("Data", "CreatorID", creator_id);
00288 
00289         BOOL top_pick;
00290         msg->getBOOL("Data", "TopPick", top_pick);
00291 
00292     LLUUID parcel_id;
00293     msg->getUUID("Data", "ParcelID", parcel_id);
00294 
00295         char name[DB_PARCEL_NAME_SIZE];         
00296         msg->getString("Data", "Name", DB_PARCEL_NAME_SIZE, name);
00297 
00298         char desc[DB_PICK_DESC_SIZE];           
00299         msg->getString("Data", "Desc", DB_PICK_DESC_SIZE, desc);
00300 
00301         LLUUID snapshot_id;
00302         msg->getUUID("Data", "SnapshotID", snapshot_id);
00303 
00304     
00305     
00306         char buffer[256];               
00307     LLString location_text;
00308 
00309     msg->getString("Data", "User", 256, buffer);
00310     location_text.assign(buffer);
00311     location_text.append(", ");
00312 
00313     msg->getString("Data", "OriginalName", 256, buffer);
00314         if (buffer[0] != '\0')
00315         {
00316                 location_text.append(buffer);
00317                 location_text.append(", ");
00318         }
00319 
00320         char sim_name[256];             
00321         msg->getString("Data", "SimName", 256, sim_name);
00322 
00323         LLVector3d pos_global;
00324         msg->getVector3d("Data", "PosGlobal", pos_global);
00325 
00326     S32 region_x = llround((F32)pos_global.mdV[VX]) % REGION_WIDTH_UNITS;
00327     S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS;
00328         S32 region_z = llround((F32)pos_global.mdV[VZ]);
00329    
00330     location_text.append(llformat("%s (%d, %d, %d)", sim_name, region_x, region_y, region_z));
00331 
00332         S32 sort_order;
00333     msg->getS32("Data", "SortOrder", sort_order);
00334 
00335         BOOL enabled;
00336         msg->getBOOL("Data", "Enabled", enabled);
00337 
00338     
00339         for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
00340         {
00341                 LLPanelPick* self = *iter;
00342                 
00343                 if (self->mPickID != pick_id)
00344                 {
00345                         continue;
00346                 }
00347 
00348                 self->mDataReceived = TRUE;
00349 
00350         
00351                 self->mPickID = pick_id;
00352                 self->mCreatorID = creator_id;
00353                 self->mParcelID = parcel_id;
00354                 self->mSimName.assign(sim_name);
00355                 self->mPosGlobal = pos_global;
00356 
00357                 
00358         self->mNameEditor->setText(LLString(name));
00359         self->mDescEditor->setText(LLString(desc));
00360         self->mSnapshotCtrl->setImageAssetID(snapshot_id);
00361         self->mLocationEditor->setText(location_text);
00362         self->mEnabledCheck->set(enabled);
00363 
00364                 self->mSortOrderEditor->setText(llformat("%d", sort_order));
00365     }
00366 }
00367 
00368 void LLPanelPick::draw()
00369 {
00370         if (getVisible())
00371         {
00372                 refresh();
00373 
00374                 LLPanel::draw();
00375         }
00376 }
00377 
00378 
00379 void LLPanelPick::refresh()
00380 {
00381         if (!mDataRequested)
00382         {
00383                 sendPickInfoRequest();
00384         }
00385 
00386     
00387     BOOL godlike = gAgent.isGodlike();
00388         BOOL is_self = (gAgent.getID() == mCreatorID);
00389 
00390     
00391         if (mTopPick)
00392         {
00393                 mSnapshotCtrl->setEnabled(godlike);
00394                 mNameEditor->setEnabled(godlike);
00395                 mDescEditor->setEnabled(godlike);
00396 
00397                 mSortOrderText->setVisible(godlike);
00398 
00399                 mSortOrderEditor->setVisible(godlike);
00400                 mSortOrderEditor->setEnabled(godlike);
00401 
00402                 mEnabledCheck->setVisible(godlike);
00403                 mEnabledCheck->setEnabled(godlike);
00404 
00405                 mSetBtn->setVisible(godlike);
00406                 mSetBtn->setEnabled(godlike);
00407         }
00408         else
00409         {
00410                 mSnapshotCtrl->setEnabled(is_self);
00411                 mNameEditor->setEnabled(is_self);
00412                 mDescEditor->setEnabled(is_self);
00413 
00414                 mSortOrderText->setVisible(FALSE);
00415 
00416                 mSortOrderEditor->setVisible(FALSE);
00417                 mSortOrderEditor->setEnabled(FALSE);
00418 
00419                 mEnabledCheck->setVisible(FALSE);
00420                 mEnabledCheck->setEnabled(FALSE);
00421 
00422                 mSetBtn->setVisible(is_self);
00423                 mSetBtn->setEnabled(is_self);
00424         }
00425 }
00426 
00427 
00428 
00429 void LLPanelPick::onClickTeleport(void* data)
00430 {
00431     LLPanelPick* self = (LLPanelPick*)data;
00432 
00433     if (!self->mPosGlobal.isExactlyZero())
00434     {
00435         gAgent.teleportViaLocation(self->mPosGlobal);
00436         gFloaterWorldMap->trackLocation(self->mPosGlobal);
00437     }
00438 }
00439 
00440 
00441 
00442 void LLPanelPick::onClickMap(void* data)
00443 {
00444         LLPanelPick* self = (LLPanelPick*)data;
00445         gFloaterWorldMap->trackLocation(self->mPosGlobal);
00446         LLFloaterWorldMap::show(NULL, TRUE);
00447 }
00448 
00449 
00450 
00451 
00452 
00453 
00454 
00455 
00456 
00457 
00458 
00459 void LLPanelPick::onClickSet(void* data)
00460 {
00461     LLPanelPick* self = (LLPanelPick*)data;
00462 
00463         
00464         self->mPosGlobal = gAgent.getPositionGlobal();
00465 
00466         LLString location_text;
00467         location_text.assign("(will update after save)");
00468         location_text.append(", ");
00469 
00470     S32 region_x = llround((F32)self->mPosGlobal.mdV[VX]) % REGION_WIDTH_UNITS;
00471     S32 region_y = llround((F32)self->mPosGlobal.mdV[VY]) % REGION_WIDTH_UNITS;
00472         S32 region_z = llround((F32)self->mPosGlobal.mdV[VZ]);
00473 
00474         location_text.append(self->mSimName);
00475     location_text.append(llformat(" (%d, %d, %d)", region_x, region_y, region_z));
00476 
00477         
00478         
00479         
00480         if ( gAgent.getRegion ()->getName () != self->mSimName )
00481         {
00482                 gViewerWindow->alertXml("SetPickLocation");
00483         };
00484 
00485         self->mLocationEditor->setText(location_text);
00486 
00487         onCommitAny(NULL, data);
00488 }
00489 
00490 
00491 
00492 void LLPanelPick::onCommitAny(LLUICtrl* ctrl, void* data)
00493 {
00494         LLPanelPick* self = (LLPanelPick*)data;
00495 
00496         
00497         if (self->mDataReceived)
00498         {
00499                 self->sendPickInfoUpdate();
00500 
00501                 
00502                 
00503                 
00504 
00505 
00506 
00507 
00508 
00509 
00510                 LLTabContainerVertical* tab = (LLTabContainerVertical*)self->getParent();
00511                 if (tab)
00512                 {
00513                         if(tab) tab->setCurrentTabName(self->mNameEditor->getText());
00514                 }
00515                 
00516         }
00517 }