//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "GlobalUnit.h" #include "AudStylePanel.h" #include "MessageFormUnit.h" #include "FavorTextureUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #define LIST_RECOMMAND 0 #define LIST_ORIGIN 1 #define LIST_SHARE 2 #define LIST_LOCAL 3 #define LIST_COLLECTION 4 __fastcall TAudStylePanel::TAudStylePanel(TComponent* AOwner) : TStylePanel(AOwner) { m_strTitle = "风格库"; AddToolBtn( 3, "imgTabSelect", CMClick, "筛选与排序" ); m_nBtnCount = 1; AddToolBtn( 3, "imgTabLocal", ListTypeClick, "本地自定义风格" ); m_lstBtnTools[m_nBtnCount++]->Tag = LIST_LOCAL; AddToolBtn( 3, "imgTabCollect", ListTypeClick, "收藏的风格" ); m_lstBtnTools[m_nBtnCount++]->Tag = LIST_COLLECTION; if( SOFTWARE_ID!=e_Pro_Lite ){ AddToolBtn( 3, "imgTabShare", ListTypeClick, "网友分享的组合风格" ); m_lstBtnTools[m_nBtnCount++]->Tag = LIST_SHARE; } AddToolBtn( 3, "imgTabRelease", ListTypeClick, "在线发布的原创风格" ); m_lstBtnTools[m_nBtnCount++]->Tag = LIST_ORIGIN; AddToolBtn( 3, "imgTabRecom", ListTypeClick, "官方推荐风格" ); m_lstBtnTools[m_nBtnCount++]->Tag = LIST_RECOMMAND; m_SearchPanel = new TStyleSelPanel(this); //搜索面板 m_SearchPanel->Parent = this; m_SearchPanel->Visible = false; m_SearchPanel->Left = 1; m_SearchPanel->Top = 25; m_editName = new TEdit(this); m_editName->Parent = this; m_editName->HideSelection = false; m_editName->BorderStyle = bsNone; m_editName->MaxLength = 39; m_editName->Font->Name = g_strTxtFontName; m_editName->Font->Quality = TFontQuality::fqClearTypeNatural; m_editName->Font->Size = g_szFont9; m_editName->OnMouseDown = EditMouseDown; m_editName->OnMouseUp = EditMouseUp; m_editName->OnMouseMove = EditMouseMove; m_editName->OnKeyDown = EditKeyDown; m_editName->OnChange = EditChange; m_iListType = 0; m_bDoubleClick = false; m_RenameTimer = NULL; } //--------------------------------------------------------------------------- __fastcall TAudStylePanel::~TAudStylePanel() { ClearFavorTextures( true ); } //--------------------------------------------------------------------------- void TAudStylePanel::Init() { // InsColGet(); if( g_aOriginStyles.empty() ){ SelectStyle(); } if( m_SearchPanel ){ m_SearchPanel->Reset(); if( ((TPNGButton*)m_lstBtnTools[0])->Down ){ CMClick( NULL ); } } m_iListType = LIST_RECOMMAND; for( int i=0; iDown = false; } m_lstBtnTools[m_nBtnCount-1]->Down = true; GetFavorTextures(); RefreshList(); } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::UMSearchStyle(TMessage &msg) { Stop( STOP_SELF ); ClearAllItems(); RefreshList(); CalcViewArea(); ResetScrollBar(); InvalidateRgn( Handle, NULL, false ); } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::DoubleClick(TObject* sender) { if( m_pSelItem && m_iFocCol==COL_TEXT ){ int iOnline = m_pSelItem->GetOnlineState(); if( iOnline==e_Downloaded ){ PlayDemo( m_pSelItem, -1 ); } else if( iOnline==e_UnDownload ){ DoDownload( sender ); } m_bDoubleClick = true; } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::DoCollect(TObject* Sender) { if( m_pFocItem->iType==SEGTYPE_STYLE ) SetCollect(m_pFocItem); else if( m_pFocItem->iType==SEGTYPE_TRACK ){ TTrackItem *pTrk = (TTrackItem*)m_pFocItem; bool bSet = !pTrk->IsCollected(); // InsColSet( (TTrackItem*)m_pFocItem, bCollected); // pTrk->SetCollect( bSet ); SetFavorTexture( pTrk->pStyle->idLoc, pTrk->pStyle->idStyle, pTrk->GetSegType(), pTrk->GetSegNo(), pTrk->pTrack->iChanNo, bSet ); } DrawItem( m_pFocItem, m_iFocLine, -1 ); } // --------------------------------------------------------------------------- void TAudStylePanel::PlayDemo( TCommonItem *pItem, int tempo ) { TStylePanel::PlayDemo( pItem, g_iMelodyKey<0 ? -1 : g_nMelodyTempo ); } //--------------------------------------------------------------------------- bool TAudStylePanel::StartDrag() { bool bCanDrag = m_pFocItem->GetOnlineState()==e_Downloaded; //可选风格已下载 if( m_SearchPanel->DInStr.Length>0 && m_pFocItem->iType!=SEGTYPE_TRACK ) bCanDrag = false; return bCanDrag; } //--------------------------------------------------------------------------- void TAudStylePanel::SetDownload( TCommonItem *pItem ) { TStyleItem* pStyItem = pItem->GetStyleItem() ; pStyItem->SetDownload(); //查找当前行号 TCommonItem *pFind = m_pTopItem; for( int i=0; iGetStyleItem()==pStyItem ){ DrawItem( pFind, i, COL_TEXT ); } pFind = GetNextItem( pFind ); } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::OnNetworkMessage(TMessage &msg) { WORD eMessage = HIWORD(msg.WParam); WORD eExtra = LOWORD(msg.WParam); switch (eMessage) { case e_styleInfoResponse: { if( 0!=eExtra && eExtra!=e_ShareStyle ) break; int iStyleId = msg.LParam; int idLoc = eExtra==e_ShareStyle ? 1 : 0; TPROSTYLE infoStyle; if( idLoc==0 ) infoStyle.pOrigin = new TSTYLEORIGIN; else infoStyle.pShare = new TSTYLESHARE; int ret = f_CM_GetStyleInfo( idLoc, iStyleId, &infoStyle ); if( ret==0 ){ if( idLoc==0 && infoStyle.pOrigin->detail.iTimesignature!=g_iMelodyTimeSignature ) break; if( idLoc==1 && infoStyle.pShare->iTimesignature!=g_iMelodyTimeSignature ) break; bool bNew = false; TPROSTYLE* pInfo = GetStyleInfo( idLoc, iStyleId ); if( !pInfo ){ pInfo = new TPROSTYLE; if( idLoc==0 ) pInfo->pOrigin = new TSTYLEORIGIN; else pInfo->pShare = new TSTYLESHARE; bNew = true; } pInfo->idLoc = infoStyle.idLoc; pInfo->idStyle = infoStyle.idStyle; if( idLoc==0 ) memcpy( pInfo->pOrigin, infoStyle.pOrigin, sizeof(TSTYLEORIGIN) ); else memcpy( pInfo->pShare, infoStyle.pShare, sizeof(TSTYLESHARE) ); if( bNew ){ STYLELIST& aStyles = idLoc==0 ? g_aOriginStyles : g_aShareStyles; int index = 0; for( int i=aStyles.size()-1; i>=0; i-- ){ if( pInfo->idStyle > aStyles[i]->idStyle ){ index = i+1; break; } } if( index>=aStyles.size() ) aStyles.push_back( pInfo ); else aStyles.insert( aStyles.begin()+index, pInfo ); if( idLoc==0 && m_iListType==LIST_ORIGIN || idLoc==1 && m_iListType==LIST_SHARE ){ int iLine = m_nTotalLine - m_iTopLine; TStyleItem* pStyItem = AddStyleItem( pInfo, IsCollected( pInfo->idLoc, pInfo->idStyle ) ); ResetScrollBar(); if( iLinepOrigin->cost = -1; TStyleItem * pStyItem = NULL; for( int i=0; iCount; i++ ){ TStyleItem *pItem = (TStyleItem*)m_aItems->Items[i]; if( pItem->pStyle->idLoc==0 && pItem->pStyle->idStyle==iStyleId ){ pStyItem = pItem; break; } } //从列表中删除 if( pStyItem ){ DeleteItem( pStyItem, iLine ); } */ DeleteStyleInfo( idLoc, iStyleId ); } } } break; case e_styleDataResponse: // download the style data { if( 0!=eExtra ) break; int iRet = 0; int iStyleId = msg.LParam; TPROSTYLE* pInfo = GetStyleInfo( 0, iStyleId ); if( pInfo && pInfo->pOrigin->state!=e_Downloaded ){ pInfo->pOrigin->state = e_Downloaded; if( m_iListType==LIST_ORIGIN || m_iListType==LIST_RECOMMAND ){ for( int i=0; iCount; i++ ){ TStyleItem* pItem = (TStyleItem*)m_aItems->Items[i]; if( pItem->pStyle && pItem->pStyle==pInfo ){ //刷新显示 SetDownload( pItem ); break; } } } else if( m_iListType==LIST_SHARE ){ for( int i=0; iCount; i++ ){ TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[i]; bool bSet = false; for( int j=0; !bSet && jaItems->Count; j++ ){ TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[j]; for( int k=0; kaItems->Count; k++ ){ TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[k]; if( pTrk->pStyle==pInfo ){ SetDownload( pStyItem ); bSet = true; break; } } } } } } } break; case e_styleRecomResponse: { if( 0!=eExtra ) break; //获取推荐列表 int nRecomNum = 50; DWORD idRecoms[50]; f_CM_GetStyleRecomIDs( g_iMelodyTimeSignature, idRecoms, &nRecomNum ); if( nRecomNum==0 ) break; g_aRecomStyles.clear(); for( int i=0; iidStyle ){ g_aRecomStyles.push_back( pInfo ); break; } } } if( m_iListType==LIST_RECOMMAND && m_aItems->Count==0 ){ PostMessage( Handle, UM_SEARCH, 0, 0 ); } } break; } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::OnNetworkError(TMessage &msg) { WORD eMessage = HIWORD(msg.WParam); WORD eExtra = LOWORD(msg.WParam); DebugPrint("网络访问错误,消息号:%d,错误号:0x%X\n", eMessage, eExtra); } // --------------------------------------------------------------------------- void __fastcall TAudStylePanel::CMClick(System::TObject* Sender) //add ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { m_SearchPanel->Visible = !m_SearchPanel->Visible; ((TPNGButton*)m_lstBtnTools[0])->Down = m_SearchPanel->Visible; //按钮 Winapi::Messages::TWMSize Message; Message.Width = Width; Message.Height = Height; WMSize(Message); InvalidateRgn( Handle, NULL, false ); } void __fastcall TAudStylePanel::WMSize(Winapi::Messages::TWMSize &Message) { if( m_SearchPanel && m_SearchPanel->Width != Width-2 ) m_SearchPanel->Width = Width-2; if( m_SearchPanel && m_SearchPanel->Visible ){ m_nTitleHeight = 25 + m_SearchPanel->Height; } else{ m_nTitleHeight = 25; } TStylePanel::WMSize(Message); } bool TAudStylePanel::IsCollected( UINT idLoc, UINT idStyle ) { for( int i=0; iidLoc==idLoc && g_aCollectStyles[i]->idStyle==idStyle ){ return true; } } return false; } //--------------------------------------------------------------------------- DWORD TAudStylePanel::GetStyleOptions( TPROSTYLE* info ) { DWORD dwOpts = 0; if( info->idLoc==0 ){ dwOpts |= OPT_SCORE; if( info->pOrigin->state!=e_Downloaded ) dwOpts |= OPT_DOWNLOAD; else dwOpts |= OPT_COLLECT; if( info->pOrigin->cost>0 ) dwOpts |= OPT_CHARGE; } else if( info->idLoc==1 ){ dwOpts |= OPT_SCORE; bool bDownloaded = true, bCharge = false; for( int s=0; s<4; s++ ){ int rep = s<2 ? 1 : 2; for( int r=0; rpShare->nSegNum[s]; int iStart = r * 4, iEnd = iStart + ( r==0 ? ( nSegNum & 0x0F ) : ( nSegNum>>4 )); for( int n=iStart; npShare->trkRef[s][n][t].idStyle>0; t++ ){ TPROSTYLE* pTrkInfo = GetStyleInfo( 0, info->pShare->trkRef[s][n][t].idStyle ); if(!pTrkInfo){ bDownloaded = false; goto LINE_BREAK; } if( bDownloaded && pTrkInfo->pOrigin->state!=e_Downloaded ){ bDownloaded = false; if( bCharge ) goto LINE_BREAK; } if( !bCharge && pTrkInfo->pOrigin->cost>0 ){ bCharge = true; if( !bDownloaded ) goto LINE_BREAK; } } } } } LINE_BREAK: if( !bDownloaded ) dwOpts |= OPT_DOWNLOAD; else dwOpts |= OPT_COLLECT; if( bCharge ) dwOpts |= OPT_CHARGE; } else{ dwOpts = OPT_DEL | OPT_UPLOAD; } return dwOpts; } //--------------------------------------------------------------------------- String TAudStylePanel::ChargeTip( TStyleItem* pItem ) { String strTip; if( pItem->pStyle->idLoc==0 ){ strTip = "收费:"; strTip += IntToStr( ((TStyleItem*)pItem)->pStyle->pOrigin->cost ); strTip += "唱作音符"; } else if( pItem->pStyle->idLoc==1 ){ strTip = " 包含收费风格\n\n 风格 唱作音符\n"; strTip += "------------------------"; STYLELIST aStyles; TPROSTYLE* info = pItem->pStyle; char buf[512]; for( int s=0; s<4; s++ ){ int rep = s<2 ? 1 : 2; for( int r=0; rpShare->nSegNum[s]; int iStart = r * 4, iEnd = iStart + ( r==0 ? ( nSegNum & 0x0F ) : ( nSegNum>>4 )); for( int n=iStart; npShare->trkRef[s][n][t].idStyle>0; t++ ){ TPROSTYLE* pTrkInfo = GetStyleInfo( 0, info->pShare->trkRef[s][n][t].idStyle ); if( pTrkInfo->pOrigin->cost>0 ){ bool bMatch = false; for( int k=0; kidStyle, pTrkInfo->pOrigin->cost ); strTip += buf; } } } } } } } return strTip; } //--------------------------------------------------------------------------- TStyleItem* __fastcall TAudStylePanel::AddStyleItem( TPROSTYLE* info, bool bCollected ) { TStyleItem* pStyItem = CreateStyleItem( info, bCollected, true ); InsertStyleItem( pStyItem, m_aItems->Count ); return pStyItem; } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::ListTypeClick(TObject *Sender) { TPNGButton* pBtn = (TPNGButton*)Sender; if( !pBtn->Down ){ pBtn->Down = true; for( int i=1; iTag; } else{ m_lstBtnTools[i]->Down = false; } } if( m_SearchPanel ){ m_SearchPanel->Reset(); if( ((TPNGButton*)m_lstBtnTools[0])->Down ){ CMClick( NULL ); } } PostMessage( Handle, UM_SEARCH, 0, 0 ); } } //--------------------------------------------------------------------------- void TAudStylePanel::RefreshList() { bool bAuthority = SOFTWARE_ID==e_Pro_Lite || g_bLogon && (g_infoUser.accountInfo.authority & 0x1000); int iStart, iEnd, iStep; STYLELIST& lstStyles = m_iListType==LIST_RECOMMAND ? g_aRecomStyles : m_iListType==LIST_ORIGIN ? g_aOriginStyles : m_iListType==LIST_SHARE ? g_aShareStyles : m_iListType==LIST_COLLECTION ? g_aCollectStyles : g_aLocalStyles; if( !lstStyles.empty() ){ if( m_SearchPanel->iSortType==0 && m_SearchPanel->iSortMode==1 ){ iStart = 0; iEnd = lstStyles.size(); iStep = 1; } else{ iStart = lstStyles.size()-1; iEnd = -1; iStep = -1; } for( int ind=iStart; ind!=iEnd; ind+=iStep ){ TPROSTYLE* info = lstStyles[ind]; bool bCollect = false; if( m_iListType!=LIST_LOCAL ) bCollect = IsCollected( info->idLoc, info->idStyle ); //检查分类 bool bAdd = false; if( m_SearchPanel->DStyle.Length==10 || m_iListType==LIST_LOCAL ){ bAdd = true; } else{ for( int cunt=0; !bAdd && cuntDStyle.Length; cunt++ ){ if( info->idLoc==0 ){ TSTYLEDETAIL& detail = info->pOrigin->detail; for( int ity=0;ity=0 && detail.type[ity]<=23 &&( detail.type[ity] == m_SearchPanel->DStyle[cunt] || m_SearchPanel->DStyle[cunt] == -2 && detail.type[ity] >8 ) ){ // “>8" 为 其他 bAdd = true; break; } } } else if( info->idLoc==1 ){ TSTYLESHARE* detail = info->pShare; for( int ity=0;itytype);ity++ ){ //判断是否添加项 if( detail->type[ity]>=0 && detail->type[ity]<=23 &&( detail->type[ity] == m_SearchPanel->DStyle[cunt] || m_SearchPanel->DStyle[cunt] == -2 && detail->type[ity] > 8 ) ){ // “>8" 为 其他 bAdd = true; break; } } } else if( m_SearchPanel->DStyle[cunt] == -2 ){ bAdd = true; break; } } } if( bAdd ){ //检查乐器查找 TStyleItem* pStyItem = NULL; bool bInstSearch = m_SearchPanel->DInStr.Length>0; if( bInstSearch ){ pStyItem = CreateInstrumentItem( info, bCollect, bAuthority ); } else if( m_iListType!=LIST_COLLECTION || bCollect ){ pStyItem = CreateStyleItem( info, bCollect, bAuthority ); } if( pStyItem ){ if( pStyItem->aItems->Count>0 ){ int index = m_aItems->Count; if( m_SearchPanel->iSortType==3 ){ //速度排序 int iMode = m_SearchPanel->iSortMode, iTempo = info->idLoc==0 ? info->pOrigin->detail.iTempo : info->idLoc==1 ? info->pShare->iTempo : info->pLocal->iTempo; for( int i=0; iCount; i++ ){ TStyleItem* pTmpSty = (TStyleItem*)m_aItems->Items[i]; int tmpTempo = pTmpSty->pStyle->idLoc==0 ? pTmpSty->pStyle->pOrigin->detail.iTempo : pTmpSty->pStyle->idLoc==1 ? pTmpSty->pStyle->pShare->iTempo : pTmpSty->pStyle->pLocal->iTempo; if( iMode==0 && iTempo > tmpTempo || iMode==1 && iTempo < tmpTempo ){ index = i; break; } } } else if( ( m_iListType==LIST_ORIGIN || m_iListType==LIST_RECOMMAND ) && m_SearchPanel->iSortType!=0 ){ //价格/评分排序 int iType = m_SearchPanel->iSortType, iMode = m_SearchPanel->iSortMode, cost = info->pOrigin->cost, score = info->pOrigin->score; for( int i=0; iCount; i++ ){ TStyleItem* pTmpSty = (TStyleItem*)m_aItems->Items[i]; int tmpCost = pTmpSty->pStyle->pOrigin->cost, tmpScore = pTmpSty->pStyle->pOrigin->score; if( iMode==0 && ( iType==1 && cost > tmpCost || iType==2 && score > tmpScore ) || iMode==1 && ( iType==1 && cost < tmpCost || iType==2 && score < tmpScore )){ index = i; break; } } } InsertStyleItem( pStyItem, index ); } else{ delete pStyItem; } } } } } if( m_aItems->Count>0 ){ m_pTopItem = (TCommonItem*)m_aItems->First(); } } //--------------------------------------------------------------------------- TStyleItem* TAudStylePanel::CreateInstrumentItem( TPROSTYLE* info, bool bCollected, bool bAuthority ) { TStyleItem* pStyItem = NULL; for( int s=0; sidLoc==0 ? info->pOrigin->detail.nSegNum[s] : info->idLoc==1 ? info->pShare->nSegNum[s] : info->pLocal->nSegNum[s]; int num = s>4 ); if( num>0 ){ for( int i=0; iidLoc==0 && info->pOrigin->detail.tracks[s][sn][j].no>=0 && info->pOrigin->detail.tracks[s][sn][j].no!=9 || info->idLoc==1 && info->pShare->trkRef[s][sn][j].idStyle>=0 && info->pShare->trkRef[s][sn][j].chan!=9 || info->idLoc>0 && info->pLocal->trkRef[s][sn][j].idStyle>=0 && info->pLocal->trkRef[s][sn][j].chan!=9 ){ char prog = info->idLoc==0 ? info->pOrigin->detail.tracks[s][sn][j].prog : info->idLoc==1 ? info->pShare->trkRef[s][sn][j].prog : info->pLocal->trkRef[s][sn][j].prog; for( int m=0;mDInStr.Length;m++ ){ if( m_SearchPanel->DInStr[m]==prog ){ if( !pStyItem ){ //添加风格 DWORD dwOpts = GetStyleOptions( info ); //pStyItem = AddStyle( info, dwOpts ); pStyItem = new TStyleItem( info, dwOpts ); // if( bCollected ) // pStyItem->SetCollect( true ); } if( pStyItem && !pSegItem ){ int vol = info->idLoc==0 ? 100 : info->idLoc==1 ? info->pShare->nSegVol[s][sn] : info->pLocal->nSegVol[s][sn]; pSegItem = pStyItem->AddSegment( s, sn, 0, 0, -1, vol ); } if( pSegItem ){ //添加具体项 pSegItem->AddTrack( info, sn, j, info->idLoc<=1?OPT_COLLECT:0, bAuthority ); } } } } } if( pSegItem ){ if( pSegItem->aItems->Count>0 ){ if( s==SEGTYPE_INTRO ){ pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn] : info->idLoc==1 ? info->pShare->aIEBars[0][sn] : info->pLocal->aIEBars[0][sn]; } else if( s==SEGTYPE_ENDING ){ pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn] : info->idLoc==1 ? info->pShare->aIEBars[1][sn] : info->pLocal->aIEBars[1][sn]; } } else{ pStyItem->DeleteSegment( pSegItem ); } } } } } } return pStyItem; } //--------------------------------------------------------------------------- TStyleItem* TAudStylePanel::CreateStyleItem( TPROSTYLE* info, bool bCollected, bool bAuthority ) { DWORD dwOpts = GetStyleOptions( info ); TStyleItem* pStyItem = new TStyleItem( info, dwOpts ); // if( bCollected ) pStyItem->SetCollect( true ); for( int s=0; sidLoc==0 ? info->pOrigin->detail.nSegNum[s] : info->idLoc==1 ? info->pShare->nSegNum[s] : info->pLocal->nSegNum[s]; int num = s>4 ); if( num>0 ){ DWORD opts = sidLoc==0 ? 100 : info->idLoc==1 ? info->pShare->nSegVol[s][sn] : info->pLocal->nSegVol[s][sn]; TSegmentItem* pSegItem = pStyItem->AddSegment( s, sn, opts, 0, -1, vol ); for( int j=0; j<16; j++ ){ pSegItem->AddTrack( info, sn, j, info->idLoc<=1?OPT_COLLECT:0, bAuthority ); } if( pSegItem->aItems->Count>0 ){ if( s==SEGTYPE_INTRO ){ pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn] : info->idLoc==1 ? info->pShare->aIEBars[0][sn] : info->pLocal->aIEBars[0][sn]; } else if( s==SEGTYPE_ENDING ){ pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn] : info->idLoc==1 ? info->pShare->aIEBars[1][sn] : info->pLocal->aIEBars[1][sn]; } } else{ pStyItem->DeleteSegment( pSegItem ); } } } } } return pStyItem; } //--------------------------------------------------------------------------- void TAudStylePanel::InsertStyleItem( TStyleItem* pStyItem, int index ) { if( indexCount ){ if( index>0 ){ TCommonItem* pPrev = (TCommonItem*)m_aItems->Items[index-1]; pPrev->next = pStyItem; pStyItem->prev = pPrev; } TCommonItem* pNext = (TCommonItem*)m_aItems->Items[index]; pNext->prev = pStyItem; pStyItem->next = pNext; } else if( m_aItems->Count>0 ){ TCommonItem *pLast = (TCommonItem*)m_aItems->Last(); pLast->next = pStyItem; pStyItem->prev = pLast; } m_aItems->Insert( index, pStyItem ); m_nTotalLine++; } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::ReloadLocalStyle( bool bShow ) { if( m_iListType==LIST_LOCAL ){ PostMessage( Handle, UM_SEARCH, 0, 0 ); } else if( bShow ){ ListTypeClick( m_lstBtnTools[1] ); } } //--------------------------------------------------------------------------- void TAudStylePanel::DeleteItem( TCommonItem *pItem, int iLine ) { if( pItem->iType==SEGTYPE_STYLE ){ TPROSTYLE* pStyle = ((TStyleItem*)pItem)->pStyle; //检查是否正在使用 bool bUsed = false; if( g_pUseStyle ){ TStyleItem* pStyItem = (TStyleItem*)g_pUseStyle; if( pStyItem->pStyle==pStyle ) bUsed = true; for( int i=0; !bUsed && iaItems->Count; i++ ){ TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; for( int j=0; !bUsed && jaItems->Count; j++ ){ TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; if( pTrk->pStyle==pStyle ){ bUsed = true; } } } } if( !bUsed && g_pPreStyle ){ TStyleItem* pStyItem = (TStyleItem*)g_pPreStyle; if( pStyItem->pStyle==pStyle ) bUsed = true; for( int i=0; !bUsed && iaItems->Count; i++ ){ TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; for( int j=0; !bUsed && jaItems->Count; j++ ){ TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; if( pTrk->pStyle==pStyle ){ bUsed = true; } } } } if( bUsed ){ MessageForm->ShowMessage( "该风格正在使用或编辑中,无法删除!", MB_ICONERROR | MB_OK, "删除风格" ); return; } bUsed = false; TPROSTYLE* pExampleStyle = NULL; for( int i=0; !bUsed && iCount; i++ ){ if( pItem==m_aItems->Items[i] ) continue; TStyleItem* pSty = (TStyleItem*)m_aItems->Items[i]; for( int j=0; !bUsed && jaItems->Count; j++ ){ TSegmentItem* pSeg = (TSegmentItem*)pSty->aItems->Items[j]; for( int k=0; kaItems->Count; k++ ){ TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[k]; if( pTrk->pStyle->idLoc==pStyle->idLoc && pTrk->pStyle->idStyle==pStyle->idStyle ){ bUsed = true; pExampleStyle = pSty->pStyle; break; } } } } String strMsg = "确定删除本地风格【"; strMsg += UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str(); strMsg += "】?"; if( bUsed ){ char buff[512]; sprintf( buff, "\n\n该操作将修改 L%d【%s】等风格", LOWORD(pExampleStyle->idStyle), UTF8ToMBCS(pExampleStyle->pLocal->strStyleName).c_str() ); strMsg += buff; } if( mrCancel==MessageForm->ShowMessage(strMsg, MB_ICONQUESTION | MB_OKCANCEL) ) return; f_CM_DeleteLocalStyle( pStyle->idLoc, pStyle->idStyle ); DeleteStyleInfo( pStyle->idLoc, pStyle->idStyle ); if( bUsed ) Perform( UM_SEARCH, 0, 0 ); else TStylePanel::DeleteItem( pItem, iLine ); } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::EditChange(TObject *Sender) { TEdit* pEdit = ((TEdit*)Sender); AnsiString strName = pEdit->Text.Trim(); string strTmp = GBToUTF8(strName.c_str()); if( strTmp.length()>pEdit->MaxLength ){ pEdit->OnChange = NULL; pEdit->Text = pEdit->Text.SubString( 0, pEdit->Text.Length()-1 ); pEdit->SelStart = pEdit->Text.Length(); pEdit->OnChange = EditChange; } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::EditMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( X>0 && XWidth && Y>0 && YHeight ) Screen->Cursor = crIBeam; else Screen->Cursor = crArrow; } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::EditMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( X<0 || X>m_editName->Width || Y<0 || Y>m_editName->Height ){ ReleaseCapture(); TPoint pt( X, Y ); pt = m_editName->ClientToScreen( pt ); pt = ScreenToClient( pt ); bool bInsideAudPanel = pt.x>0 && pt.x0 && pt.yHide(); Screen->Cursor = crDefault; } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::EditMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { SetCapture( m_editName->Handle ); } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::EditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { switch( Key ){ case VK_RETURN: StyleRename(); m_editName->Hide(); ReleaseCapture(); Screen->Cursor = crDefault; break; case VK_ESCAPE: m_editName->Hide(); ReleaseCapture(); Screen->Cursor = crDefault; break; } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::RenameTiming(int op) { if( m_RenameTimer ){ delete m_RenameTimer; m_RenameTimer = NULL; } if( m_bDoubleClick ){ m_bDoubleClick = false; } else if( op==1 ){ m_RenameTimer = new TTimer(this); m_RenameTimer->Interval = GetDoubleClickTime(); m_RenameTimer->OnTimer = RenameTimerProc; m_RenameTimer->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::RenameTimerProc(System::TObject* Sender) { if( m_RenameTimer ){ DoRename( NULL ); delete m_RenameTimer; m_RenameTimer = NULL; } } //--------------------------------------------------------------------------- void __fastcall TAudStylePanel::DoRename(TObject* Sender) { if( m_iListType!=LIST_LOCAL ) return; if( Sender ){ SetSelect( m_pFocItem, m_iFocLine ); } if( m_iFocLine==m_nItemShow-1 ){ ScrollView( m_iTopLine+1 ); } if( m_editName && m_pSelItem ){ m_editName->Tag = (int)m_pSelItem; String strText; m_pSelItem->AddStyleId( strText ); int left = LEFT_BOUND + OPTION_WIDTH + Canvas->TextWidth( strText ); int nOpt = m_pSelItem->aOptions->Count; int top = ( m_editName->Font->Size==g_szFont9 ? 0 : 2 ) + m_iSelLine*m_nItemHeight+m_nTitleHeight; int height = m_editName->Font->Size==g_szFont9 ? 16 : 13; m_editName->SetBounds( left + LEFT_BOUND, top, Width - left - nOpt * OPTION_WIDTH - RIGHT_BOUND - 4, height ); TPROSTYLE* pStyle = ((TStyleItem*)m_pSelItem)->pStyle; strText = UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str(); m_editName->Text = strText; m_editName->Show(); m_editName->SelectAll(); m_editName->SetFocus(); SetCapture( m_editName->Handle ); } } //--------------------------------------------------------------------------- void TAudStylePanel::StyleRename() { if( !m_pSelItem ) return; String strOldName, strNewName; // TStyleItem* pStyItem = (TStyleItem*)m_editName->Tag; TPROSTYLE* pStyle = ((TStyleItem*)m_pSelItem)->pStyle; /* if( pStyle->idLoc==1 ) strOldName = UTF8ToMBCS(pStyle->pShare->strStyleName).c_str(); else if( pStyle->idLoc!=(UINT)-1 ) */ strOldName = UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str(); strNewName = m_editName->Text.Trim(); if( strNewName.Length()>0 && strNewName.Compare( strOldName ) ){ string strName = GBToUTF8(AnsiString(strNewName.c_str()).c_str()).c_str(); strcpy( pStyle->pLocal->strStyleName, strName.c_str() ); f_CM_ChangeLocalStyle( pStyle ); } } //---------------------------------------------------------------------------