⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tempsessionimwindow.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
     */
    public void startBlinkImage() {
        if(!blinkRunnable.isStop()) return;
        blinkRunnable.setStop(false);
        main.getDisplay().timerExec(0, blinkRunnable);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getShellStyle()
     */
	@Override
    protected int getShellStyle() {
		int onTop = main.getOptionHelper().isIMOnTop() ? SWT.ON_TOP : SWT.NONE;
		if(LumaQQ.IS_GTK)
			return SWT.NO_TRIM | SWT.NO_BACKGROUND | onTop;
		else
			return SWT.SHELL_TRIM | onTop;
    }
    
    /**
     * 设置窗口激活
     */
    public void setActive() {
        getShell().setActive();
    }
    
    /**
     * 设置最小化状态
     * 
     * @param b
     */
    public void setMinimized(boolean b) {
        getShell().setMinimized(b);
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#open()
     */
	@Override
    public int open() {
        int ret = super.open();
		// 设置输入框获得焦点,设置输入框的字体和颜色
		inputBox.setFocus();
		if(main.getDefaultStyle() != null)
			inputBox.setDefaultStyle(main.getDefaultStyle());
		// 添加自己为QQ listener
        main.getClient().addQQListener(this);
        return ret;
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#constrainShellSize()
     */
	@Override
    protected void constrainShellSize() {
        if(model.talkMode)
            getShell().setSize(470, 430);
        else
            getShell().setSize(440, 340);
        
		Point loc = new Point(50, 50);
		int x = model.windowX;
		int y = model.windowY;
		if(x > 0) loc.x = x;
		if(y > 0) loc.y = y;
		getShell().setLocation(loc);
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
     */
	@Override
    protected Point getInitialLocation(Point initialSize) {
		Point loc = new Point(50, 50);
		int x = model.windowX;
		int y = model.windowY;
		if(x > 0) loc.x = x;
		if(y > 0) loc.y = y;
		return loc;
	}

    /**
     * 追加消息到输出框
     * 
     * @param f
     * @param im
     * @param header
     */
    public void appendMessage(User f, TempSessionIM im) {
		outputBox.appendText('(' + DefaultFace.escapeFaces(f.displayName) + ")  " + DateTool.format(im.time), otherStyle);
		LineStyle style = getLineStyle(im.fontStyle);
		outputBox.appendText(im.message, style);
    }
    
    /**
     * 往输出框追加消息
     * 
     * @param entry
     * 		RecordEntry
     */
    private void appendMessage(RecordEntry entry) {
		outputBox.appendText('(' + DefaultFace.escapeFaces(main.getMyModel().displayName) + ")  " + DateTool.format(entry.time), myStyle);		
		outputBox.appendText(entry.message, getLineStyle(main.getDefaultStyle()));
    }
	
	/**
	 * 在输出框中添加提示信息
	 * 
	 * @param hint
	 * @param style
	 */
	private void appendHint(String hint, LineStyle style) {
	    outputBox.appendText(hint, style);
	}

    /**
     * @return
     * 		true表示当前窗口是活动窗口
     */
    public boolean isActive() {
        return active;
    }
    
    /**
	 * 发送群消息
	 * @param string
	 */
	protected void sendMessage(String s) {
	    // 检查消息是否为空
	    if(s.length() == 0) {
	        MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_cannot_send_empty_message);
	        return;
	    }
	    // 判断用户是否登录
		if(main.getClient().getUser().isLoggedIn()) {
		    message = s;
			// 保存到聊天记录中
		    RecordEntry key = new RecordEntry();
		    key.owner = model.qq;
		    key.sender = main.getMyModel().qq;
		    key.senderParent = 0;
		    key.receiver = model.qq;
		    key.time = System.currentTimeMillis();
		    key.type = IKeyConstants.NORMAL;
		    key.message = message;
			main.getRecordManager().addRecord(key);
		    // 设置输入框暂时不可写
		    inputBox.setReadonly(true);
		    inputBox.setBackground(Colors.READONLY_BACKGROUND);

		    // 发送下一个分片
		    send();
			// 把发送的消息显示到输出框中
		    appendMessage(key);
			// 清空发送框
		    if(model.talkMode)
		        inputBox.clear();
		} else {
		    MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_please_login_first);
		}
	}
	
	/**
	 * 发送下一个分片
	 * 
	 * @return
	 * 		true表示发送成功,false表示已经没有更多分片需要发送
	 */
	private boolean send() {
	    // 发送	    
	    LineStyle style = main.getDefaultStyle();
	    main.getClient().sendTempSessionIM(
            model.qq,
            message,
            main.getMyModel().displayName,
            style.fontName,
            (style.fontStyle & SWT.BOLD) != 0,
            (style.fontStyle & SWT.ITALIC) != 0,
            false,
            style.fontSize,
            style.foreground.getRed(),
            style.foreground.getGreen(),
            style.foreground.getBlue());
		
		return true;
	}
    
    /**
     * 显示记录控件
     */
    private void showRecord() {
        GridData gd = (GridData)viewer.getLayoutData();
        Shell shell = getShell();
		if(gd.exclude) {
			gd.exclude = false;
			viewer.refreshRecord();
		} else {
			gd.exclude = true;
		}
        if(!shell.getMaximized()) {
			Point p = shell.getSize();
			shell.setSize(p.x, p.y + (gd.exclude ? -205 : 205));						    
		}  
		viewer.setVisible(!gd.exclude);
        viewer.getParent().layout();
        shell.layout();
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.events.IQQListener#qqEvent(edu.tsinghua.lumaqq.qq.events.QQEvent)
     */
    public void qqEvent(QQEvent e) {
		switch(e.type) {
			case QQEvent.QQ_SEND_TEMP_SESSOIN_IM_SUCCESS:
				processSendTempSessionIMSuccess(e);
		        break;
			case QQEvent.QQ_SEND_TEMP_SESSION_IM_FAIL:
				processSendTempSessionIMFail(e);
				break;
			case QQEvent.QQ_OPERATION_TIMEOUT:
				if(e.operation == QQ.QQ_CMD_TEMP_SESSION_OP)
					processSendTempSessionIMTimeout(e);
				break;		
		}
    }

	/**
	 * 处理发送临时会话消息失败事件
	 * @param e
	 */
	private void processSendTempSessionIMFail(QQEvent e) {
		final TempSessionOpReplyPacket packet = (TempSessionOpReplyPacket)e.getSource();
		if(packet.receiver == model.qq) {
			main.getDisplay().asyncExec(new Runnable() {
				public void run() {
					enableControl(packet.replyMessage);
				}						
			});
		}
	}

	/**
	 * 处理发送临时会话消息超时事件
	 * @param e
	 */
	private void processSendTempSessionIMTimeout(QQEvent e) {
		TempSessionOpPacket packet = (TempSessionOpPacket)e.getSource();
		if(packet.getReceiver() == model.qq) {
			main.getDisplay().syncExec(new Runnable() {
				public void run() {
				    inputBox.setReadonly(false);
				    inputBox.setBackground(Colors.WHITE);
					setMinimized(false);
					setActive();
					MessageDialog.openError(getShell(), message_box_common_fail_title, message_box_send_message_timeout);
				}						
			});	
		}
	}	

	/**
	 * 处理临时会话消息发送成功事件,主要是查找出是哪个窗口发送的这个消息,关闭之
	 * @param e
	 */
	private void processSendTempSessionIMSuccess(QQEvent e) {
		final TempSessionOpReplyPacket packet = (TempSessionOpReplyPacket)e.getSource();
		if(packet.receiver == model.qq) {
			main.getDisplay().asyncExec(new Runnable() {
				public void run() {
					enableControl(packet.replyMessage);
				}						
			});
		}
	}	
	
	/**
	 * 使能控件
	 * 
	 * @param message
	 */
	protected void enableControl(String message) {
	    if(!inputBox.isReadonly())
	        return;
        inputBox.setReadonly(false);
        inputBox.setBackground(Colors.WHITE);
        if(message != null && !message.equals(""))
        	appendHint(message, otherStyle);
	}

	/**
	 * 关闭窗口
	 */
	public void closeWindow() {
		getShell().close();
	}
	
	/**
	 * 设置消息发送窗口为聊天模式或者消息模式
	 * 
	 * @param b
	 * 		true表示为聊天模式
	 */
	public void setTalkMode(boolean b) {
		if(b) {
			model.talkMode = true;
			if(main.getOptionHelper().isUseEnterInMessageMode() != main.getOptionHelper().isUseEnterInTalkMode())
		        reinstallSendKey(main.getOptionHelper().isUseEnterInTalkMode());     
			sash.setVisible(true);
			outputForm.setLayoutData(new GridData(GridData.FILL_BOTH));
			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
			gd.heightHint = 100;
			inputForm.setLayoutData(gd);
			gd = (GridData)sash.getLayoutData();
			gd.heightHint = SWT.DEFAULT;
	        if(model.talkMode)
	            getShell().setSize(470, viewer.isVisible() ? 630 : 430);
	        else
	            getShell().setSize(440, viewer.isVisible() ? 540 : 340);
			inputForm.getParent().layout();
		} else {
			outputBox.clear();
			model.talkMode = false;
			if(main.getOptionHelper().isUseEnterInMessageMode() != main.getOptionHelper().isUseEnterInTalkMode())
		        reinstallSendKey(main.getOptionHelper().isUseEnterInMessageMode());   
			sash.setVisible(false);
			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
			gd.heightHint = outputForm.getTopLeft().getSize().y + 2;			
			outputForm.setLayoutData(gd);
			inputForm.setLayoutData(new GridData(GridData.FILL_BOTH));
			gd = (GridData)sash.getLayoutData();
			gd.heightHint = 0;
	        if(model.talkMode)
	            getShell().setSize(470, viewer.isVisible() ? 630 : 430);
	        else
	            getShell().setSize(440, viewer.isVisible() ? 540 : 340);
			inputForm.getParent().layout();
		}
	}	
	
	/**
     * 初始化当前文件传输任务菜单
     */
    private void initFileMenu() {
        fileMenu = new Menu(getShell(), SWT.POP_UP);
        // 缺省,无任务进行中
        MenuItem mi = new MenuItem(fileMenu, SWT.PUSH);
        mi.setText(menu_file_none);
    }
    
    /**
     * 设置焦点
     */
    public void setFocus() {
        getShell().setFocus();
    }

    /**
     * @return
     * 		true表示聊天模式
     */
    public boolean isTalkMode() {
        return model.talkMode;
    }
    
	/**
     * 打开表情选择窗口
     */
    private void openImageSelectionShell(Point loc) {
    	ImageSelector fss = new ImageSelector(getShell(), new FaceImageAdvisor(main));
    	fss.setListener(this);
		fss.setLocation(loc);
		fss.open();	
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.events.IFaceSelectionListener#faceSelected(edu.tsinghua.lumaqq.ui.IImageProvider, int, int)
     */
    public void faceSelected(IImageSelectorAdvisor provider, int group, int sequence) {
        if(group == 0) {
            int index = res.getFaceCode(sequence);
            if(index != -1)
                inputBox.insertImage(IRichContent.DEFAULT_FACE_TAG, index);
        } else {
            MessageDialog.openInformation(getShell(), message_box_common_info_title, message_box_face_to_user);
            /*
             * 暂时还不支持向单个用户发送自定义表情,注释掉这些代码
             */
//            FaceUtil util = FaceUtil.getInstance();
//            Face face = util.getFace(group - 1, sequence);
//            if(face == null)
//                return;
//            int id = Util.getInt(face.getId(), -1);
//            if(id == -1)
//                return;
//            inputBox.insertImage(IRichContent.CUSTOM_FACE_TAG, id);
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -