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

📄 sendclusterimwindow.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
    protected int getShellStyle() {
        return SWT.SHELL_TRIM;
    }
    
    /**
     * 设置窗口激活
     */
    public void setActive() {
        getShell().setActive();
    }
    
    /**
     * 设置最小化状态
     * 
     * @param b
     */
    public void setMinimized(boolean b) {
        getShell().setMinimized(b);
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#open()
     */
    public int open() {
        int ret = super.open();
		// 设置输入框获得焦点,设置输入框的字体和颜色
		inputBox.setFocus();
		if(main.getDefaultStyle() != null)
			inputBox.setDefaultStyle(main.getDefaultStyle());
		// 添加自己为QQ listener
        main.getClient().addQQListener(this);
		// 得到在线成员
		if(model.isPermanent())
		    main.getClient().getClusterOnlineMember(model.getClusterId());
        return ret;
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getInitialSize()
     */
    protected Point getInitialSize() {
        return new Point(470, 430);
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
     */
    protected Point getInitialLocation(Point initialSize) {
		// 缺省实现是把窗口居中
		Rectangle displayRect = main.getDisplay().getClientArea();
		return new Point((displayRect.width - initialSize.x) / 2, (displayRect.height - initialSize.y) / 2);
    }

    /**
     * @param c
     * 		群model
     * @param im
     * 		群消息结构
     * @param me
     * 		true表示是我自己
     */
    public void appendMessage(ClusterModel c, ClusterIM im, boolean me) {
        date.setTime(im.sendTime);
        FriendModel f = c.getMember(im.sender);
        String name = (f == null) ? String.valueOf(im.sender) : f.getName();
		outputBox.appendText('(' + name + ")  " + df.format(date), me ? myStyle : otherStyle);
		LineStyle style = getLineStyle(im);
		outputBox.appendText(im.message, style);
    }
    
	/**
	 * 设置已经发送的消息,这个方法只用在聊天模式时
	 * @param name 发送消息的人的昵称
	 * @param msg 消息内容
	 * @param date 消息发送时间
     * 		true表示是我自己
	 */
	private void appendMessage(String name, String msg, Date date) {
		outputBox.appendText('(' + name + ")  " + df.format(date), myStyle);		
		outputBox.appendText(msg, getLineStyle(main.getDefaultStyle()));
	}
	
	/**
	 * 在输出框中添加提示信息
	 * 
	 * @param hint
	 * @param style
	 */
	private void appendHint(String hint, LineStyle style) {
	    outputBox.appendText(hint, style);
	}

    /**
     * 刷新群头像和群名称
     * 
     * @param image
     */
    public void refreshClusterInfo() {
        setClusterNameLabel();
        listViewer.refresh();
        
        Map members = model.getMembers();
        int online = 0;
        Iterator i = members.values().iterator();
        while(i.hasNext()) {
            FriendModel f = (FriendModel)i.next();
            if(f.isOnline() || f.isAway())
                online++;
        }        
        setListLabel(members.size(), online);
    }

    /**
     * @return
     * 		true表示当前窗口是活动窗口
     */
    public boolean isActive() {
        return active;
    }
    
    /**
	 * 打开与某个成员的聊天窗口
	 * 
	 * @return 
	 * 		打开的窗口对象,可能为ReceiveMessageShell, 也可能为SendMessageShell
	 */
	protected Object openMemberMessageShell() {
	    IStructuredSelection selection = (IStructuredSelection)listViewer.getSelection();	    
		if(!selection.isEmpty()) {
			FriendModel f = (FriendModel)selection.getFirstElement();
			// 在现在的好友中查找这个model
			FriendModel f2 = main.getMVCHelper().getFriendModel(f.getQQ());
			// 如果找到model为null,说明这个人不是我的好友了,为了界面上的一致
			//     性,把这个人添加到陌生人再打开窗口。否则,这个人肯定已经在model中
			//     ,直接打开窗口
			if(f2 == null) {
				/* 否则这个人还不是我的好友, */
				f2 = f;
				int[] stranger = main.getMVCHelper().listStrangerGroup();
				if(stranger != null && stranger.length > 0) {
					main.getModel().addItem(stranger[0], f);
					main.getShutter().refreshTabView(stranger[0]);
				}
			}
			return main.getShellLauncher().openNormalIMWindow(f2);
		}
		return null;
	}
	
	/**
	 * 发送群消息
	 * @param string
	 */
	protected void sendMessage(String s) {
	    // 检查消息是否为空
	    if(s.length() == 0) {
	        MessageDialog.openWarning(getShell(), LumaQQ.getString("message.box.common.warning.title"), LumaQQ.getString("message.box.cannot.send.empty.message"));
	        return;
	    }
	    // 判断用户是否登录
		if(main.getClient().getUser().isLoggedIn()) {
		    workflow.setOriginalMessage(s);
		    workflow.start();
		} else {
		    MessageDialog.openWarning(getShell(), LumaQQ.getString("message.box.common.warning.title"), LumaQQ.getString("message.box.please.login.first"));
		}
	}
    
    /**
     * 显示记录控件
     */
    private void showRecord() {
        GridData gd = (GridData)viewer.getLayoutData();
        Shell shell = getShell();
        if(gd.heightHint == 0) {
            gd.heightHint = 200;
            viewer.setVisible(true);
            viewer.refreshRecord(false);
			if(!shell.getMaximized()) {						    
				Point p = shell.getSize();
				shell.setSize(p.x, p.y + 200);
			}
        } else {
            viewer.setVisible(false);
            gd.heightHint = 0;	
            if(!shell.getMaximized()) {
				Point p = shell.getSize();
				shell.setSize(p.x, p.y - 200);						    
			}                    
        }
        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_GET_CLUSTER_INFO_FAIL:
			case QQEvent.QQ_GET_MEMBER_INFO_FAIL:
			case QQEvent.QQ_GET_ONLINE_MEMBER_FAIL:
			case QQEvent.QQ_GET_TEMP_CLUSTER_INFO_FAIL:
				processClusterCommandFail(e);
				break;
			default:
		        workflow.delegateQQEvent(e);
				break;
		}
    }

    /**
	 * <pre>
	 * 处理群命令失败事件:失败时,弹出一个对话框提示,如果错误类型表示自己已经不是这个群的
	 * 成员,则移除这个群
	 * </pre>
	 * @param e
	 */
	private void processClusterCommandFail(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		if(packet.clusterId == model.getClusterId()) {
			main.getDisplay().asyncExec(new Runnable() {
				public void run() {
				    MessageDialog.openError(main.getShell(), LumaQQ.getString("message.box.common.fail.title"), packet.errorMessage);
				}				
			});			
		}
	}
    
    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.events.IFaceSelectionListener#faceSelected(edu.tsinghua.lumaqq.ui.IImageProvider, int, int)
     */
    public void faceSelected(IImageProvider provider, int group, int sequence) {
        if(group == 0) {
            int index = icons.getFaceCode(sequence);
            if(index != -1)
                inputBox.insertImage(IRichContent.DEFAULT_FACE_TAG, index);
        } else {
            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);
        }
    }
    
    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.ui.IIMSender#send(java.lang.String)
     */
    public void send(String msg) {
	    // 发送	    
	    LineStyle style = main.getDefaultStyle();
		if(model.getExternalId() == 0)
		    main.getClient().sendTempClusterIM(
		            model.getType(), 
		            model.getClusterId(), 
		            model.getExternalId(), 
		            msg, 
		            workflow.getMessageId(), 
		            workflow.getTotalFragments(), 
		            workflow.getCurrentFragment(),
		            style.fontName,
		            (style.fontStyle & SWT.BOLD) != 0,
		            (style.fontStyle & SWT.ITALIC) != 0,
		            false,
		            style.fontSize,
		            style.foreground.getRed(),
		            style.foreground.getGreen(),
		            style.foreground.getBlue());
		else
		    main.getClient().sendClusterIM(
		            model.getClusterId(),
		            msg,
		            workflow.getMessageId(), 
		            workflow.getTotalFragments(), 
		            workflow.getCurrentFragment(),
		            style.fontName,
		            (style.fontStyle & SWT.BOLD) != 0,
		            (style.fontStyle & SWT.ITALIC) != 0,
		            false,
		            style.fontSize,
		            style.foreground.getRed(),
		            style.foreground.getGreen(),
		            style.foreground.getBlue());
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.ui.IIMSender#notifyOver()
     */
    public void notifyOver() {
        main.getDisplay().syncExec(enableRunnable);
    }
    
    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.ui.IIMSender#notifyStart(java.lang.String)
     */
    public void notifyStart(String toBeSent) {
	    // 设置输入框暂时不可写
	    inputBox.setReadonly(true);
	    inputBox.setBackground(Colors.READONLY_BACKGROUND);	    
		// 保存到聊天记录中
		date.setTime(System.currentTimeMillis());
		main.getMessageManager().saveMessage(model.getClusterId(), model.getClusterId(), main.getMyModel().getQQ(), toBeSent, (int)(date.getTime() / 1000));
		// 清空发送框
		inputBox.clear();
		// 把发送的消息显示到输出框中
		appendMessage((String)main.getMyModel().getProperty(INode.NAME), toBeSent, date);
    }
    
    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.ui.IIMSender#notifyFail(java.lang.String)
     */
    public void notifyFail(String msg) {
	    main.getDisplay().syncExec(enableRunnable);
		appendRunnable.hint = msg;
	    main.getDisplay().syncExec(appendRunnable);
    }
    
    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.ui.IIMSender#notifyTimeout(java.lang.String)
     */
    public void notifyTimeout(String failToSent) {
	    main.getDisplay().syncExec(enableRunnable);
		appendRunnable.hint = LumaQQ.getString("cluster.im.hint.timemout", new Object[] { failToSent });
	    main.getDisplay().syncExec(appendRunnable);
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.ui.IIMSender#getSenderId()
     */
    public int getSenderId() {
        return model.getClusterId();
    }
}

⌨️ 快捷键说明

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