예제 #1
0
 def __init__(self, chatManager, whiteListEntry):
     optiondefs = (('relief', None, None), ('state', DGG.NORMAL,
                                            self.setState),
                   ('frameSize', (0, 0.9, 0, 0.6),
                    None), ('frameColor', (1, 0, 1, 0.2), None))
     self.defineoptions({}, optiondefs)
     DirectFrame.__init__(self, parent=NodePath())
     self.initialiseoptions(ChatPanel)
     FSM.__init__(self, 'ChatPanel')
     base.chatPanel = self
     self.chatManager = chatManager
     self.index = 0
     self.runningLineCount = 0
     self.runningLineCountLastId = -1
     self.lineCountList = [0]
     self.wrappedText = []
     self.chatFont = PiratesGlobals.getInterfaceFont()
     self.nameFont = PiratesGlobals.getInterfaceFont()
     self.shadowOffset = (0.09, 0.09)
     self.shadowColor = (0.0, 0.0, 0.0, 1.0)
     self.fontColorStyle = 1
     if base.config.GetBool('want-random-chatStyle', 0):
         self.chatFont = random.choice([
             PiratesGlobals.getInterfaceFont(),
             PiratesGlobals.getInterfaceOutlineFont()
         ])
         self.nameFont = random.choice([
             PiratesGlobals.getInterfaceFont(),
             PiratesGlobals.getInterfaceOutlineFont()
         ])
         self.shadowOffset = random.choice([(0.09, 0.09), (0.0, 0.0)])
         self.fontColorStyle = random.choice([0, 1, 2])
     self.lineDict = {}
     self.renderedLineDict = {}
     self.renderedLines = []
     self.wordWrapper = TextNode('wrapper')
     self.wordWrapper.setFont(self.chatFont)
     self.wordWrapper.setWordwrap(self.WrapWidth)
     self.wordWrapper.setTabWidth(1.0)
     self.fadeIval = None
     self.fadeTextIval = None
     self.preferredMode = 'Short'
     self.linesShown = True
     self.holdLinesShown = None
     self.wantSmallFont = 0
     self.currentFontSize = self.TextScale
     self.currentWordWrap = self.WrapWidth
     self.resizeDelayTaskName = 'ChatPanel_Resize'
     self.sCloseButton = None
     self.tCloseButton = None
     self.minButton = None
     self.maxButton = None
     self.setupGui()
     self.chatBar = ChatBar(parent=self,
                            chatMgr=chatManager,
                            whiteListEntry=whiteListEntry)
     self.setBoxWidth(base.options.chatbox_scale)
     self.checkEmotes()
     self.needSlider = 0
     self.reparentTo(base.a2dBottomLeft)
     self.accept('NewOpenMessage', self.__handleOpenMessage)
     self.accept('SetChatBoxWidth', self.setBoxWidth)
     self.accept('SetChatBoxStyle', self.setChatStyle)
     self.accept('GUIHidden', self.__handleGlobalGuiHide)
     self.accept('GUIShown', self.__handleGlobalGuiShow)
     return
    def __init__(self, chatManager, whiteListEntry):
        optiondefs = (('relief', None, None), ('state', DGG.NORMAL, self.setState), ('frameSize', (0, 0.90000000000000002, 0, 0.59999999999999998), None), ('frameColor', (1, 0, 1, 0.20000000000000001), None))
        self.defineoptions({ }, optiondefs)
        DirectFrame.__init__(self, parent = NodePath())
        self.initialiseoptions(ChatPanel)
        FSM.__init__(self, 'ChatPanel')
        base.chatPanel = self
        self.chatManager = chatManager
        self.index = 0
        self.runningLineCount = 0
        self.runningLineCountLastId = -1
        self.lineCountList = [
            0]
        self.wrappedText = []
        self.chatFont = PiratesGlobals.getInterfaceFont()
        self.nameFont = PiratesGlobals.getInterfaceFont()
        self.shadowOffset = (0.089999999999999997, 0.089999999999999997)
        self.shadowColor = (0.0, 0.0, 0.0, 1.0)
        self.fontColorStyle = 1
        if base.config.GetBool('want-random-chatStyle', 0):
            self.chatFont = random.choice([
                PiratesGlobals.getInterfaceFont(),
                PiratesGlobals.getInterfaceOutlineFont()])
            self.nameFont = random.choice([
                PiratesGlobals.getInterfaceFont(),
                PiratesGlobals.getInterfaceOutlineFont()])
            self.shadowOffset = random.choice([
                (0.089999999999999997, 0.089999999999999997),
                (0.0, 0.0)])
            self.fontColorStyle = random.choice([
                0,
                1,
                2])

        self.lineDict = { }
        self.renderedLineDict = { }
        self.renderedLines = []
        self.wordWrapper = TextNode('wrapper')
        self.wordWrapper.setFont(self.chatFont)
        self.wordWrapper.setWordwrap(self.WrapWidth)
        self.wordWrapper.setTabWidth(1.0)
        self.fadeIval = None
        self.fadeTextIval = None
        self.preferredMode = 'Short'
        self.linesShown = True
        self.holdLinesShown = None
        self.wantSmallFont = 0
        self.currentFontSize = self.TextScale
        self.currentWordWrap = self.WrapWidth
        self.resizeDelayTaskName = 'ChatPanel_Resize'
        self.sCloseButton = None
        self.tCloseButton = None
        self.minButton = None
        self.maxButton = None
        self.setupGui()
        self.chatBar = ChatBar(parent = self, chatMgr = chatManager, whiteListEntry = whiteListEntry)
        self.setBoxWidth(base.options.chatbox_scale)
        self.checkEmotes()
        self.needSlider = 0
        self.reparentTo(base.a2dBottomLeft)
        self.accept('NewOpenMessage', self._ChatPanel__handleOpenMessage)
        self.accept('SetChatBoxWidth', self.setBoxWidth)
        self.accept('SetChatBoxStyle', self.setChatStyle)
        self.accept('GUIHidden', self._ChatPanel__handleGlobalGuiHide)
        self.accept('GUIShown', self._ChatPanel__handleGlobalGuiShow)
예제 #3
0
class ChatPanel(DirectFrame, FSM):
    __module__ = __name__
    NumVisible = 10
    WrapWidth = 22
    WrapWidthSmall = 28
    TextScale = 0.035
    TextScaleSmall = 0.028
    FadeTime = 0.3
    TextFadeDelay = 120
    TextFadeTime = 5
    widthBase = 21.25
    widthVarience = 12.0

    def __init__(self, chatManager, whiteListEntry):
        optiondefs = (('relief', None, None), ('state', DGG.NORMAL,
                                               self.setState),
                      ('frameSize', (0, 0.9, 0, 0.6),
                       None), ('frameColor', (1, 0, 1, 0.2), None))
        self.defineoptions({}, optiondefs)
        DirectFrame.__init__(self, parent=NodePath())
        self.initialiseoptions(ChatPanel)
        FSM.__init__(self, 'ChatPanel')
        base.chatPanel = self
        self.chatManager = chatManager
        self.index = 0
        self.runningLineCount = 0
        self.runningLineCountLastId = -1
        self.lineCountList = [0]
        self.wrappedText = []
        self.chatFont = PiratesGlobals.getInterfaceFont()
        self.nameFont = PiratesGlobals.getInterfaceFont()
        self.shadowOffset = (0.09, 0.09)
        self.shadowColor = (0.0, 0.0, 0.0, 1.0)
        self.fontColorStyle = 1
        if base.config.GetBool('want-random-chatStyle', 0):
            self.chatFont = random.choice([
                PiratesGlobals.getInterfaceFont(),
                PiratesGlobals.getInterfaceOutlineFont()
            ])
            self.nameFont = random.choice([
                PiratesGlobals.getInterfaceFont(),
                PiratesGlobals.getInterfaceOutlineFont()
            ])
            self.shadowOffset = random.choice([(0.09, 0.09), (0.0, 0.0)])
            self.fontColorStyle = random.choice([0, 1, 2])
        self.lineDict = {}
        self.renderedLineDict = {}
        self.renderedLines = []
        self.wordWrapper = TextNode('wrapper')
        self.wordWrapper.setFont(self.chatFont)
        self.wordWrapper.setWordwrap(self.WrapWidth)
        self.wordWrapper.setTabWidth(1.0)
        self.fadeIval = None
        self.fadeTextIval = None
        self.preferredMode = 'Short'
        self.linesShown = True
        self.holdLinesShown = None
        self.wantSmallFont = 0
        self.currentFontSize = self.TextScale
        self.currentWordWrap = self.WrapWidth
        self.resizeDelayTaskName = 'ChatPanel_Resize'
        self.sCloseButton = None
        self.tCloseButton = None
        self.minButton = None
        self.maxButton = None
        self.setupGui()
        self.chatBar = ChatBar(parent=self,
                               chatMgr=chatManager,
                               whiteListEntry=whiteListEntry)
        self.setBoxWidth(base.options.chatbox_scale)
        self.checkEmotes()
        self.needSlider = 0
        self.reparentTo(base.a2dBottomLeft)
        self.accept('NewOpenMessage', self.__handleOpenMessage)
        self.accept('SetChatBoxWidth', self.setBoxWidth)
        self.accept('SetChatBoxStyle', self.setChatStyle)
        self.accept('GUIHidden', self.__handleGlobalGuiHide)
        self.accept('GUIShown', self.__handleGlobalGuiShow)
        return

    def setChatStyle(self, value):
        pass

    def setBoxWidth(self, scale):
        self.currentWordWrap = self.widthBase + scale * self.widthVarience
        wordWrapWithBias = self.widthBase + 1.22 * scale * self.widthVarience
        percentage = float(self.currentWordWrap) / float(self.widthBase)
        self.shortBorder.setScale(percentage, 1.0, 1.0)
        self.shortBg.setScale(percentage, 1.0, 1.0)
        self.tallBorder.setScale(percentage, 1.0, 1.0)
        self.tallBg.setScale(percentage, 1.0, 1.0)
        self.wordWrapper.setWordwrap(wordWrapWithBias)
        self.chatDisplayNP.setScale(self.currentFontSize)
        messenger.send('SetChatBoxPercentage', [percentage])
        self.chatBar.setBoxWidth(percentage)
        while taskMgr.hasTaskNamed(self.resizeDelayTaskName):
            taskMgr.remove(self.resizeDelayTaskName)

        task = taskMgr.doMethodLater(0.5, self.regenAfterResize,
                                     self.resizeDelayTaskName)

    def regenAfterResize(self, task):
        self.regenText()
        return task.done

    def toggleFontSize(self):
        if self.wantSmallFont == 0:
            self.wantSmallFont = 1
        else:
            if self.wantSmallFont == 1:
                self.wantSmallFont = 0
        self.setFontSize(self.wantSmallFont)

    def setFontSize(self, size):
        self.wantSmallFont = size
        if self.wantSmallFont == 1:
            self.currentFontSize = self.TextScaleSmall
            self.currentWordWrap = self.WrapWidthSmall
        else:
            if self.wantSmallFont == 0:
                self.currentFontSize = self.TextScale
                self.currentWordWrap = self.WrapWidth
        self.wordWrapper.setWordwrap(self.currentWordWrap)
        self.chatDisplayNP.setScale(self.currentFontSize)
        self.regenText()
        self.request('Standby')
        self.request(self.preferredMode)

    def setupGui(self):
        self.cleanupGui()
        if hasattr(self, 'chatBar'):
            self.chatBar.detachNode()
        self.removeChildren()
        guib = loader.loadModel('models/gui/chat_frame_b')
        guic = loader.loadModel('models/gui/chat_frame_c')
        charGui = loader.loadModelOnce('models/gui/char_gui')
        tGui = loader.loadModel('models/gui/triangle')
        self.hideNode = self.attachNewNode('hideNode')
        cm = CardMaker('shortBg')
        cm.setColor(0, 0, 0, 1)
        cm.setFrame(0.005, 0.895, 0.09, 0.595)
        self.shortBg = self.hideNode.attachNewNode(cm.generate())
        self.shortBg.setTransparency(1)
        self.shortBg.setColor(0, 0, 0, 1)
        self.shortBg.flattenStrong()
        self.shortBg.setColorScale(1, 1, 1, 0)
        self.shortBorder = self.hideNode.attachNewNode('shortBorder')
        top = guib.find('**/pPlane8').copyTo(self.shortBorder)
        top.setZ(-0.75)
        mid = guib.find('**/pPlane9').copyTo(self.shortBorder)
        mid.setScale(1, 1, 0.68)
        mid.setZ(-0.4)
        guib.find('**/pPlane10').copyTo(self.shortBorder)
        top = guib.find('**/pPlane26').copyTo(self.shortBorder)
        top.setZ(-0.75)
        mid = guib.find('**/pPlane27').copyTo(self.shortBorder)
        mid.setScale(1, 1, 0.68)
        mid.setZ(-0.4)
        self.shortBorder.setScale(0.2)
        self.shortBorder.setPos(0.5, 0, 0.375)
        self.shortBorder.flattenStrong()
        buttonGeom = NodePath('Close')
        guib.find('**/pPlane30').copyTo(buttonGeom)
        guib.find('**/pPlane31').copyTo(buttonGeom)
        guib.find('**/pPlane32').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.sCloseButton = DirectButton(
            parent=self.shortBorder,
            relief=None,
            frameColor=(1, 1, 1, 1),
            pad=(-0.02, -0.02),
            borderWidth=(0, 0),
            geom=buttonGeom,
            pos=(0.5, 0, 0.225),
            scale=0.2,
            rolloverSound=None,
            command=self.chatManager.deactivateChat)
        buttonGeom = NodePath('Max')
        guib.find('**/pPlane22').copyTo(buttonGeom)
        guib.find('**/pPlane23').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.maxButton = DirectButton(parent=self.shortBorder,
                                      relief=None,
                                      frameColor=(1, 1, 1, 1),
                                      pad=(-0.02, -0.02),
                                      borderWidth=(0, 0),
                                      geom=buttonGeom,
                                      pos=(0.5, 0, 0.225),
                                      scale=0.2,
                                      rolloverSound=None,
                                      command=self.request,
                                      extraArgs=['Tall'])
        cm.setName('tallBg')
        cm.setFrame(0.005, 0.895, 0.09, 1.36)
        self.tallBg = self.hideNode.attachNewNode(cm.generate())
        self.tallBg.setColor(0, 0, 0, 1)
        self.tallBg.setTransparency(1)
        self.tallBg.flattenStrong()
        self.tallBg.setColorScale(1, 1, 1, 0)
        self.tallBorder = self.hideNode.attachNewNode('tallBorder')
        guic.find('**/pPlane8').copyTo(self.tallBorder)
        guic.find('**/pPlane9').copyTo(self.tallBorder)
        guic.find('**/pPlane10').copyTo(self.tallBorder)
        guic.find('**/pPlane26').copyTo(self.tallBorder)
        guic.find('**/pPlane27').copyTo(self.tallBorder)
        self.tallBorder.setScale(0.2)
        self.tallBorder.setPos(0.5, 0, 0.375)
        self.tallBorder.flattenStrong()
        buttonGeom = NodePath('Close')
        guic.find('**/pPlane30').copyTo(buttonGeom)
        guic.find('**/pPlane31').copyTo(buttonGeom)
        guic.find('**/pPlane32').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.tCloseButton = DirectButton(
            parent=self.tallBorder,
            relief=None,
            frameColor=(1, 1, 1, 1),
            pad=(-0.02, -0.02),
            borderWidth=(0, 0),
            geom=buttonGeom,
            pos=(0.5, 0, 0.375),
            scale=0.2,
            rolloverSound=None,
            command=self.chatManager.deactivateChat)
        buttonGeom = NodePath('Min')
        guic.find('**/pPlane28').copyTo(buttonGeom)
        guic.find('**/pPlane29').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.minButton = DirectButton(parent=self.tallBorder,
                                      relief=None,
                                      frameColor=(1, 1, 1, 1),
                                      pad=(-0.02, -0.02),
                                      borderWidth=(0, 0),
                                      geom=buttonGeom,
                                      pos=(0.548, 0, 0.375),
                                      scale=0.2,
                                      rolloverSound=None,
                                      command=self.request,
                                      extraArgs=['Short'])
        self.chatTextRender = TextNode('chatTextRender')
        self.chatTextRender.setFont(self.chatFont)
        self.chatTextRender.setShadowColor(self.shadowColor)
        self.chatTextRender.setShadow(self.shadowOffset)
        self.chatDisplayNP = self.hideNode.attachNewNode('chatDisplay')
        self.chatDisplayNP.setScale(self.TextScale)
        self.chatDisplayNP.setColorScale(1, 1, 1, 1)
        self.chatDisplayNP.showThrough()
        self.__showLines()
        self.slider = DirectScrollBar(
            parent=self,
            relief=None,
            manageButtons=0,
            resizeThumb=0,
            frameSize=(-0.006, 0.006, -0.08, 0.08),
            image=charGui.find('**/chargui_slider_small'),
            image_scale=(0.18, 0.035, 0.07),
            image_hpr=(0, 0, 90),
            thumb_image=(charGui.find('**/chargui_slider_node'),
                         charGui.find('**/chargui_slider_node_down'),
                         charGui.find('**/chargui_slider_node_over')),
            thumb_image_scale=0.075,
            thumb_relief=None,
            decButton_pos=Vec3(0, 0, -0.0825),
            decButton_image=(tGui.find('**/triangle'),
                             tGui.find('**/triangle_down'),
                             tGui.find('**/triangle_over')),
            decButton_image_hpr=(0, 0, 90),
            decButton_scale=(0.08, 1.0, 0.125),
            decButton_image_scale=0.075,
            decButton_relief=None,
            incButton_pos=Vec3(0.00025, 0, 0.0825),
            incButton_image=(tGui.find('**/triangle'),
                             tGui.find('**/triangle_down'),
                             tGui.find('**/triangle_over')),
            incButton_image_hpr=(0, 0, -90),
            incButton_scale=(0.08, 1.0, 0.125),
            incButton_image_scale=0.075,
            incButton_relief=None,
            scale=5.7,
            pos=(0.052, 0, 0.7),
            value=0,
            range=(0, self.NumVisible),
            scrollSize=1,
            pageSize=1,
            orientation=DGG.VERTICAL_INVERTED,
            command=self.scrollList)
        self.slider.hide()
        self.slider.setName('chatPanel.slider')
        if hasattr(self, 'chatBar'):
            self.chatBar.reparentTo(self)
        self.request('Standby')
        self.updateDisplay()
        return

    def cleanupGui(self):
        if self.sCloseButton:
            self.sCloseButton.detachNode()
            self.sCloseButton.destroy()
        if self.tCloseButton:
            self.tCloseButton.detachNode()
            self.tCloseButton.destroy()
        if self.minButton:
            self.minButton.detachNode()
            self.minButton.destroy()
        if self.maxButton:
            self.maxButton.detachNode()
            self.maxButton.destroy()
        self.wrappedText = []
        self.lineDict = {}
        self.renderedLineDict = {}
        self.renderedLines = []
        self.shortBg = None
        self.shortBorder = None
        self.tallBg = None
        self.tallBorder = None
        self.sCloseButton = None
        self.maxButton = None
        self.tCloseButton = None
        self.minButton = None
        self.chatTextRender = None
        self.chatDisplayNP = None
        self.slider = None
        return

    def destroy(self):
        self.chatFont = None
        self.nameFont = None
        self.ignore('NewOpenMessage')
        self.ignore(PiratesGlobals.HideGuiHotkey)
        self.stopFadeIval()
        self.stopFadeTextIval()
        self.stopFadeTextTimer()
        self.slider.destroy()
        self.cleanupGui()
        DirectFrame.destroy(self)
        self.chatManager = None
        base.chatPanel = None
        return

    def activateAllChat(self):
        self.requestPreferredMode()
        self.chatBar.request('All')

    def activateCrewChat(self):
        self.requestPreferredMode()
        self.chatBar.request('Crew')

    def activateGuildChat(self):
        self.requestPreferredMode()
        self.chatBar.request('Guild')

    def activateShipPVPChat(self):
        self.requestPreferredMode()
        self.chatBar.request('ShipPVP')

    def activateWhisperChat(self, whisperId, toPlayer=False):
        self.requestPreferredMode()
        name = base.talkAssistant.findName(whisperId, toPlayer)
        self.chatBar.request('Whisper', name, whisperId)

    def deactivateChat(self):
        self.request('Standby')
        self.chatBar.request('Hidden')

    def updateState(self, state):
        self['state'] = state

    def setState(self):
        DirectFrame.setState(self)
        if hasattr(self, 'sCloseButton'):
            self.sCloseButton['state'] = self['state']
            self.maxButton['state'] = self['state']
            self.tCloseButton['state'] = self['state']
            self.minButton['state'] = self['state']
            self.slider['state'] = self['state']

    def startFadeInIval(self):
        self.stopFadeIval()
        self.fadeIval = Parallel(
            Func(self.updateState, DGG.NORMAL), Func(self.hideNode.show),
            self.shortBg.colorScaleInterval(self.FadeTime,
                                            Vec4(1, 1, 1, 0.75),
                                            blendType='easeOut'),
            self.shortBorder.colorScaleInterval(self.FadeTime,
                                                Vec4(1, 1, 1, 1),
                                                blendType='easeOut'),
            self.tallBg.colorScaleInterval(self.FadeTime,
                                           Vec4(1, 1, 1, 0.75),
                                           blendType='easeOut'),
            self.tallBorder.colorScaleInterval(self.FadeTime,
                                               Vec4(1, 1, 1, 1),
                                               blendType='easeOut'),
            self.slider.colorScaleInterval(self.FadeTime,
                                           Vec4(1, 1, 1, 1),
                                           blendType='easeOut'))
        self.fadeIval.start()

    def startFadeOutIval(self):
        self.stopFadeIval()
        self.fadeIval = Parallel(
            Func(self.updateState, DGG.DISABLED),
            self.shortBg.colorScaleInterval(self.FadeTime,
                                            Vec4(1, 1, 1, 0),
                                            blendType='easeIn'),
            self.shortBorder.colorScaleInterval(self.FadeTime,
                                                Vec4(1, 1, 1, 0),
                                                blendType='easeIn'),
            self.tallBg.colorScaleInterval(self.FadeTime,
                                           Vec4(1, 1, 1, 0),
                                           blendType='easeIn'),
            self.tallBorder.colorScaleInterval(self.FadeTime,
                                               Vec4(1, 1, 1, 0),
                                               blendType='easeIn'),
            self.slider.colorScaleInterval(self.FadeTime,
                                           Vec4(1, 1, 1, 0),
                                           blendType='easeIn'),
            Sequence(Wait(self.FadeTime), Func(self.hideNode.hide)))
        self.fadeIval.start()

    def stopFadeIval(self):
        if self.fadeIval:
            self.fadeIval.pause()
        self.fadeIval = None
        return

    def startFadeTextIval(self):
        self.stopFadeTextIval()
        self.fadeTextIval = Sequence()
        self.fadeTextIval.append(
            self.chatDisplayNP.colorScaleInterval(self.TextFadeTime,
                                                  Vec4(1, 1, 1, 0)))
        self.fadeTextIval.append(Func(self.__hideLines))
        self.fadeTextIval.start()

    def stopFadeTextIval(self):
        if self.fadeTextIval:
            self.fadeTextIval.pause()
        self.fadeTextIval = None
        return

    def unfadeText(self):
        self.stopFadeTextIval()
        self.chatDisplayNP.setColorScale(1, 1, 1, 1)
        self.__showLines()

    def startFadeTextTimer(self):
        self.stopFadeTextTimer()
        taskMgr.doMethodLater(self.TextFadeDelay, self.startFadeTextIval,
                              'ChatPanel-fadeText', [])

    def stopFadeTextTimer(self):
        taskMgr.remove('ChatPanel-fadeText')

    def requestPreferredMode(self):
        self.request(self.preferredMode)

    def defaultFilter(self, request, args):
        if self.getCurrentOrNextState() == request:
            return
        else:
            return FSM.defaultFilter(self, request, args)
        return

    def enterStandby(self):
        messenger.send('chatPanelClose')
        self.startFadeOutIval()
        self.startFadeTextTimer()
        self.NumVisible = 10
        (self.chatDisplayNP.setPos(0.09, 0,
                                   0.2 + 9.143 * self.currentFontSize), )
        self.index = 0
        self.slider['value'] = self.index
        self.updateDisplay()

    def exitStandby(self):
        messenger.send('chatPanelOpen')
        self.startFadeInIval()
        self.stopFadeTextTimer()
        self.unfadeText()

    def enterShort(self):
        messenger.send('chatPanelMin')
        self.slider.hide()
        self.shortBg.show()
        self.shortBorder.show()
        self.tallBg.hide()
        self.tallBorder.hide()
        (self.chatDisplayNP.setPos(0.09, 0,
                                   0.2 + 9.143 * self.currentFontSize), )
        self.preferredMode = 'Short'
        self.NumVisible = 10
        self.index = 0
        self.slider['value'] = self.index
        self.updateDisplay()

    def exitShort(self):
        pass

    def enterTall(self):
        messenger.send('chatPanelMax')
        self.tallBg.show()
        self.tallBorder.show()
        self.shortBg.hide()
        self.shortBorder.hide()
        self.slider.show()
        (self.chatDisplayNP.setPos(0.09, 0,
                                   0.2 + 31.143 * self.currentFontSize), )
        self.preferredMode = 'Tall'
        self.NumVisible = 32
        self.index = 0
        self.slider['value'] = self.index
        self.updateDisplay()
        localAvatar.guiMgr.messageStackParent.setPos(0, 0, 0.75)

    def exitTall(self):
        localAvatar.guiMgr.messageStackParent.setPos(0, 0, 0.0)

    def getMessageTagText(self, message, wantReceiver=False):
        chatString = ''
        plainName = ''
        tag = ''
        extraInfo = ''
        divider = ':'
        seperator = '.'
        annouceMark = ' '
        isAnnounce = 0
        if message.getExtraInfo():
            extraInfo = message.getExtraInfo()
        if wantReceiver:
            if message.getReceiverAvatarName():
                plainName = message.getReceiverAvatarName()
            else:
                if message.getSenderAvatarName():
                    plainName = message.getSenderAvatarName()
                else:
                    if message.getSenderAccountName():
                        plainName = message.getSenderAccountName()
            if message.getTalkType() in (INFO_SYSTEM, INFO_GAME, UPDATE_FRIEND,
                                         CANNON_DEFENSE, INFO_GUILD):
                useName = wantReceiver and plainName
            else:
                useName = '\x01Super\x01.\x02 ' + plainName
        else:
            if message.getTalkType() == INFO_OPEN:
                if message.getSenderAvatarId() == localAvatar.doId:
                    useName = ''
                else:
                    useName = plainName
            else:
                if message.getTalkType() == INFO_DEV:
                    useName = ''
                else:
                    if message.getTalkType() in (TALK_OPEN, TALK_WHISPER,
                                                 TALK_ACCOUNT, AVATAR_THOUGHT):
                        if message.getTalkType() == TALK_WHISPER:
                            if message.getSenderAvatarId() == localAvatar.doId:
                                plainName = OTPLocalizer.WhisperToFormatName % message.getReceiverAvatarName(
                                )
                            else:
                                plainName = OTPLocalizer.WhisperFromFormatName % message.getSenderAvatarName(
                                )
                        else:
                            if message.getTalkType() == TALK_ACCOUNT:
                                if message.getSenderAccountId(
                                ) == base.cr.accountDetailRecord.playerAccountId:
                                    plainName = OTPLocalizer.WhisperToFormatName % message.getReceiverAccountName(
                                    )
                                else:
                                    plainName = OTPLocalizer.WhisperFromFormatName % message.getSenderAccountName(
                                    )
                        if message.getTalkType() == AVATAR_THOUGHT:
                            if message.getSenderAvatarId() == localAvatar.doId:
                                plainName = OTPLocalizer.ThoughtSelfFormatName
                            else:
                                plainName = OTPLocalizer.ThoughtOtherFormatName % message.getSenderAvatarName(
                                )
                        useName = plainName + divider
                    else:
                        if message.getTalkType() == TALK_GM:
                            useName = '[' + PLocalizer.TalkGMLabel + '] ' + plainName + divider
                        else:
                            if message.getTalkType() == TALK_GUILD:
                                useName = '[' + PLocalizer.TalkGuildLabel + '] ' + plainName + divider
                            else:
                                if message.getTalkType() == UPDATE_GUILD:
                                    useName = '\x01Super\x01.\x02 [' + PLocalizer.TalkGuildLabel + '] ' + plainName
                                else:
                                    if message.getTalkType() == TALK_PARTY:
                                        useName = '[' + PLocalizer.TalkCrewLabel + '] ' + plainName + divider
                                    else:
                                        if message.getTalkType(
                                        ) == UPDATE_PARTY:
                                            useName = '\x01Super\x01.\x02 [' + PLocalizer.TalkCrewLabel + '] ' + plainName
                                        else:
                                            if message.getTalkType(
                                            ) == TALK_PVP:
                                                useName = '[' + extraInfo + '] ' + plainName + divider
                                            else:
                                                if message.getTalkType(
                                                ) == UPDATE_PVP:
                                                    useName = '\x01Super\x01.\x02 [' + extraInfo + '] ' + plainName
        return useName

    def decodeOpenMessage(self, message):
        nameButton = None
        extraInfo = message.getExtraInfo()
        useName = self.getMessageTagText(message)
        if message.getTalkType() == INFO_GUILD:
            useName2 = self.getMessageTagText(message, wantReceiver=True)
        tpMgr = TextPropertiesManager.getGlobalPtr()
        buttonCommand = None
        buttonArgs = None
        buttonCommand2 = None
        buttonArgs2 = None
        if message.getSenderAvatarId() == localAvatar.doId:
            if message.getTalkType() == TALK_WHISPER:
                buttonCommand = self.handleAvatarPress
                buttonArgs = [message.getReceiverAvatarId(), useName]
            else:
                buttonCommand = self.handleAvatarPress
                buttonArgs = [message.getSenderAvatarId(), useName]
        else:
            if message.getTalkType() == TALK_ACCOUNT:
                if message.getSenderAccountId():
                    buttonCommand = (
                        message.getSenderAccountId()
                        == base.cr.accountDetailRecord.playerAccountId
                        and self).handlePlayerPress
                    buttonArgs = [message.getReceiverAccountId(), useName]
                else:
                    buttonCommand = self.handlePlayerPress
                    buttonArgs = [message.getSenderAccountId(), useName]
            else:
                if message.getSenderAvatarId():
                    buttonCommand = self.handleAvatarPress
                    buttonArgs = [message.getSenderAvatarId(), useName]
                else:
                    if message.getSenderAccountId():
                        buttonCommand = self.handlePlayerPress
                        buttonArgs = [message.getSenderAccountId(), useName]
        if message.getTalkType() == INFO_GUILD:
            if message.getReceiverAvatarId():
                wantTwoNames = True
            else:
                wantTwoNames = False
            if wantTwoNames:
                buttonCommand2 = self.handleAvatarPress
                buttonArgs2 = [message.getReceiverAvatarId(), useName2]
            nameArray = (
                '\x01' +
                MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle]
                + '\x01' + useName + '\x02', '\x01' +
                MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle]
                + '\x01' + useName + '\x02', '\x01' +
                MESSAGE_OVER_TABLE[message.getTalkType()][self.fontColorStyle]
                + '\x01' + useName + '\x02', '\x01' +
                MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle]
                + '\x01' + useName + '\x02')
            nameButton = DirectButton(parent=NodePath(),
                                      relief=None,
                                      text=nameArray,
                                      text_align=TextNode.ALeft,
                                      text_pos=(0.0, 0.0),
                                      text_shadow=self.shadowColor,
                                      text_shadowOffset=self.shadowOffset,
                                      text_font=self.nameFont,
                                      textMayChange=0,
                                      command=buttonCommand,
                                      extraArgs=buttonArgs)
            left, right, bottom, top = nameButton.getBounds()
            nameGFX = TextGraphic(nameButton, left, right, 0, 1)
            buttonName = '%s%s' % (message.getTalkType(), useName)
            tpMgr.setGraphic(buttonName, nameGFX)
            if wantTwoNames:
                nameArray2 = ('\x01' + MESSAGE_COLOR_TABLE[
                    message.getTalkType()][self.fontColorStyle] + '\x01' +
                              useName2 + '\x02', '\x01' + MESSAGE_COLOR_TABLE[
                                  message.getTalkType()][self.fontColorStyle] +
                              '\x01' + useName2 + '\x02', '\x01' +
                              MESSAGE_OVER_TABLE[message.getTalkType()][
                                  self.fontColorStyle] + '\x01' + useName2 +
                              '\x02', '\x01' + MESSAGE_COLOR_TABLE[
                                  message.getTalkType()][self.fontColorStyle] +
                              '\x01' + useName2 + '\x02')
                nameButton2 = DirectButton(parent=NodePath(),
                                           relief=None,
                                           text=nameArray2,
                                           text_align=TextNode.ALeft,
                                           text_pos=(0.0, 0.0),
                                           text_shadow=self.shadowColor,
                                           text_shadowOffset=self.shadowOffset,
                                           text_font=self.nameFont,
                                           textMayChange=0,
                                           command=buttonCommand2,
                                           extraArgs=buttonArgs2)
                left, right, bottom, top = nameButton2.getBounds()
                nameGFX2 = TextGraphic(nameButton2, left, right, 0, 1)
                buttonName2 = '%s%s' % (message.getTalkType(), useName2)
                tpMgr.setGraphic(buttonName2, nameGFX2)
            del tpMgr
            self.lineDict[message.getMessageId()] = (message, nameButton,
                                                     buttonName)
            if nameButton:
                messageName = '\x05' + buttonName + '\x05'
                if wantTwoNames:
                    messageName2 = '\x05' + buttonName2 + '\x05'
            else:
                messageName = message.getSenderAvatarName() + ': '
            messageBody = message.getBody()
            chatString = ''
            someMessage = '%s' in message.getBody() and message.getTalkType(
            ) == INFO_OPEN and message.getBody() % messageName
        else:
            if '%s' in message.getBody() and message.getTalkType(
            ) == INFO_GUILD:
                if wantTwoNames:
                    if extraInfo:
                        someMessage = message.getBody() % (
                            messageName, messageName2, extraInfo[0])
                    else:
                        someMessage = message.getBody() % (messageName,
                                                           messageName2)
                elif extraInfo:
                    someMessage = message.getBody() % (messageName,
                                                       extraInfo[0])
                else:
                    someMessage = message.getBody() % messageName
            else:
                someMessage = messageName + message.getBody()
        chatCode = MESSAGE_STYLE_TABLE[message.getTalkType()][
            self.fontColorStyle]
        self.wordWrapper.setText(someMessage)
        wrappedText = self.wordWrapper.getWordwrappedText().split('\n')
        tab = '    '
        for i in range(len(wrappedText)):
            if i == 0:
                if chatCode:
                    wrappedText[i] = '\x01' + chatCode + '\x01' + wrappedText[
                        i] + '\x02'
            else:
                if i > 0:
                    wrappedText[
                        i] = '    ' + '\x01' + chatCode + '\x01' + wrappedText[
                            i] + '\x02'
            if i < len(wrappedText) - 1:
                wrappedText[i] += '\n'

        for text in wrappedText:
            chatString += text

        return chatString

    def clearText(self):
        tpMgr = TextPropertiesManager.getGlobalPtr()
        for key in self.lineDict:
            message, nameButton, buttonName = self.lineDict[key]
            nameButton.destroy()
            tpMgr.clearGraphic(buttonName)

        self.renderedLineDict = {}
        self.lineDict = {}
        del tpMgr

    def regenText(self):
        self.clearText()
        self.updateDisplay()

    def regenLineCountList(self):
        self.runningLineCount = 0
        self.runningLineCountLastId = -1
        self.lineCountList = [0]
        allMessages = base.talkAssistant.getAllCompleteText()
        for message in allMessages:
            self.wordWrapper.setText(
                self.getMessageTagText(message) + message.getBody())
            wrappedText = self.wordWrapper.getWordwrappedText()
            if message.getMessageId() > self.runningLineCountLastId:
                self.runningLineCountLastId = message.getMessageId()
            for mline in wrappedText.split('\n'):
                self.lineCountList.append(message.getMessageId())
                self.runningLineCount += 1

    def putText(self, startLine, numLines):
        startMessage = self.lineCountList[startLine]
        messageList = base.talkAssistant.getCompleteTextFromRecent(
            self.NumVisible, startMessage)
        displayText = []
        tpMgr = TextPropertiesManager.getGlobalPtr()
        lineHeight = self.chatFont.getLineHeight()
        self.renderedLines = []
        messageIdList = []
        for message in messageList:
            if base.cr.avatarFriendsManager.checkIgnored(
                    message.getSenderAvatarId()):
                continue
            messageIdList.append(message.getMessageId())
            if not self.renderedLineDict.get(message):
                msg = self.decodeOpenMessage(message)
                messageRenderedLines = []
                self.renderedLineDict[message] = messageRenderedLines
                for mline in msg.split('\n'):
                    self.chatTextRender.setText(mline)
                    newLine = self.chatTextRender.generate()
                    messageRenderedLines.append(newLine)

            self.renderedLines = self.renderedLineDict[
                message] + self.renderedLines
            if len(self.renderedLines) >= self.NumVisible:
                break

        removeIds = []
        removeRendered = []
        for key in self.lineDict:
            if key not in messageIdList:
                message, nameButton, buttonName = self.lineDict[key]
                nameButton.destroy()
                tpMgr.clearGraphic(buttonName)
                removeIds.append(key)
                removeRendered.append(message)

        for message in removeRendered:
            self.renderedLineDict.pop(message)

        for key in removeIds:
            self.lineDict.pop(key)

        self.renderedLines = self.renderedLines[-self.NumVisible:]
        self.chatDisplayNP.getChildren().detach()
        z = -lineHeight * (self.NumVisible - len(self.renderedLines))
        for rline in self.renderedLines:
            np = self.chatDisplayNP.attachNewNode(rline)
            np.setZ(z)
            z -= lineHeight

        del tpMgr
        self.updateRange()

    def __handleOpenMessage(self, message):
        self.index = 0
        if message.getMessageId() > self.runningLineCountLastId:
            self.runningLineCountLastId = message.getMessageId()
            self.wordWrapper.setText(
                self.getMessageTagText(message) + message.getBody())
            wrappedText = self.wordWrapper.getWordwrappedText()
            for mline in wrappedText.split('\n'):
                self.lineCountList.append(message.getMessageId())
                self.runningLineCount += 1

        self.updateDisplay()
        self.unfadeText()
        if self.getCurrentOrNextState() == 'Standby':
            self.startFadeTextTimer()

    def __handleGlobalGuiShow(self):
        if self.__showLines:
            self.chatDisplayNP.showThrough()

    def __handleGlobalGuiHide(self):
        if self.linesShown:
            self.chatDisplayNP.show()

    def __showLines(self):
        self.linesShown = True
        if base.showGui:
            self.chatDisplayNP.showThrough()
        else:
            self.chatDisplayNP.show()

    def __hideLines(self):
        self.linesShown = False
        self.chatDisplayNP.hide()

    def updateDisplay(self):
        if hasattr(base, 'talkAssistant'):
            self.putText(self.index, self.NumVisible)

    def updateRange(self):
        numLines = self.runningLineCount
        if self.getCurrentOrNextState() != 'Tall':
            self.index = 0
            return
        maxRange = self.runningLineCount - int(self.NumVisible * 0.66)
        maxRange = max(maxRange, 0)
        if maxRange:
            if self.getCurrentOrNextState() == 'Tall':
                self.slider.show()
            self.slider['range'] = (0, maxRange)
            self.index = min(self.index, self.slider['range'][1])
            self.index = max(self.index, self.slider['range'][0])
        else:
            self.slider.hide()
            self.index = 0

    def scrollList(self):
        index = int(self.slider.getValue())
        if self.index != index:
            self.index = index
            self.updateDisplay()

    def enableCrewChat(self):
        self.chatBar.refreshTabStates()

    def disableCrewChat(self):
        self.chatBar.refreshTabStates()

    def enableGuildChat(self):
        self.chatBar.refreshTabStates()

    def disableGuildChat(self):
        self.chatBar.refreshTabStates()

    def disableShipPVPChat(self):
        self.chatBar.refreshTabStates()

    def enableShipPVPChat(self):
        self.chatBar.refreshTabStates()

    def enableWhiteListChat(self):
        self.chatBar.enableWhiteListChat()

    def disableWhiteListChat(self):
        self.chatBar.disableWhiteListChat()

    def checkEmotes(self):
        for id in PLocalizer.EmoteCommands.values():
            if type(id) == type((0, )):
                pass

    def hide(self):
        self.holdLinesShown = self.linesShown
        NodePath.hide(self)
        self.__hideLines()

    def show(self):
        DirectFrame.show(self)
        if self.holdLinesShown:
            self.__showLines()

    def handleAvatarPress(self, avId, avName):
        if (hasattr(base, 'localAvatar') and base).localAvatar.guiMgr:
            base.localAvatar.guiMgr.handleAvatarDetails(avId, avName)

    def handlePlayerPress(self, pId, pName):
        if (hasattr(base, 'localAvatar') and base).localAvatar.guiMgr:
            base.localAvatar.guiMgr.handlePlayerDetails(pId, pName)
class ChatPanel(DirectFrame, FSM):
    NumVisible = 10
    WrapWidth = 22
    WrapWidthSmall = 28
    TextScale = 0.035000000000000003
    TextScaleSmall = 0.028000000000000001
    FadeTime = 0.29999999999999999
    TextFadeDelay = 120
    TextFadeTime = 5
    widthBase = 21.25
    widthVarience = 12.0

    def __init__(self, chatManager, whiteListEntry):
        optiondefs = (('relief', None, None), ('state', DGG.NORMAL, self.setState), ('frameSize', (0, 0.90000000000000002, 0, 0.59999999999999998), None), ('frameColor', (1, 0, 1, 0.20000000000000001), None))
        self.defineoptions({ }, optiondefs)
        DirectFrame.__init__(self, parent = NodePath())
        self.initialiseoptions(ChatPanel)
        FSM.__init__(self, 'ChatPanel')
        base.chatPanel = self
        self.chatManager = chatManager
        self.index = 0
        self.runningLineCount = 0
        self.runningLineCountLastId = -1
        self.lineCountList = [
            0]
        self.wrappedText = []
        self.chatFont = PiratesGlobals.getInterfaceFont()
        self.nameFont = PiratesGlobals.getInterfaceFont()
        self.shadowOffset = (0.089999999999999997, 0.089999999999999997)
        self.shadowColor = (0.0, 0.0, 0.0, 1.0)
        self.fontColorStyle = 1
        if base.config.GetBool('want-random-chatStyle', 0):
            self.chatFont = random.choice([
                PiratesGlobals.getInterfaceFont(),
                PiratesGlobals.getInterfaceOutlineFont()])
            self.nameFont = random.choice([
                PiratesGlobals.getInterfaceFont(),
                PiratesGlobals.getInterfaceOutlineFont()])
            self.shadowOffset = random.choice([
                (0.089999999999999997, 0.089999999999999997),
                (0.0, 0.0)])
            self.fontColorStyle = random.choice([
                0,
                1,
                2])

        self.lineDict = { }
        self.renderedLineDict = { }
        self.renderedLines = []
        self.wordWrapper = TextNode('wrapper')
        self.wordWrapper.setFont(self.chatFont)
        self.wordWrapper.setWordwrap(self.WrapWidth)
        self.wordWrapper.setTabWidth(1.0)
        self.fadeIval = None
        self.fadeTextIval = None
        self.preferredMode = 'Short'
        self.linesShown = True
        self.holdLinesShown = None
        self.wantSmallFont = 0
        self.currentFontSize = self.TextScale
        self.currentWordWrap = self.WrapWidth
        self.resizeDelayTaskName = 'ChatPanel_Resize'
        self.sCloseButton = None
        self.tCloseButton = None
        self.minButton = None
        self.maxButton = None
        self.setupGui()
        self.chatBar = ChatBar(parent = self, chatMgr = chatManager, whiteListEntry = whiteListEntry)
        self.setBoxWidth(base.options.chatbox_scale)
        self.checkEmotes()
        self.needSlider = 0
        self.reparentTo(base.a2dBottomLeft)
        self.accept('NewOpenMessage', self._ChatPanel__handleOpenMessage)
        self.accept('SetChatBoxWidth', self.setBoxWidth)
        self.accept('SetChatBoxStyle', self.setChatStyle)
        self.accept('GUIHidden', self._ChatPanel__handleGlobalGuiHide)
        self.accept('GUIShown', self._ChatPanel__handleGlobalGuiShow)


    def setChatStyle(self, value):
        pass


    def setBoxWidth(self, scale):
        self.currentWordWrap = self.widthBase + scale * self.widthVarience
        wordWrapWithBias = self.widthBase + 1.22 * scale * self.widthVarience
        percentage = float(self.currentWordWrap) / float(self.widthBase)
        self.shortBorder.setScale(percentage, 1.0, 1.0)
        self.shortBg.setScale(percentage, 1.0, 1.0)
        self.tallBorder.setScale(percentage, 1.0, 1.0)
        self.tallBg.setScale(percentage, 1.0, 1.0)
        self.wordWrapper.setWordwrap(wordWrapWithBias)
        self.chatDisplayNP.setScale(self.currentFontSize)
        messenger.send('SetChatBoxPercentage', [
            percentage])
        self.chatBar.setBoxWidth(percentage)
        while taskMgr.hasTaskNamed(self.resizeDelayTaskName):
            taskMgr.remove(self.resizeDelayTaskName)
        task = taskMgr.doMethodLater(0.5, self.regenAfterResize, self.resizeDelayTaskName)


    def regenAfterResize(self, task):
        self.regenText()
        return task.done


    def toggleFontSize(self):
        if self.wantSmallFont == 0:
            self.wantSmallFont = 1
        elif self.wantSmallFont == 1:
            self.wantSmallFont = 0

        self.setFontSize(self.wantSmallFont)


    def setFontSize(self, size):
        self.wantSmallFont = size
        if self.wantSmallFont == 1:
            self.currentFontSize = self.TextScaleSmall
            self.currentWordWrap = self.WrapWidthSmall
        elif self.wantSmallFont == 0:
            self.currentFontSize = self.TextScale
            self.currentWordWrap = self.WrapWidth

        self.wordWrapper.setWordwrap(self.currentWordWrap)
        self.chatDisplayNP.setScale(self.currentFontSize)
        self.regenText()
        self.request('Standby')
        self.request(self.preferredMode)


    def setupGui(self):
        self.cleanupGui()
        if hasattr(self, 'chatBar'):
            self.chatBar.detachNode()

        self.removeChildren()
        guib = loader.loadModel('models/gui/chat_frame_b')
        guic = loader.loadModel('models/gui/chat_frame_c')
        charGui = loader.loadModelOnce('models/gui/char_gui')
        tGui = loader.loadModel('models/gui/triangle')
        self.hideNode = self.attachNewNode('hideNode')
        cm = CardMaker('shortBg')
        cm.setColor(0, 0, 0, 1)
        cm.setFrame(0.0050000000000000001, 0.89500000000000002, 0.089999999999999997, 0.59499999999999997)
        self.shortBg = self.hideNode.attachNewNode(cm.generate())
        self.shortBg.setTransparency(1)
        self.shortBg.setColor(0, 0, 0, 1)
        self.shortBg.flattenStrong()
        self.shortBg.setColorScale(1, 1, 1, 0)
        self.shortBorder = self.hideNode.attachNewNode('shortBorder')
        top = guib.find('**/pPlane8').copyTo(self.shortBorder)
        top.setZ(-0.75)
        mid = guib.find('**/pPlane9').copyTo(self.shortBorder)
        mid.setScale(1, 1, 0.68000000000000005)
        mid.setZ(-0.40000000000000002)
        guib.find('**/pPlane10').copyTo(self.shortBorder)
        top = guib.find('**/pPlane26').copyTo(self.shortBorder)
        top.setZ(-0.75)
        mid = guib.find('**/pPlane27').copyTo(self.shortBorder)
        mid.setScale(1, 1, 0.68000000000000005)
        mid.setZ(-0.40000000000000002)
        self.shortBorder.setScale(0.20000000000000001)
        self.shortBorder.setPos(0.5, 0, 0.375)
        self.shortBorder.flattenStrong()
        buttonGeom = NodePath('Close')
        guib.find('**/pPlane30').copyTo(buttonGeom)
        guib.find('**/pPlane31').copyTo(buttonGeom)
        guib.find('**/pPlane32').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.sCloseButton = DirectButton(parent = self.shortBorder, relief = None, frameColor = (1, 1, 1, 1), pad = (-0.02, -0.02), borderWidth = (0, 0), geom = buttonGeom, pos = (0.5, 0, 0.22500000000000001), scale = 0.20000000000000001, rolloverSound = None, command = self.chatManager.deactivateChat)
        buttonGeom = NodePath('Max')
        guib.find('**/pPlane22').copyTo(buttonGeom)
        guib.find('**/pPlane23').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.maxButton = DirectButton(parent = self.shortBorder, relief = None, frameColor = (1, 1, 1, 1), pad = (-0.02, -0.02), borderWidth = (0, 0), geom = buttonGeom, pos = (0.5, 0, 0.22500000000000001), scale = 0.20000000000000001, rolloverSound = None, command = self.request, extraArgs = [
            'Tall'])
        cm.setName('tallBg')
        cm.setFrame(0.0050000000000000001, 0.89500000000000002, 0.089999999999999997, 1.3600000000000001)
        self.tallBg = self.hideNode.attachNewNode(cm.generate())
        self.tallBg.setColor(0, 0, 0, 1)
        self.tallBg.setTransparency(1)
        self.tallBg.flattenStrong()
        self.tallBg.setColorScale(1, 1, 1, 0)
        self.tallBorder = self.hideNode.attachNewNode('tallBorder')
        guic.find('**/pPlane8').copyTo(self.tallBorder)
        guic.find('**/pPlane9').copyTo(self.tallBorder)
        guic.find('**/pPlane10').copyTo(self.tallBorder)
        guic.find('**/pPlane26').copyTo(self.tallBorder)
        guic.find('**/pPlane27').copyTo(self.tallBorder)
        self.tallBorder.setScale(0.20000000000000001)
        self.tallBorder.setPos(0.5, 0, 0.375)
        self.tallBorder.flattenStrong()
        buttonGeom = NodePath('Close')
        guic.find('**/pPlane30').copyTo(buttonGeom)
        guic.find('**/pPlane31').copyTo(buttonGeom)
        guic.find('**/pPlane32').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.tCloseButton = DirectButton(parent = self.tallBorder, relief = None, frameColor = (1, 1, 1, 1), pad = (-0.02, -0.02), borderWidth = (0, 0), geom = buttonGeom, pos = (0.5, 0, 0.375), scale = 0.20000000000000001, rolloverSound = None, command = self.chatManager.deactivateChat)
        buttonGeom = NodePath('Min')
        guic.find('**/pPlane28').copyTo(buttonGeom)
        guic.find('**/pPlane29').copyTo(buttonGeom)
        buttonGeom.flattenStrong()
        self.minButton = DirectButton(parent = self.tallBorder, relief = None, frameColor = (1, 1, 1, 1), pad = (-0.02, -0.02), borderWidth = (0, 0), geom = buttonGeom, pos = (0.54800000000000004, 0, 0.375), scale = 0.20000000000000001, rolloverSound = None, command = self.request, extraArgs = [
            'Short'])
        self.chatTextRender = TextNode('chatTextRender')
        self.chatTextRender.setFont(self.chatFont)
        self.chatTextRender.setShadowColor(self.shadowColor)
        self.chatTextRender.setShadow(self.shadowOffset)
        self.chatDisplayNP = self.hideNode.attachNewNode('chatDisplay')
        self.chatDisplayNP.setScale(self.TextScale)
        self.chatDisplayNP.setColorScale(1, 1, 1, 1)
        self.chatDisplayNP.showThrough()
        self._ChatPanel__showLines()
        self.slider = DirectScrollBar(parent = self, relief = None, manageButtons = 0, resizeThumb = 0, frameSize = (-0.0060000000000000001, 0.0060000000000000001, -0.080000000000000002, 0.080000000000000002), image = charGui.find('**/chargui_slider_small'), image_scale = (0.17999999999999999, 0.035000000000000003, 0.070000000000000007), image_hpr = (0, 0, 90), thumb_image = (charGui.find('**/chargui_slider_node'), charGui.find('**/chargui_slider_node_down'), charGui.find('**/chargui_slider_node_over')), thumb_image_scale = 0.074999999999999997, thumb_relief = None, decButton_pos = Vec3(0, 0, -0.082500000000000004), decButton_image = (tGui.find('**/triangle'), tGui.find('**/triangle_down'), tGui.find('**/triangle_over')), decButton_image_hpr = (0, 0, 90), decButton_scale = (0.080000000000000002, 1.0, 0.125), decButton_image_scale = 0.074999999999999997, decButton_relief = None, incButton_pos = Vec3(0.00025000000000000001, 0, 0.082500000000000004), incButton_image = (tGui.find('**/triangle'), tGui.find('**/triangle_down'), tGui.find('**/triangle_over')), incButton_image_hpr = (0, 0, -90), incButton_scale = (0.080000000000000002, 1.0, 0.125), incButton_image_scale = 0.074999999999999997, incButton_relief = None, scale = 5.7000000000000002, pos = (0.051999999999999998, 0, 0.69999999999999996), value = 0, range = (0, self.NumVisible), scrollSize = 1, pageSize = 1, orientation = DGG.VERTICAL_INVERTED, command = self.scrollList)
        self.slider.hide()
        self.slider.setName('chatPanel.slider')
        if hasattr(self, 'chatBar'):
            self.chatBar.reparentTo(self)

        self.request('Standby')
        self.updateDisplay()


    def cleanupGui(self):
        if self.sCloseButton:
            self.sCloseButton.detachNode()
            self.sCloseButton.destroy()

        if self.tCloseButton:
            self.tCloseButton.detachNode()
            self.tCloseButton.destroy()

        if self.minButton:
            self.minButton.detachNode()
            self.minButton.destroy()

        if self.maxButton:
            self.maxButton.detachNode()
            self.maxButton.destroy()

        self.wrappedText = []
        self.lineDict = { }
        self.renderedLineDict = { }
        self.renderedLines = []
        self.shortBg = None
        self.shortBorder = None
        self.tallBg = None
        self.tallBorder = None
        self.sCloseButton = None
        self.maxButton = None
        self.tCloseButton = None
        self.minButton = None
        self.chatTextRender = None
        self.chatDisplayNP = None
        self.slider = None


    def destroy(self):
        self.chatFont = None
        self.nameFont = None
        self.ignore('NewOpenMessage')
        self.ignore(PiratesGlobals.HideGuiHotkey)
        self.stopFadeIval()
        self.stopFadeTextIval()
        self.stopFadeTextTimer()
        self.slider.destroy()
        self.cleanupGui()
        DirectFrame.destroy(self)
        self.chatManager = None
        base.chatPanel = None


    def activateAllChat(self):
        self.requestPreferredMode()
        self.chatBar.request('All')


    def activateCrewChat(self):
        self.requestPreferredMode()
        self.chatBar.request('Crew')


    def activateGuildChat(self):
        self.requestPreferredMode()
        self.chatBar.request('Guild')


    def activateShipPVPChat(self):
        self.requestPreferredMode()
        self.chatBar.request('ShipPVP')


    def activateWhisperChat(self, whisperId, toPlayer = False):
        self.requestPreferredMode()
        name = base.talkAssistant.findName(whisperId, toPlayer)
        self.chatBar.request('Whisper', name, whisperId)


    def deactivateChat(self):
        self.request('Standby')
        self.chatBar.request('Hidden')


    def updateState(self, state):
        self['state'] = state


    def setState(self):
        DirectFrame.setState(self)
        if hasattr(self, 'sCloseButton'):
            self.sCloseButton['state'] = self['state']
            self.maxButton['state'] = self['state']
            self.tCloseButton['state'] = self['state']
            self.minButton['state'] = self['state']
            self.slider['state'] = self['state']



    def startFadeInIval(self):
        self.stopFadeIval()
        self.fadeIval = Parallel(Func(self.updateState, DGG.NORMAL), Func(self.hideNode.show), self.shortBg.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 0.75), blendType = 'easeOut'), self.shortBorder.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 1), blendType = 'easeOut'), self.tallBg.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 0.75), blendType = 'easeOut'), self.tallBorder.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 1), blendType = 'easeOut'), self.slider.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 1), blendType = 'easeOut'))
        self.fadeIval.start()


    def startFadeOutIval(self):
        self.stopFadeIval()
        self.fadeIval = Parallel(Func(self.updateState, DGG.DISABLED), self.shortBg.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 0), blendType = 'easeIn'), self.shortBorder.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 0), blendType = 'easeIn'), self.tallBg.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 0), blendType = 'easeIn'), self.tallBorder.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 0), blendType = 'easeIn'), self.slider.colorScaleInterval(self.FadeTime, Vec4(1, 1, 1, 0), blendType = 'easeIn'), Sequence(Wait(self.FadeTime), Func(self.hideNode.hide)))
        self.fadeIval.start()


    def stopFadeIval(self):
        if self.fadeIval:
            self.fadeIval.pause()

        self.fadeIval = None


    def startFadeTextIval(self):
        self.stopFadeTextIval()
        self.fadeTextIval = Sequence()
        self.fadeTextIval.append(self.chatDisplayNP.colorScaleInterval(self.TextFadeTime, Vec4(1, 1, 1, 0)))
        self.fadeTextIval.append(Func(self._ChatPanel__hideLines))
        self.fadeTextIval.start()


    def stopFadeTextIval(self):
        if self.fadeTextIval:
            self.fadeTextIval.pause()

        self.fadeTextIval = None


    def unfadeText(self):
        self.stopFadeTextIval()
        self.chatDisplayNP.setColorScale(1, 1, 1, 1)
        self._ChatPanel__showLines()


    def startFadeTextTimer(self):
        self.stopFadeTextTimer()
        taskMgr.doMethodLater(self.TextFadeDelay, self.startFadeTextIval, 'ChatPanel-fadeText', [])


    def stopFadeTextTimer(self):
        taskMgr.remove('ChatPanel-fadeText')


    def requestPreferredMode(self):
        self.request(self.preferredMode)


    def defaultFilter(self, request, args):
        if self.getCurrentOrNextState() == request:
            return None
        else:
            return FSM.defaultFilter(self, request, args)


    def enterStandby(self):
        messenger.send('chatPanelClose')
        self.startFadeOutIval()
        self.startFadeTextTimer()
        self.NumVisible = 10
        (self.chatDisplayNP.setPos(0.089999999999999997, 0, 0.20000000000000001 + 9.1430000000000007 * self.currentFontSize),)
        self.index = 0
        self.slider['value'] = self.index
        self.updateDisplay()


    def exitStandby(self):
        messenger.send('chatPanelOpen')
        self.startFadeInIval()
        self.stopFadeTextTimer()
        self.unfadeText()


    def enterShort(self):
        messenger.send('chatPanelMin')
        self.slider.hide()
        self.shortBg.show()
        self.shortBorder.show()
        self.tallBg.hide()
        self.tallBorder.hide()
        (self.chatDisplayNP.setPos(0.089999999999999997, 0, 0.20000000000000001 + 9.1430000000000007 * self.currentFontSize),)
        self.preferredMode = 'Short'
        self.NumVisible = 10
        self.index = 0
        self.slider['value'] = self.index
        self.updateDisplay()


    def exitShort(self):
        pass


    def enterTall(self):
        messenger.send('chatPanelMax')
        self.tallBg.show()
        self.tallBorder.show()
        self.shortBg.hide()
        self.shortBorder.hide()
        self.slider.show()
        (self.chatDisplayNP.setPos(0.089999999999999997, 0, 0.20000000000000001 + 31.143000000000001 * self.currentFontSize),)
        self.preferredMode = 'Tall'
        self.NumVisible = 32
        self.index = 0
        self.slider['value'] = self.index
        self.updateDisplay()
        localAvatar.guiMgr.messageStackParent.setPos(0, 0, 0.75)


    def exitTall(self):
        localAvatar.guiMgr.messageStackParent.setPos(0, 0, 0.0)


    def getMessageTagText(self, message, wantReceiver = False):
        chatString = ''
        plainName = ''
        tag = ''
        extraInfo = ''
        divider = ':'
        seperator = '.'
        annouceMark = ' '
        isAnnounce = 0
        if message.getExtraInfo():
            extraInfo = message.getExtraInfo()

        if wantReceiver and message.getReceiverAvatarName():
            plainName = message.getReceiverAvatarName()
        elif message.getSenderAvatarName():
            plainName = message.getSenderAvatarName()
        elif message.getSenderAccountName():
            plainName = message.getSenderAccountName()

        if message.getTalkType() in (INFO_SYSTEM, INFO_GAME, UPDATE_FRIEND, CANNON_DEFENSE, INFO_GUILD):
            if wantReceiver:
                useName = plainName
            else:
                useName = 'Super. ' + plainName
        elif message.getTalkType() == INFO_OPEN:
            if message.getSenderAvatarId() == localAvatar.doId:
                useName = ''
            else:
                useName = plainName
        elif message.getTalkType() == INFO_DEV:
            useName = ''
        elif message.getTalkType() in (TALK_OPEN, TALK_WHISPER, TALK_ACCOUNT, AVATAR_THOUGHT):
            if message.getTalkType() == TALK_WHISPER:
                if message.getSenderAvatarId() == localAvatar.doId:
                    plainName = OTPLocalizer.WhisperToFormatName % message.getReceiverAvatarName()
                else:
                    plainName = OTPLocalizer.WhisperFromFormatName % message.getSenderAvatarName()
            elif message.getTalkType() == TALK_ACCOUNT:
                if message.getSenderAccountId() == base.cr.accountDetailRecord.playerAccountId:
                    plainName = OTPLocalizer.WhisperToFormatName % message.getReceiverAccountName()
                else:
                    plainName = OTPLocalizer.WhisperFromFormatName % message.getSenderAccountName()

            if message.getTalkType() == AVATAR_THOUGHT:
                if message.getSenderAvatarId() == localAvatar.doId:
                    plainName = OTPLocalizer.ThoughtSelfFormatName
                else:
                    plainName = OTPLocalizer.ThoughtOtherFormatName % message.getSenderAvatarName()

            useName = plainName + divider
        elif message.getTalkType() == TALK_GM:
            useName = '[' + PLocalizer.TalkGMLabel + '] ' + plainName + divider
        elif message.getTalkType() == TALK_GUILD:
            useName = '[' + PLocalizer.TalkGuildLabel + '] ' + plainName + divider
        elif message.getTalkType() == UPDATE_GUILD:
            useName = 'Super. [' + PLocalizer.TalkGuildLabel + '] ' + plainName
        elif message.getTalkType() == TALK_PARTY:
            useName = '[' + PLocalizer.TalkCrewLabel + '] ' + plainName + divider
        elif message.getTalkType() == UPDATE_PARTY:
            useName = 'Super. [' + PLocalizer.TalkCrewLabel + '] ' + plainName
        elif message.getTalkType() == TALK_PVP:
            useName = '[' + extraInfo + '] ' + plainName + divider
        elif message.getTalkType() == UPDATE_PVP:
            useName = 'Super. [' + extraInfo + '] ' + plainName

        return useName


    def decodeOpenMessage(self, message):
        nameButton = None
        extraInfo = message.getExtraInfo()
        useName = self.getMessageTagText(message)
        if message.getTalkType() == INFO_GUILD:
            useName2 = self.getMessageTagText(message, wantReceiver = True)

        tpMgr = TextPropertiesManager.getGlobalPtr()
        buttonCommand = None
        buttonArgs = None
        buttonCommand2 = None
        buttonArgs2 = None
        if message.getSenderAvatarId() == localAvatar.doId:
            if message.getTalkType() == TALK_WHISPER:
                buttonCommand = self.handleAvatarPress
                buttonArgs = [
                    message.getReceiverAvatarId(),
                    useName]
            else:
                buttonCommand = self.handleAvatarPress
                buttonArgs = [
                    message.getSenderAvatarId(),
                    useName]
        elif message.getTalkType() == TALK_ACCOUNT and message.getSenderAccountId():
            if message.getSenderAccountId() == base.cr.accountDetailRecord.playerAccountId:
                buttonCommand = self.handlePlayerPress
                buttonArgs = [
                    message.getReceiverAccountId(),
                    useName]
            else:
                buttonCommand = self.handlePlayerPress
                buttonArgs = [
                    message.getSenderAccountId(),
                    useName]
        elif message.getSenderAvatarId():
            buttonCommand = self.handleAvatarPress
            buttonArgs = [
                message.getSenderAvatarId(),
                useName]
        elif message.getSenderAccountId():
            buttonCommand = self.handlePlayerPress
            buttonArgs = [
                message.getSenderAccountId(),
                useName]

        if message.getTalkType() == INFO_GUILD and message.getReceiverAvatarId():
            wantTwoNames = True
        else:
            wantTwoNames = False
        if wantTwoNames:
            buttonCommand2 = self.handleAvatarPress
            buttonArgs2 = [
                message.getReceiverAvatarId(),
                useName2]

        nameArray = ('' + MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName + '', '' + MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName + '', '' + MESSAGE_OVER_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName + '', '' + MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName + '')
        nameButton = DirectButton(parent = NodePath(), relief = None, text = nameArray, text_align = TextNode.ALeft, text_pos = (0.0, 0.0), text_shadow = self.shadowColor, text_shadowOffset = self.shadowOffset, text_font = self.nameFont, textMayChange = 0, command = buttonCommand, extraArgs = buttonArgs)
        (left, right, bottom, top) = nameButton.getBounds()
        nameGFX = TextGraphic(nameButton, left, right, 0, 1)
        buttonName = '%s%s' % (message.getTalkType(), useName)
        tpMgr.setGraphic(buttonName, nameGFX)
        if wantTwoNames:
            nameArray2 = ('' + MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName2 + '', '' + MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName2 + '', '' + MESSAGE_OVER_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName2 + '', '' + MESSAGE_COLOR_TABLE[message.getTalkType()][self.fontColorStyle] + '' + useName2 + '')
            nameButton2 = DirectButton(parent = NodePath(), relief = None, text = nameArray2, text_align = TextNode.ALeft, text_pos = (0.0, 0.0), text_shadow = self.shadowColor, text_shadowOffset = self.shadowOffset, text_font = self.nameFont, textMayChange = 0, command = buttonCommand2, extraArgs = buttonArgs2)
            (left, right, bottom, top) = nameButton2.getBounds()
            nameGFX2 = TextGraphic(nameButton2, left, right, 0, 1)
            buttonName2 = '%s%s' % (message.getTalkType(), useName2)
            tpMgr.setGraphic(buttonName2, nameGFX2)

        del tpMgr
        self.lineDict[message.getMessageId()] = (message, nameButton, buttonName)
        if nameButton:
            messageName = '' + buttonName + ''
            if wantTwoNames:
                messageName2 = '' + buttonName2 + ''

        else:
            messageName = message.getSenderAvatarName() + ': '
        messageBody = message.getBody()
        chatString = ''
        if '%s' in message.getBody() and message.getTalkType() == INFO_OPEN:
            someMessage = message.getBody() % messageName
        elif '%s' in message.getBody() and message.getTalkType() == INFO_GUILD:
            if wantTwoNames:
                if extraInfo:
                    someMessage = message.getBody() % (messageName, messageName2, extraInfo[0])
                else:
                    someMessage = message.getBody() % (messageName, messageName2)
            elif extraInfo:
                someMessage = message.getBody() % (messageName, extraInfo[0])
            else:
                someMessage = message.getBody() % messageName
        else:
            someMessage = messageName + message.getBody()
        chatCode = MESSAGE_STYLE_TABLE[message.getTalkType()][self.fontColorStyle]
        self.wordWrapper.setText(someMessage)
        wrappedText = self.wordWrapper.getWordwrappedText().split('\n')
        tab = '    '
        for i in range(len(wrappedText)):
            if i == 0:
                if chatCode:
                    wrappedText[i] = '' + chatCode + '' + wrappedText[i] + ''

            elif i > 0:
                wrappedText[i] = '    ' + '' + chatCode + '' + wrappedText[i] + ''

            if i < len(wrappedText) - 1:
                wrappedText[i] += '\n'
                continue

        for text in wrappedText:
            chatString += text

        return chatString


    def clearText(self):
        tpMgr = TextPropertiesManager.getGlobalPtr()
        for key in self.lineDict:
            (message, nameButton, buttonName) = self.lineDict[key]
            nameButton.destroy()
            tpMgr.clearGraphic(buttonName)

        self.renderedLineDict = { }
        self.lineDict = { }
        del tpMgr


    def regenText(self):
        self.clearText()
        self.updateDisplay()


    def regenLineCountList(self):
        self.runningLineCount = 0
        self.runningLineCountLastId = -1
        self.lineCountList = [
            0]
        allMessages = base.talkAssistant.getAllCompleteText()
        for message in allMessages:
            self.wordWrapper.setText(self.getMessageTagText(message) + message.getBody())
            wrappedText = self.wordWrapper.getWordwrappedText()
            if message.getMessageId() > self.runningLineCountLastId:
                self.runningLineCountLastId = message.getMessageId()

            for mline in wrappedText.split('\n'):
                self.lineCountList.append(message.getMessageId())
                self.runningLineCount += 1




    def putText(self, startLine, numLines):
        startMessage = self.lineCountList[startLine]
        messageList = [] #base.talkAssistant.getCompleteTextFromRecent(self.NumVisible, startMessage)
        displayText = []
        tpMgr = TextPropertiesManager.getGlobalPtr()
        lineHeight = self.chatFont.getLineHeight()
        self.renderedLines = []
        messageIdList = []
        for message in messageList:
            if base.cr.avatarFriendsManager.checkIgnored(message.getSenderAvatarId()):
                continue

            messageIdList.append(message.getMessageId())
            if not self.renderedLineDict.get(message):
                msg = self.decodeOpenMessage(message)
                messageRenderedLines = []
                self.renderedLineDict[message] = messageRenderedLines
                for mline in msg.split('\n'):
                    self.chatTextRender.setText(mline)
                    newLine = self.chatTextRender.generate()
                    messageRenderedLines.append(newLine)


            self.renderedLines = self.renderedLineDict[message] + self.renderedLines
            if len(self.renderedLines) >= self.NumVisible:
                break
                continue

        removeIds = []
        removeRendered = []
        for key in self.lineDict:
            if key not in messageIdList:
                (message, nameButton, buttonName) = self.lineDict[key]
                nameButton.destroy()
                tpMgr.clearGraphic(buttonName)
                removeIds.append(key)
                removeRendered.append(message)
                continue

        for message in removeRendered:
            self.renderedLineDict.pop(message)

        for key in removeIds:
            self.lineDict.pop(key)

        self.renderedLines = self.renderedLines[-(self.NumVisible):]
        self.chatDisplayNP.getChildren().detach()
        z = -lineHeight * (self.NumVisible - len(self.renderedLines))
        for rline in self.renderedLines:
            np = self.chatDisplayNP.attachNewNode(rline)
            np.setZ(z)
            z -= lineHeight

        del tpMgr
        self.updateRange()


    def _ChatPanel__handleOpenMessage(self, message):
        self.index = 0
        if message.getMessageId() > self.runningLineCountLastId:
            self.runningLineCountLastId = message.getMessageId()
            self.wordWrapper.setText(self.getMessageTagText(message) + message.getBody())
            wrappedText = self.wordWrapper.getWordwrappedText()
            for mline in wrappedText.split('\n'):
                self.lineCountList.append(message.getMessageId())
                self.runningLineCount += 1


        self.updateDisplay()
        self.unfadeText()
        if self.getCurrentOrNextState() == 'Standby':
            self.startFadeTextTimer()



    def _ChatPanel__handleGlobalGuiShow(self):
        if self._ChatPanel__showLines:
            self.chatDisplayNP.showThrough()



    def _ChatPanel__handleGlobalGuiHide(self):
        if self.linesShown:
            self.chatDisplayNP.show()



    def _ChatPanel__showLines(self):
        self.linesShown = True
        if base.showGui:
            self.chatDisplayNP.showThrough()
        else:
            self.chatDisplayNP.show()


    def _ChatPanel__hideLines(self):
        self.linesShown = False
        self.chatDisplayNP.hide()


    def updateDisplay(self):
        if hasattr(base, 'talkAssistant'):
            self.putText(self.index, self.NumVisible)



    def updateRange(self):
        numLines = self.runningLineCount
        if self.getCurrentOrNextState() != 'Tall':
            self.index = 0
            return None

        maxRange = self.runningLineCount - int(self.NumVisible * 0.66000000000000003)
        maxRange = max(maxRange, 0)
        if maxRange:
            if self.getCurrentOrNextState() == 'Tall':
                self.slider.show()

            self.slider['range'] = (0, maxRange)
            self.index = min(self.index, self.slider['range'][1])
            self.index = max(self.index, self.slider['range'][0])
        else:
            self.slider.hide()
            self.index = 0


    def scrollList(self):
        index = int(self.slider.getValue())
        if self.index != index:
            self.index = index
            self.updateDisplay()



    def enableCrewChat(self):
        self.chatBar.refreshTabStates()


    def disableCrewChat(self):
        self.chatBar.refreshTabStates()


    def enableGuildChat(self):
        self.chatBar.refreshTabStates()


    def disableGuildChat(self):
        self.chatBar.refreshTabStates()


    def disableShipPVPChat(self):
        self.chatBar.refreshTabStates()


    def enableShipPVPChat(self):
        self.chatBar.refreshTabStates()


    def enableWhiteListChat(self):
        self.chatBar.enableWhiteListChat()


    def disableWhiteListChat(self):
        self.chatBar.disableWhiteListChat()


    def checkEmotes(self):
        for id in PLocalizer.EmoteCommands.values():
            if type(id) == type((0,)):
                continue



    def hide(self):
        self.holdLinesShown = self.linesShown
        NodePath.hide(self)
        self._ChatPanel__hideLines()


    def show(self):
        DirectFrame.show(self)
        if self.holdLinesShown:
            self._ChatPanel__showLines()



    def handleAvatarPress(self, avId, avName):
        if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
            base.localAvatar.guiMgr.handleAvatarDetails(avId, avName)



    def handlePlayerPress(self, pId, pName):
        if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
            base.localAvatar.guiMgr.handlePlayerDetails(pId, pName)